代码之家  ›  专栏  ›  技术社区  ›  smwikipedia

getmodulehandle()是如何工作的?

  •  7
  • smwikipedia  · 技术社区  · 14 年前

    我通过C/C++ +GT阅读Windows,它描述了GETMoMeChanle()API如下:

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

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

    非常感谢你的力量。

    3 回复  |  直到 13 年前
        1
  •  10
  •   swatkat    14 年前

    加载的模块信息在进程“peb”和名为的结构中作为链接列表进行维护。 PEB_LDR_DATA . 如果获得PEB指针,则可以遍历此列表并获取诸如dll名称、基地址、入口点、大小等信息。请查看以下页面:
    http://msdn.microsoft.com/en-us/library/aa813708.aspx
    http://www.codeproject.com/KB/threads/CmdLine.aspx

        2
  •  4
  •   Community CDub    7 年前

    我想确认(见 斯瓦特 ,在我的信息中, GetModuleHandle() 真的看看里面 Wine ReactOS (和) this )您将看到 获取模块句柄() . Wine和ReactOS的开发人员根据反汇编的结果反汇编了Windows的代码并实现了自己的代码。所以在大多数情况下,代码的作用与Windows代码相同。

    如果需要,可以实现自己的 获取模块句柄() 基础 VirtualAllocEx() 只有。看到我 old answer 详情。(如果您还不知道函数返回的句柄 获取模块句柄() 是内存中相应模块的地址,因此只需以任何方式查找当前进程内存中的dll即可。

        3
  •  4
  •   bmargulies    14 年前

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

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

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