Win32应用程序是否自动链接到ntdll.dll?

Get*_*ree 3 windows dll winapi loadlibrary ntdll

我刚刚意外地发现这样做GetModuleHandle("ntdll.dll")没有事先调用LoadLibrary("ntdll.dll").

这意味着ntdll.dll已在我的进程中加载​​.

是否可以安全地假设ntdll.dll将始终加载到Win32应用程序上,以便LoadLibrary不需要调用?

NuS*_*ler 5

LoadLibrary()上的MSDN(强调我的):

系统在所有已加载的模块上维护每个进程的引用计数.调用LoadLibrary会增加引用计数.调用FreeLibrary或FreeLibraryAndExitThread函数会减少引用计数.系统在其引用计数达到零或进程终止时(无论引用计数如何)卸载模块.

换句话说,继续调用LoadLibrary()并确保让您的句柄ntdll.dll安全 - 但系统几乎肯定会碰到引用计数,因为它应该已经加载.

至于"它是否真的总是加载?",请参阅Image Loader上的Windows Internals(简短答案是肯定的,它ntdll.dll是加载器本身的一部分,并且始终存在).

相关段落是:

映像加载器位于用户模式系统DLL Ntdll.dll中,而不是内核库中.因此,它的行为就像标准代码,它是DLL的一部分,并且在内存访问和安全权限方面受到相同的限制.使这段代码与众不同的是保证它始终存在于正在运行的进程中(Ntdll.dll总是被加载)并且它是作为新应用程序的一部分在用户模式下运行的第一段代码.(当系统构建初始上下文时,程序计数器或指令指针设置为Ntdll.dll内的初始化函数.)