2010-03-21 36 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进程的消息。