我的应用程序被编译为32位,并且由于我在64位Windows 7上运行,因此我的目标(notepad.exe)为64位。当我在notepad.exe的第一个线程上调用SetWindowsHookEx()
时,DLL根本没有被注入,但没有返回错误。我知道它没有被注入,因为我在DLL_PROCESS_ATTACH
上显示带有消息Attached
的消息框,对于DLL_PROCESS_DETACH
,我在消息框中显示Detached
消息。这些消息只会在我拨打LoadLibrary()
时显示一次,另一次是我的应用程序退出时显示。从32位进程挂钩64位进程时,SetWindowsHookEx()不会返回错误?
根据MSDN文档here:
因为应用程序上下文中运行挂钩,它们必须匹配 的应用程序的“位数”。如果32位应用程序在64位Windows上安装了全局挂接,则将32位挂接注入到每个32位进程(通常的安全边界适用)中。在64位 进程中,线程仍被标记为“挂钩”。但是,由于32位应用程序必须运行该钩子代码,系统将在钩子应用程序的上下文中执行 挂钩;具体来说,在 调用SetWindowsHookEx的线程上。这意味着挂钩应用程序必须继续泵送消息,否则可能会阻止64位进程的正常运行。
这是否意味着它成功挂钩了我自己的进程而不是实际返回错误?
编辑:我的钩子是WH_CBT类型。
这个问题关键取决于钩子的类型 –
它没有义务返回错误,它肯定会注入* some *进程。只是不是你想要的。这是64位操作系统上的缺陷,您需要使用64位DLL启动64位版本的程序,以注入64位进程。 –