2

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

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

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

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

谢谢!:-)

4

3 回答 3

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 的名称必须不同。

于 2011-02-28T07:43:34.493 回答
0

你可能想看看EasyHook来为自己省去一大堆麻烦。

于 2011-02-28T09:54:38.837 回答
-3

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

在 C 标准库的limits.h 头文件中——INT_MAX 会给你最大尺寸,测试它看看

bool is32 = true;

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

一旦你有了你的标志,你就会知道要包含哪个文件,并且你可以使用你的标志来包含它。

于 2011-02-28T07:24:17.107 回答