Отладка приложений


         

и ESP обрабатываются как часть


Заметьте, что регистры ЕВР и ESP обрабатываются как часть пролога.

////////////////////////////////////////////////*/ 

typedef struct tag__REGSTATE 

{

DWORD dwEAX;

DWORD dwEBX;

DWORD dwECX;

DWORD dwEDX;

DWORD dwEDI;

DWORD dwESI;

DWORD dwEFL;

 } REGSTATE, * PREGSTATE;

/*//////////////////////////////////////////////////////////

Общий код пролога для всех DD_*-функций

//////////////////////////////////////////////////////////*/

 #define HOOKFN_PROLOG() \ 

/* Все функции подключения автоматически получают три одинаковые */\ 

/* переменные. */\ 

DDEVENTINFO stEvtlnfo ; /* Информация о событиях для функции */\ 

DWORD dwLastError; /* Значение последней ошибки */\

 REGSTATE stRegState ; /* Состояние регистра */\ 

{ \ 

_asm PUSH EBP /* ЕВР всегда сохраняйте явно. */\ 

_asm MOV EBP, ESP /* Переместить стек */\ 

_asm MOV EAX, ESP /* Получить указатель стека для вычисления /\

/* адреса возврата и параметров. */\

_asm SUB ESP, _LOCAL_SIZE /* Сохранить пространство для локальных*/\

/ * переменных * / \ 

_asm ADD EAX, 04h + 04h /* Счет для PUSH EBP и адреса возврата. */\

/* Сохранить начало параметров в стеке. */\

_asm MOV [stEvtlnfo.dwParams], EAX \ 

_asm SUB EAX, 04h /* Вернуться к адресу возврата. */\ 

_asm MOV EAX, [EAX] /* EAX теперь содержит адрес возврата. */\

/* Сохранить адрес возврата. */\

_asm MOV [stEvtlnfo.dwAddr], EAX. \

 _asm MOV dwLastError, 0 /* Инициализировать dwLastError. */\

/* Инициализировать информацию событий. */\

_asm MOV [stEvtlnfo.eFunc], eUNINITIALIZEDFE \

 _asm MOV [stRegState.dwEDI], EDI /* Сохранить два регистра /\

 _asm MOV [stRegState.dwESI], ESI /* на время вызовов функций. */\ 

}

 /*///////////////////////////////////////////////////////////

Общий код эпилога для всех 00_*-функций. INumParams -число параметров функции, которая используется для восстановления стека после вызова подключения.


Содержание  Назад  Вперед