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


         

Прототипы для всех функций подключения


Листинг 12-3. DD_FUNCS.H

 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - 

"Debugging Applications" (Microsoft Press)

Copyright (c) 1997-2000 John Robbins — All rights reserved.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Прототипы для всех функций подключения и код пролога/эпилога

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

#ifndef J3D_FUNCS_H 

#define _DD_FUNCS__H 

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

Все функции подключения имеют спецификатор _declspec (naked), так                что я должен обеспечить пролог и эпилог. Заказной пролог и эпилог        необходим по нескольким причинам:

1. Функции, написанные на С, не имеют никакого контроля над тем, какие регистры используются или когда компилятор сохраняет исходные значения регистров. Отсутствие контроля над регистрами означает, что получение адреса возврата почти невозможно. Для проекта DeadlockDetection адрес возврата имеет решающее значение.

2. Я также хотел передавать параметры в обрабатывающую функцию расширяющей DLL без необходимости копировать большие объемы данных при каждом вызове функции.

3. Поскольку почти все функции подключения ведут себя одинаково, я установил общие переменные, необходимые во всех функциях.

4. Функции подключения не могут изменять возвращаемых значений

включая значения, полученные от GetLastError. Организуя собственный пролог и эпилог, я могу значительно облегчить возврат корректных значений. Также необходимо восстанавливать значения регистров к тому состоянию, в котором они были после вызова реальной функции.

Основная функция подключения напоминает следующую функцию: 

HANDLE NAKEDDEF DD_OpenEventA ( DWORD dwDesiredAccess,

BOOL blnheritHandle , 

LPCSTR IpNarne )

{

// Любые локальные переменные функции должны быть специфицированы

// перед рабочим кодом.


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