GetModuleHandle()如何工作?

smw*_*dia 7 windows

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

当您调用此函数时,您传递一个以零结尾的字符串,该字符串指定加载到调用进程的地址空间中的可执行文件或DLL文件的名称.如果系统找到指定的可执行文件或DLL名称,GetModuleHandle将返回加载该可执行文件或DLL文件映像的基址.

我想知道系统在哪里查找文件名?当我将一些文件加载​​到我的进程地址空间时,是否有一些集中表来存储所有已加载文件的名称及其加载地址的映射?如果我们根据字符串匹配进行搜索,那么效率会低吗?

非常感谢你的诅咒.

swa*_*kat 11

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


bma*_*ies 5

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

GetModuleHandle仅适用于当前进程中已加载的DLL。每当加载程序将DLL加载到进程中时,它当然都会维护一个包含模块名称的数据结构。无需访问文件系统。

LdrInitializeThunk在用户空间中运行,以开始拉入DLL的过程。

  • 对于您原本出色的回答,我将稍作介绍。它是加载程序,而不是链接程序。加载程序是将二进制文件映射到内存中并进行修复的程序,链接程序从对象模块中创建二进制文件。 (4认同)