我刚刚意外地发现,执行此GetModuleHandle("ntdll.dll")
时没有事先致电LoadLibrary("ntdll.dll")
。
这意味着我的流程中已加载ntdll.dll
。
是否可以安全地假设永远会在Win32应用程序上加载ntdll.dll
,以便不需要调用LoadLibrary
?
答案 0 :(得分:5)
来自MSDN on LoadLibrary()(强调我的):
系统维护所有已加载的每进程引用计数 模块。调用LoadLibrary会增加引用计数。调用 FreeLibrary或FreeLibraryAndExitThread函数递减 引用计数。系统在引用计数时卸载模块 达到零或过程终止时(无论如何) 参考计数)。
换句话说,继续调用LoadLibrary()并确保让你的ntdll.dll
句柄安全 - 但系统几乎肯定会碰到引用计数,因为它应该已经加载了。
至于“它是否真的总是加载?”,请参阅Windows Internals on the Image Loader(简短的回答是肯定的,ntdll.dll
是加载器本身的一部分,并且始终存在)。
相关段落是:
图像加载器位于用户模式系统DLL Ntdll.dll 中,而不是内核库中。因此,它的行为就像标准代码,它是DLL的一部分,并且在内存访问和安全权限方面受到相同的限制。使这段代码与众不同的是保证它始终存在于正在运行的进程中( Ntdll.dll始终加载)并且它是在用户模式下运行的第一段代码,作为一个新的申请。 (当系统构建初始上下文时,程序计数器或指令指针被设置为Ntdll.dll内的初始化函数。)