系统范围的挂钩,适用于64位操作系统

时间:2011-02-28 07:15:19

标签: c++ window setwindowshookex

我想在64位操作系统上执行系统范围的挂钩(使用SetWindowHook)。

我知道64位进程(= proc64)只能加载64位dll(= dll64)而32位进程(= proc32)只能加载32位dll(= dll32)。

目前我计划两次调用SetWindowHook,一次使用dll32,一次使用dll64,期望proc64s将加载dll64,proc32s将加载dll32(而proclls的dll32和proc32s的dll64将失败)。

这是正确的方法,还是有“更正确”的方法呢?

谢谢! : - )

3 个答案:

答案 0 :(得分:1)

您所描述的方法是正确的并记录在案。

来自http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

  

SetWindowsHookEx可用于注射   一个DLL进入另一个进程。一个32位   DLL无法注入64位   进程,一个64位DLL不能   注入32位进程。如果   应用程序需要使用钩子   在其他过程中,它是必需的   一个32位的应用程序调用   SetWindowsHookEx注入一个32位   DLL进入32位进程,和   64位应用程序调用   SetWindowsHookEx注入一个64位   DLL进入64位进程。 32位   和64位DLL必须有不同   名。

请注意最后一条声明32位和64位DLL 必须的名称不同。

答案 1 :(得分:0)

您可能希望查看EasyHook以避免一大堆麻烦。

答案 2 :(得分:-3)

您应该在代码中测试机器,以查看字长是32位还是64位。 64位机器将通过扩展字长来处理32位指令集,但是通过64位指令集的32位机器可能会导致非常糟糕的事情。

在C标准库limits.h中,header-INT_MAX将为您提供最大尺寸,测试它以查看

bool is32 = true;

if ( INT_MAX == 2^63 − 1 ) {
  is32 = false;
}

一旦你拿到了你的旗帜,就会知道要包含哪个档案,你可以用你的旗帜把它包括在内。