私はいくつかの Windows 関数(GetOpenFileNameA, GetOpenFileNameW, GetSaveFileNameA, GetSaveFileNameW)
を 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 が BEFORE comdlg32.dll
(これらの関数があるモジュール) にロードされ、ステートメント[1]
が false を返し、Dll がロードされないことが原因であることがわかりました。
私がこれまでに行った解決策は、false を返すLoadLibrary
場合に呼び出すことです。[1]
HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);
//[2]
if( !hModule )
{
LoadLibraryA(Function[i].ModuleName);
hModule = GetModuleHandleA(Function[i].ModuleName);
}
私はこれが悪だと言っている多くのサイトを見つけました。また、プロセスが一般的なダイアログをまったく使用しない場合は、決して呼び出されない関数をフックしています。
誰かが助けてくれれば、回避策やグローバルフックを設定する別の方法の説明をいただければ幸いです。前もって感謝します