я использую SymEnumSymbols
чтобы получить все совпадающие символы для заданной маски и вставить их в вектор с помощью функции CALLBACK. Проблема в том, что имя символа (который находится внутри PSYMBOL_INFO
структура) это только имя функции, а не вся подпись. Например, у меня есть эта функция:
TestMe!GetImageProcAddress (struct HINSTANCE__ *hi, int num)
Когда я звоню SymEnumSymbols
с маской "TestMe!GetImageProcAddress"
и печатает имя соответствующего символа, я получаю:
printf("%s\n", pSymInfo->Name); // Prints: GetImageProcAddress
Но я хочу напечатать один из них:
TestMe!GetImageProcAddress (struct HINSTANCE__ *, int)
GetImageProcAddress (struct HINSTANCE__ *, int)
Поэтому мой вопрос — есть ли способ получить полную символьную подпись (имя функции + тип параметров)? Я был в состоянии перебрать параметры с помощью SymSetContext
, затем SymEnumSymbols
и фильтрация с флагом SYMFLAG_PARAMETER
— но я не знаю, как получить типы параметров ..
Спасибо!
После долгих поисков — я нашел решение.
После получения индекса функции вам нужно перечислить ее параметры, установив контекст для конкретного адреса функции, используя SymSetContext
, потом звоню SymEnumSymbols
(и установите его для использования контекста):
SymEnumSymbols(GetCurrentProcess(), 0, NULL, ...)
Затем с помощью флага SYMFLAG_PARAMETER
Вы можете выбрать только параметры функции. Теперь, используя параметр TypeIndex
Вы можете искать тип параметра, вызывая (много раз) SymGetTypeInfo
. Это не просто, и есть много базовых случаев …
Действительно хорошее объяснение можно найти здесь:
Как использовать DBGHELP для доступа к информации о типе
И пример можно найти здесь:
TYPEINFODUMP
Удачи!