SymEnumSymbolsEx 函数用于枚举指定模块中的符号信息,提供了比 SymEnumSymbols 更灵活的功能。以下是 SymEnumSymbolsEx 函数的原型:
BOOL SymEnumSymbolsEx(
  HANDLE            hProcess,
  ULONG64           BaseOfDll,
  PCSTR             Mask,
  PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
  PVOID             UserContext,
  DWORD             Options
);

参数说明:
  •  hProcess: 目标进程的句柄,通常使用 GetCurrentProcess() 获取当前进程的句柄。

  •  BaseOfDll: 模块的基地址,即模块的加载地址。

  •  Mask: 符号名称的掩码,用于筛选符合条件的符号。

  •  EnumSymbolsCallback: 指向一个回调函数的指针,用于处理每个枚举到的符号信息。回调函数的原型为 BOOL CALLBACK EnumSymbolsCallback(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)。

  •  UserContext: 传递给回调函数的用户自定义数据。

  •  Options: 用于指定枚举符号的选项,例如是否包括未公开的符号等。常用的选项有 SYMBOL_OPTION_PUBLIC_ONLY 等。


回调函数的参数说明:
  •  pSymInfo: 指向 SYMBOL_INFO 结构的指针,包含符号信息。

  •  SymbolSize: 符号的大小。

  •  UserContext: 用户自定义数据。


EnumSymbolsCallback 函数返回 TRUE 表示继续枚举,返回 FALSE 表示停止枚举。

使用该函数需要首先初始化符号引擎,可以使用 SymInitialize 函数进行初始化。

以下是一个简单的示例:
#include <dbghelp.h>
#include <iostream>

BOOL CALLBACK EnumSymbolsCallback(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext) {
    std::cout << "Symbol Name: " << pSymInfo->Name << ", Address: 0x" << std::hex << pSymInfo->Address << std::endl;
    return TRUE;  // 继续枚举
}

int main() {
    // 初始化符号引擎
    SymInitialize(GetCurrentProcess(), NULL, TRUE);

    // 获取模块的基地址
    HMODULE hModule = GetModuleHandle(NULL);
    DWORD64 baseAddress = SymLoadModuleEx(GetCurrentProcess(), NULL, NULL, NULL, (DWORD64)hModule, 0, NULL, 0);

    // 枚举符号
    SymEnumSymbolsEx(GetCurrentProcess(), baseAddress, NULL, EnumSymbolsCallback, NULL, 0);

    // 卸载符号引擎
    SymCleanup();

    return 0;
}

这个示例演示了如何使用 SymEnumSymbolsEx 函数来枚举指定模块中的符号信息。回调函数 EnumSymbolsCallback 会被调用,输出每个符号的名称和地址。


转载请注明出处:http://www.pingtaimeng.com/article/detail/26301/Win32 API/Dbghelp.h/SymEnumSymbolsEx