Символы Функция обратного вызова перечисления вызывается более одного раза для одного и того же символа?
Я написал небольшую программу, которая использует библиотеку dbghelp для печати всех символов для некоторого исполняемого файла. Основная функция перечисления, которую я вызываю: SymEnumSymbols, которая должна получить обратный вызов, который будет вызываться для каждого символа. Я попытался запустить программу на kernel32.dll, и я столкнулся с 2 странными проблемами:
1) Есть символы, которые расположены в одном и том же адресе, но они равны во всех значениях полей структуры SYMBOL_INFO (кроме уникального поданного индекса) - так как я могу различить? (например: 0x6b814c23 -StringCopyWorkerW)
2) В некоторых случаях есть два символа с одинаковыми характеристиками в одном и том же адресе. (Когда я открыл файл в IDA, я увидел, что есть две экспортированные записи - но одна из них является функцией, а другая нет (например:WerGetFlag и WerGetFlagsWorker, которые находятся в 0x6b84c840).
Спасибо!
вот код:
#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>
BOOL CALLBACK EnumSymProc(PSYMBOL_INFO pSymInfo,ULONG SymbolSize,PVOID UserContext)
{
/* Print props of the current symbol */\
printf("%08x", pSymInfo->Address);
printf("|%d", pSymInfo->Tag);
printf("|%08x", pSymInfo->Flags);
printf("|%d", pSymInfo->TypeIndex);
printf("|%s\n", pSymInfo->Name);
return TRUE;
}
void main()
{
DWORD64 BaseOfDll=0;
DWORD currOpt = 0;
HANDLE hProcess = GetCurrentProcess();
SymInitialize(hProcess, NULL, FALSE);
BaseOfDll = SymLoadModule64(hProcess,NULL,"c:\\windows\\system32\\kernel32.dll",NULL,0,0);
SymEnumSymbols(hProcess, BaseOfDll, NULL, EnumSymProc, NULL);
SymUnloadModule64(hProcess, BaseOfDll);
SymCleanup(hProcess);
}