2013-09-17 12 views
1

У меня есть этот проект, где я подключаю некоторые функции Windows (GetOpenFileNameA, GetOpenFileNameW, GetSaveFileNameA, GetSaveFileNameW) с библиотекой MHook. Это код, который я использую для установки крючков.Общесистемные крючки с MHook

for(size_t i = 0; i < FunctionsCount; ++i) 
{ 
    HMODULE hModule = GetModuleHandleA(Function[i].ModuleName); 

    //[1] 
    if(!hModule) 
     return FALSE; 

    *Function[i].Original = GetProcAddress(hModule, Function[i].Name); 

    if(*Function[i].Original == NULL) 
     return FALSE; 

    if(!Mhook_SetHook(Function[i].Original, Function[i].Hooked)) 
     return FALSE; 
} 

Она вызывается из DllMain по DLL_PROCESS_ATTACH причине.

Теперь, когда я ввожу свою Dll с использованием подхода CreateRemoteThread, он работает очень хорошо, но когда я хочу настроить общесистемные крючки с помощью механизма LoadAppInit_DLLs, мои крючки не работают. После отладки часов я обнаружил, что причина в том, что моя Dll загружена ДО comdlg32.dll (которая является модулем, где эти функции), а затем оператор [1] возвращает false, тогда моя Dll не загружается.

Решение, которое я до сих пор должен назвать LoadLibrary, если [1] возвращает false.

HMODULE hModule = GetModuleHandleA(Function[i].ModuleName); 

//[2] 
if(!hModule) 
{ 
    LoadLibraryA(Function[i].ModuleName); 
    hModule = GetModuleHandleA(Function[i].ModuleName); 
} 

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

Если кто-нибудь может помочь, может быть, обходной путь или объяснение другого способа установления глобальных крючков будет оценен. Заранее спасибо

ответ

4

Вам необходимо подключить функции LoadLibraryXXX и после успешного их выполнения проверить, был ли загружен ваш модуль (вызывается GetModuleHandle) и зацепите его, если он загружен.

Также рекомендуется подключать подключенные DLL-файлы, чтобы они больше не выгружались.

+0

Хороший ответ, я дам попытку в ближайшее время. Что вы имеете в виду: «Хорошая идея - привязать подключенные DLL, чтобы они больше не были выгружены» – omainegra

+2

. Ваш алгоритм hook может не ожидать, что dll будет выгружена и снова загружена. Так что гораздо проще сделать dll unloadable. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200(v=vs.85).aspx –

+0

Дело в том, что я обнаружил, что dll выгружается из-за того, что операционная система загружает dll процесса (dll в 'LoadAppInit_DLLs' не является последним), поэтому в пространстве процессов' GetModuleHandle ("comdlg32.dll") 'возвращает' NULL'. Пожалуйста, поправьте меня, если я увижу это с неправильной точки зрения. – omainegra

Смежные вопросы