GetModuleHandle()如何工作?

我正在阅读<windows通过c / c ++>,它描述了GetModuleHandle()API如下:

当你调用这个函数的时候,你传递一个零终止的string,它指定了一个加载到调用进程的地址空间中的可执行文件或DLL文件的名字。 如果系统find指定的可执行文件或DLL名称 ,则GetModuleHandle将返回该可执行文件或DLL文件映像加载的基址。

我想知道系统在哪里查找文件名 ? 当我加载一些文件到我的进程地址空间,是否有一个集中的表来存储所有加载的文件的名称和他们的加载地址的映射? 如果我们根据string匹配进行search,是否有那么低的效率?

非常感谢你的insigts。

加载的模块信息作为进程PEB中的链接列表维护,名称为PEB_LDR_DATA 。 如果你得到的PEB指针,你可以遍历这个列表,并获得像DLL名称,基地址,入口点,大小等信息检查这些页面:
http://msdn.microsoft.com/en-us/library/aa813708.aspx
http://www.codeproject.com/KB/threads/CmdLine.aspx

它在加载器(动态链接器的Windows名称)的内部数据结构中查找。

GetmoduleeHandle仅适用于您在当前进程中加载​​的DLL。 只要加载器将DLL加载到进程中,它当然就会维护一个包含模块名称的数据结构。 无需访问文件系统。

LdrInitializeThunk在用户空间中运行以启动拉入DLL的过程。

我想确认(请参阅swatkat的答案),在我的信息中, GetmoduleeHandle()的实现真的看起来在Wine和ReactOS (和this )里面。 您将看到GetmoduleeHandle()的实现。 Wine和ReactOS的开发者反汇编Windows的代码,并根据反汇编的结果实现自己的代码。 所以这个代码在大多数情况下和Windows代码一样。

如果你想要的话,你只能实现你自己的VirtualAllocEx()GetmoduleeHandle()的实现。 看到我的旧答案的细节。 (如果您还不知道函数GetmoduleeHandle()返回的句柄是内存中相应模块的地址,那么只需要以任何方式查找当前进程的内存中的dll)。