全局WH_CBT挂钩DLL仅加载到某些进程中

时间:2010-03-21 16:36:58

标签: winapi dll

主程序调用wi.dll中的函数SetHook来安装全局WH_CBT钩子。

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位程序。

为什么会发生这种情况?

提前致谢。

2 个答案:

答案 0 :(得分: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,然后将消息重定向到主应用程序,并使您的主应用程序在x64中从64位dll调用SetWindowsHookEx以接收来自x64进程也是如此。

答案 1 :(得分:0)

钩链机制不是防弹的,并且依赖于遵守规则的每个人。如果应用程序安装了自己的每个线程WH_CBT挂钩并且在其挂钩过程中没有调用CallNextHookEx,则不会调用先前的挂钩。请参阅CallNextHookEx的MSDN文档。