I am attempting to create a simple DLL to hook into 64-bit applications on Win7 x64.
My program works with 64-bit processes, spawning a message box whenever a key is pressed. But when I press any key in a 32-bit application, that application will lock up until the hook is removed. Why does the 64-bit hook interfere with 32-bit applications?
Code below.
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;
}
I've read you should check if you're in a 64-bit process somewhere in the hook, but I'm not sure how and where.
I'm aware of WH_KEYBOARD_LL which doesn't require injecting a DLL, but I'm trying to understand why this hook isn't working.