Добрый день!
Добрый день. Я пишу библиотеку, которая встраивается в exe-файл, скомпилированный на watcom C в 1997 году.
Мне нужно, чтобы код игры вызывал функцию, которую я написал в этой библиотеке. Делаю я это следующим образом:
В Dll main вызывается
ReplaceFunctionCall(IncViewpos, OFF_DOMOVEMENTS_CALL_DRAWPARTS); //const int OFF_DOMOVEMENTS_CALL_DRAWPARTS = 0x42AC22;
void ReplaceFunctionCall(void (*function)(void), const int offset) {
// получаем указатель на функцию в виде int адреса
int pointer = (int)*function-offset-ASM_CALL_LEN; //const int ASM_CALL_LEN = 5;
// получаем указатель на функцию в виде int адреса
WriteProcessMemory(pHandle, (int*)(offset+ASM_BYTE_SHIFT), &pointer,sizeof(int), NULL); //const int ASM_BYTE_SHIFT = 1;
// теперь у нас по адресу offset машинная команда E8 XX XX XX XX, где последние 4 байта указывают на вызов функции IncViewpos
}
Сама же функция IncViewpos и обратный вызов выглядят так
void IncViewpos() {
viewpos.X = actorpos.X;
viewpos.Y = actorpos.Y;
viewpos.Z = actorpos.Z;
CallFunctionOffset(OFF_CALCULATEVIEWMATRICES); //const int OFF_CALCULATEVIEWMATRICES = 0x422ABC;
CallFunctionOffset(OFF_DRAWPARTS); //const int OFF_FINDTHINGNAME = 0x441890;
}
void CallFunctionOffset(const int offset) {
int *pointer = (int*)offset;
__asm {call pointer}
}
Если я запускаю exe-файл по результату его работы видно, что код IncViewpos отрабатывает так, как нужно.
Проблема в том, что не получается отладить функцию IncViewpos. Дебуггер ее не видит и я не понимаю почему.
1. BreakPoint'ы не отрабатывают на функции IncViewpos
2. Создаю переменную и ставлю остановку на ее изменение — нет результата
3. if(IsDebuggerPresent()) DebugBreak(); // нет результата
При этом DllMain и ReplaceFunctionCall BreakPoint'ы ставятся и срабатывают корректно.
Подскажите, пожалуйста, есть способ поставить BreakPoint'ы на этой функции? Хотя бы на уровне ассемблера?
А то сейчас мне приходится каждый раз переключаться на Ida Pro, прогружать в ней библиотеку, это утомительно.
Зачем все это мне нужно подробно описано здесь:
http://ecstatica2.livejournal.com/