несовместимое объявление для функции обратного вызова dbghelp - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь использовать функцию 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 ...

Спасибо за любую помощь!

...