我正在使用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
进行过滤 - 但我不知道如何获取参数的类型..
谢谢!
答案 0 :(得分:1)
经过长时间的搜索 - 我找到了解决方案。
获取函数的索引后,需要通过使用SymSetContext
将上下文设置为特定函数地址来枚举它的参数,然后调用SymEnumSymbols
(并将其设置为使用上下文) :
SymEnumSymbols(GetCurrentProcess(), 0, NULL, ...)
然后,通过使用标志SYMFLAG_PARAMETER
,您只能选择函数参数。现在,使用参数TypeIndex
,您可以通过调用(很多次)SymGetTypeInfo
来搜索参数类型。这并不简单,并且有很多基本情况......
这里可以找到一个非常好的解释: HOW TO USE DBGHELP TO ACCESS TYPE INFORMATION
可以在这里找到一个例子: TYPEINFODUMP
祝你好运!