64位全局挂钩锁定32位应用程序
64-bit global hook locks up 32-bit applications
我正在尝试创建一个简单的DLL,以挂接到Win7 x64上的64位应用程序。
我的程序使用64位进程,每当按键时都会生成一个消息框。但是,当我在32位应用程序中按下任何键时,该应用程序都会锁定,直到钩子被移除。为什么64位挂钩会干扰32位应用程序?
下面的代码。
hook.h
#ifdef MYHOOK_EXPORTS
#define MYHOOK_DLL __declspec(dllexport) __stdcall
#else
#define MYHOOK_DLL __declspec(dllimport) __stdcall
#endif
void MYHOOK_DLL installHook();
void MYHOOK_DLL removeHook();
hook.cpp:
#include "hook.h"
#include <windows.h>
// hook handle stored in a shared data segment
#pragma data_seg(".myshared")
HHOOK hhook = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.myshared,RWS")
static HMODULE hmodule = 0;
LRESULT CALLBACK keyboardProc(int code, WPARAM wParam, LPARAM lParam) {
// Replace this with sending a message to another window or writing to a file
MessageBox(NULL, L"Hello, world!", L"Alert", 0);
return CallNextHookEx(hhook, code, wParam, lParam);
}
void MYHOOK_DLL installHook() {
if (!hhook)
hhook = SetWindowsHookEx(WH_KEYBOARD, keyboardProc, hmodule, 0);
}
void MYHOOK_DLL removeHook() {
if (hhook)
UnhookWindowsHookEx(hhook);
hhook = 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
hmodule = hModule;
}
return TRUE;
}
install.cpp:
#include "hook.h"
#include <stdio.h>
int wmain() {
installHook();
getchar();
removeHook();
return 0;
}
我读过你应该检查一下你是否在64位进程中,但我不确定如何以及在哪里。
我知道WH_KEYBOARD_LL不需要注入DLL,但我正在努力理解为什么这个钩子不起作用。
a)您不能从Hook过程调用MessageBox。不要那样做。b) 钩子几乎总是解决任何问题的错误方法。我建议反对他们。你到底想做什么?
如下修改install.cpp。
#include "hook.h"
#include <stdio.h>
int wmain() {
installHook();
MSG msg;
BOOLEAN bRunThread = TRUE;
while(bRunThread)
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
removeHook();
return 0;
}
相关文章:
- 将32位和64位应用程序(具有相同代码)编译为一个EXE
- 在 64 位 Windows 上运行的 32 位应用程序是否仍然需要使用 SAFESEH 进行编译
- 32 位应用程序内存不足
- 在 32 位应用程序中使用 uint64_t
- 在FreeBSD下,允许32位应用程序使用超过4GB的RAM
- C++在32位应用程序之间传输大量数据以进行视频播放的方法
- 从 32 位应用程序挂接 64 位进程
- 将在64位应用程序中编码Protobuf消息并在32位应用程序中解码
- 32位应用程序链接到System32二进制文件,而不是SysWOW64
- 从32位应用程序打开64位regedit
- 在 64 位上迁移 32 位应用程序时出现问题
- 使用 AssocQueryString 从 32 位应用程序获取 64 位应用程序命令,但不起作用
- 使用32位应用程序从64位kernel32.dll获取函数地址
- 试图在CentOS上编译32位应用程序导致错误
- 在x64系统上使用32位应用程序中的IFilter
- 在64位操作系统中运行的32位应用程序可以寻址的不同内存的数量是多少?
- Visual Studio 2013将64 DLL文件强制转换为32位应用程序-如何修复此问题
- 是否有可能在OSX 10.6上构建在其他OSX 10.6系统上运行的32位应用程序?
- 64位全局挂钩锁定32位应用程序
- 在32位应用程序中使用64位功能