DbgHelp - 获取完整的符号签名(函数名+参数类型)

DbgHelp - Get full symbol signature (function name + parameters types)

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

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

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

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

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

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

所以我的问题 - 有什么方法可以获得完整的符号签名(函数名称 + 参数类型)?我能够使用 SymSetContext 遍历参数,然后使用 SymEnumSymbols 并使用标志 SYMFLAG_PARAMETER 进行过滤 - 但我不知道如何获取参数的类型..

谢谢!

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

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

然后,通过使用标志 SYMFLAG_PARAMETER,您可以 select 只有函数参数。现在,使用参数 TypeIndex,您可以通过调用(多次)SymGetTypeInfo 来搜索参数类型。不简单,还有很多base case...

可以在这里找到一个非常好的解释: HOW TO USE DBGHELP TO ACCESS TYPE INFORMATION

可以在此处找到示例: TYPEINFODUMP

祝你好运!