Оно работает. Спасибо, ты спасатель жизни @geza.

исал инструментальный инструмент на C ++ для регистрации функций входа и выхода, подключая вызовы входа и выхода. Он работает, как и предполагалось, с устаревшей кодовой базой. Однако при подключении к проекту, который я скачал из git, адреса функций, которые я сохраняю в переменной extern в коде темы, они отличаются в библиотеке профилировщика. Это путает сравнение указателя функции между подключенными и сохраненными функциями.

Адрес функции в основном файле кода объекта, точка останова находится внутри функции ловушки _penter в коде профилировщика

Эта же запись показывает другой адрес с «_» перед именем функции в коде профилировщика.

Я понятия не имею, как это меняет адреса, и хочу знать, если я делаю что-то не так.

То, как я это делаю, так это то, что у меня есть внешний массив указателей на функции (и их имена), который инициализируется ссылками на функции кода субъекта в основном файле субъекта (где доступны все функции). В функции ловушки (_penter) библиотеки я получаю адрес только что введенной функции. Поэтому я сравниваю его с адресами в массиве extern, и, если это совпадение, я записываю введенную функцию.

SNIPPET FROM PROFILE.H (профилировщик)

extern Signature FuncTable[3000]; 

SNIPPET FROM PROFILE.CPP (профилировщик)

void _stdcall EnterFunc0(unsigned * pStack)
{
    void      * pCaller;
    pCaller = (void *)(pStack[0] - 5); // the instruction for calling _penter is 5 bytes long
    Signature * funct = FuncTable; //the table that has references to functions and their names
    funct = FuncTable;
    while (funct->function)
    {
        //const BYTE * func = (const BYTE *)funct->function;
        if ((void *)(pStack[0] - 5) == (void *)(funct->function))
        {
            int a = 0;
            linesBuffer = linesBuffer + "Entering " + funct->signature + ";";
            linesBuffer = linesBuffer + "\n";
            WriteToFile(false); //function buffers 100kb before writing
            break;
        }
        funct++;
    }
}
extern "C" __declspec(naked) void __cdecl _penter()
{
    _asm
    {
        pushad              // save all general purpose registers
            mov    eax, esp     // current stack pointer
            add    eax, 32      // stack pointer before pushad
            push   eax          // push pointer to return address as parameter to EnterFunc0

            call   EnterFunc0

            popad               // restore general purpose registers
            ret                 // start executing original function
    }
}

SNIPPET FROM main.c (основной файл основного кода)

#include "../Profile/Profile.h"
Signature FuncTable[] = {
    { (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
    { NULL }
};

Ответы на вопрос(1)

Ваш ответ на вопрос