Я пытаюсь использовать функцию SymEnumSymbols
внутри метода, определенного dllexport.Для SymEnumSymbols
требуется специальный аргумент PSYM_ENUMERATESYMBOLS_CALLBACK
, но когда я пытаюсь создать этот обратный вызов, у меня возникают некоторые ошибки (кстати, Visual Studio 2017).
Я использовал эту страницу из Windows Dev Denter: https://docs.microsoft.com/en-us/windows/desktop/api/dbghelp/nc-dbghelp-psym_enumeratesymbols_callback чтобы узнать, как определить этот уникальный обратный вызов и вставить его в мой код:
#include <windows.h>
#include <dbghelp.h>
// and other includes....
#define HOOKERDLL_API __declspec(dllexport)
/* copy-paste from Windows Sev Center... */
PSYM_ENUMERATESYMBOLS_CALLBACK PsymEnumeratesymbolsCallback;
BOOL PsymEnumeratesymbolsCallback(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext
)
{
return 0;
}
// I added the function that call 'symEnumSymbols' just in case...
//any way currently no callback is sent and I need to specify 'malloc' and implement other stuff,
//and without the previous callback definitions build succeed....
// count the 'malloc' and 'free' symbols in it using 'SymInitialize' and'SymEnumSymb'
extern "C" HOOKERDLL_API void countMallocFree()
{
printf("Hello from dll: countMallocFree!\n");
// Retrieves a pseudo handle for the current process.
HANDLE thisProc = GetCurrentProcess();
// Initializes the symbol handler for a process.
if (!SymInitialize(thisProc, NULL, 1)) // might need to change '1' to 'true'
{
printf("SymIntialize failed :-(\n");
return;
}
printf("SymIntialize succeeded :-)\n");
//Enumerates all symbols in a process.
if (!SymEnumSymbols(
thisProc, // handler to the process.
0,
"*!*", // combination of the last two lines means: Enumerate every symbol in every loaded module - we might change this...
NULL, // TODO: implement CALLBACK and send it here.
NULL // argument for the callback.
))
{
printf("SymEnumSymbols failed :-(\n");
return;
}
printf("SymEnumSymbols succeeded :-)\n");
}
Когда я пытался построить, я получил следующие ошибки:
declaration is incompatible with "BOOL PsymEnumeratesymbolsCallback(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)"
declaration is incompatible with "PSYM_ENUMERATESYMBOLS_CALLBACK PsymEnumeratesymbolsCallback"
'PsymEnumeratesymbolsCallback': redefinition; previous definition was 'data variable'
Поскольку я использовалтот же код, что и в руководстве, и функция countMallocFree
не является источником проблемы (потому что без определений обратного вызова сборка завершается успешно). Мне кажется, я что-то упускаю из-за поведения dll ...
Спасибо за любую помощь!