模块信息

模块是可执行文件或 DLL。 每个进程都由一个或多个模块组成。 可以通过调用 EnumProcessModules 函数来检索进程的模块句柄列表。 此函数使用指定进程的模块句柄填充 HMODULE 值的数组。 第一个模块是可执行文件。 请记住,这些模块句柄很可能来自其他某个进程,因此不能将它们与 GetModuleFileName 等函数一起使用。 但是,可以使用 PSAPI 函数 从另一个进程获取有关模块的信息。

以下过程介绍如何从另一个进程获取模块信息。

从另一个进程获取模块信息

  1. 调用 GetModuleBaseName 函数。 此函数采用进程句柄和模块句柄作为输入,并使用模块 (的基名称填充缓冲区,例如,Kernel32.dll) 。 相关函数 GetModuleFileNameEx 采用与输入相同的参数,但返回模块 (的完整路径,例如,C:\Windows\System32\Kernel32.dll) 。
  2. 调用 GetModuleInformation 函数。 此函数采用进程句柄和模块句柄,并使用模块的加载地址、它占用的线性地址空间的大小以及指向其入口点的指针填充 MODULEINFO 结构。

如果应用程序需要当前进程的模块信息,则应使用 GetModuleFileName 函数而不是 PSAPI 模块函数。 这可通过两种方式帮助应用程序性能: GetModuleFileName 函数比 PSAPI 模块函数更高效;如果应用程序不使用任何 PSAPI 函数,应用程序可以避免加载psapi.dll。

GetModuleBaseNameGetModuleFileNameEx 函数主要用于调试器和必须从另一个进程提取模块信息的类似应用程序。 如果目标进程中的模块列表已损坏或尚未初始化,或者模块列表在函数调用期间因加载或卸载 DLL 而更改,则这些函数可能会失败或返回不正确的信息。