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


         

из W2K RC2 Platform SDK,


&mbi_thunk.Protect )) 

{

ASSERT ( !"VirtualProtect failed!");

 SetLastErrorEx ( ERROR_INVALID_HANDLE, SLE_ERROR);

 return ( FALSE); 

}

// Сохранить исходный адрес, если потребуется.

 if ( NULL != paOrigFuncs)

 {

paOrigFuncs[i] = (PROC)pRealThunk->ul.Function; 

}

// Microsoft имеет два различных определения

 // РIМАСЕ_ТНЦМК_ОАТА-полей для будущей поддержки Win64.

 // Используем самый последний набор заголовков

 // из W2K RC2 Platform SDK, и заставим иметь с ними дело

 // заголовки из Visual C++ 6 Service Pack 3. 

// Подключить функцию.

DWORD * pTemp = (DWORD*)&pRealThunk->ul.Function;

 *pTemp = (DWORD)(paHookArray[i].pProc); 

DWORD dwOldProtect;

// Изменить защиту обратно к тому состоянию, которое 

// было перед переписыванием указателя функции. 

VERIFY ( VirtualProtect ( mbi_thunk.BaseAddress,

mbi_thunk.RegionSize , mbi_thunk.Protect , SdwOldProtect )) ;

 if ( NULL != pdwHooked)

 {

// Инкремент общего количества подключенных функций.

 *pdwHooked += 1; 

}

 }

}

// Инкремент обеих таблиц. pOrigThunk++; pRealThunk++; 

}

// Все OK, Jumpmaster! 

SetLastError ( ERROR_SUCCESS);

 return ( TRUE); 

}

Уточнить принципы работы HooklmportedFunctionsByName не так  уж трудно. После выполнения обычной для практики профилактической отладки полной проверки (макросами утверждений) каждого параметра вызывается вспомогательная функция GetNamedimportDescriptor, чтобы найти структуру IMAGE_IMPORT_DESCRIPTOR для требуемого модуля. После получения указателей на исходную и реальную IAT-таблицы выполняется циклический просмотр исходной IAT-таблицы, проверяется каждая импортированная по имени функция, присутствует ли она в списке подключения paHookArray. Если функция находится в этом списке, то устанавливается атрибут доступа PAGE_READWRITE для памяти реальной  IAT-таблицы, чтобы благополучно записать в нее адрес подключения, затем этот адрес заносится в ячейку указателя соответствующей реальной функции и защита памяти восстанавливается в ее исходное состояние.Если вы не совсем разобрались в том, что происходит, воспользуйтесь функцией блочного тестирования для пошагового выполнения HookimportedFunctionsByName (эта функция включена в исходный код BUGSLAYERUTIL.DLL на сопровождающем компакт-диске).

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



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