2

我正在使用SymEnumSymbols将所有匹配符号获取到给定掩码,并使用 CALLBACK 函数将它们推送到向量中。问题是,符号名称(在PSYMBOL_INFO结构内部)只是函数的名称,而不是整个签名。例如,我有这个函数:

TestMe!GetImageProcAddress (struct HINSTANCE__ *hi, int num)

当我SymEnumSymbols使用 mask调用"TestMe!GetImageProcAddress"并打印匹配符号的名称时,我得到:

printf("%s\n", pSymInfo->Name); // Prints: GetImageProcAddress

但我希望它打印其中之一:

TestMe!GetImageProcAddress (struct HINSTANCE__ *, int)
GetImageProcAddress (struct HINSTANCE__ *, int)

所以我的问题 - 有没有办法获得完整的符号签名(函数名称+参数类型)?我能够使用SymSetContext, 然后SymEnumSymbols使用标志来迭代参数SYMFLAG_PARAMETER- 但我不知道如何获取参数的类型..

谢谢!

4

1 回答 1

2

经过长时间的搜索 - 我找到了解决方案。获取函数的索引后,您需要通过使用将上下文设置为特定函数地址来枚举其参数SymSetContext,然后调用SymEnumSymbols(并将其设置为使用上下文):

SymEnumSymbols(GetCurrentProcess(), 0, NULL, ...)

然后,通过使用该标志SYMFLAG_PARAMETER,您可以只选择函数参数。现在,使用参数TypeIndex,您可以通过调用(很多次)来搜索参数类型SymGetTypeInfo。这并不简单,而且有很多基本案例......

可以在这里找到一个非常好的解释: 如何使用 DBGHELP 访问类型信息

可以在这里找到一个示例: TYPEINFODUMP

祝你好运!

于 2015-08-31T15:09:11.177 回答