2010-03-21 102 views
1

主程序調用wi.dll中的函數SetHook來安裝全局WH_CBT鉤子。全局WH_CBT鉤子DLL只加載到一些進程

bool WI_API SetHook() 
{ 
    if (!g_hHook) 
    { 
     g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstDll, 0); 
    } 

    return g_hHook != NULL; 
} 

我推測在安裝全局鉤子之後,應該將wi.dll加載到每個進程的地址空間中。但是,wi.dll只能加載到某些進程。例如,如果我啓動Skype,MS Word,我可以看到wi.dll也加載到這些進程中(使用Process Explorer),但是如果我運行Firefox,uTorrent,Adobe Reader,那麼wi.dll不會加載到這些進程中。

我使用W7 64位主程序和wi.dll是32位,這裏提到的所有程序都是32位程序。

任何想法爲什麼發生這種情況?

在此先感謝。

回答

0

鉤鏈機制並非無懈可擊,依賴於遵守規則的每個人。如果應用程序安裝了其自己的每線程WH_CBT掛鉤,並且在其掛鉤過程中不會調用CallNextHookEx,則不會調用較早的掛鉤。請參閱MSDN文檔CallNextHookEx

1

從MSDN:

SetWindowsHookEx函數可以用來注入一個DLL到另一個進程。 32位DLL無法注入64位進程,64位DLL無法注入32位進程。如果應用程序需要在其他進程中使用鉤子,則需要32位應用程序調用SetWindowsHookEx將32位DLL注入到32位進程中,並且64位應用程序調用SetWindowsHookEx以注入64位DLL轉換爲64位進程。 32位和64位DLL必須具有不同的名稱。

所以,你應該創建32位應用程序從32位DLL調用SetWindowsHookEx函數,然後將消息重定向到你的主應用程序,並從64位DLL有在64位的呼叫和SetWindowsHookEx您主要的應用程序接收來自x64進程的消息。