из 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.
Содержание Назад Вперед