【发布时间】:2017-09-22 21:04:15
【问题描述】:
我刚刚偶然发现这样做GetModuleHandle("ntdll.dll") 可以在没有之前调用LoadLibrary("ntdll.dll") 的情况下工作。
这意味着ntdll.dll 已经加载到我的进程中。
是否可以假设ntdll.dll 将始终加载到 Win32 应用程序上,从而无需调用 LoadLibrary?
【问题讨论】:
-
这是一个可能会更改的实现细节。您应该不直接使用 ntdll.dll 中的任何内容。但只要您这样做,Microsoft 只能在您正确执行此操作的情况下为您提供帮助。避免 LoadLibrary() 是没有意义的。
-
ntdll.dll 总是在所有进程中加载。它一直是并且永远是肯定的
-
这样想……你调用了GetModuleHandle()。 GetModuleHandle() 在 kernel32.dll 中,因此您的应用程序必须链接到它。如果您查看 kernel32.dll 的依赖关系,您会发现它依赖于 ntdll.dll。因此,如果您的应用程序必须加载 kernel32,那么它也必须加载 ntdll。但是,对于 ntdll 来说,这不足为奇,因为它是任何 Win32 进程的根。 kernel32 中有几个/许多函数是 ntdll 中函数的包装器。
-
@JoeWillcoxson - ntdll.dll 加载 before kernel.32 或任何其他 dll 的原因很深。当进程启动时,它必须从用户模式下的哪个地址开始执行?当新线程开始时 - 再次从用户模式的哪一点开始?当内核将异常传递给用户模式时 - 到哪个地址?当 Apc 执行时-这是用户模式下的第一条指令?当任何 Windows 消息来处理 - 再次第一个用户模式指令在哪里? ntdll.dll 保存从内核到用户模式的入口点。以及当进程开始执行时 - 谁在初始化用户模式空间,加载附加 dll,等等
-
这一切都是 ntdll.dll 做的。一些进程根本不使用 kernel32.dll。但是 ntdll.dll 总是由内核映射到进程空间
标签: windows winapi dll loadlibrary ntdll