From 37553b7a139f5effa9815dce4daf998ca8d5d46d Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Sun, 28 Jul 2002 17:42:05 +0000 Subject: [PATCH] - Converted HHOOK to a void*. - Changed the internal HOOK_* functions to pass only HHOOK's between them. - Fixed wrong HHOOK <-> HANDLE16 conversions. --- dlls/shell32/shell.c | 2 +- include/windef.h | 2 +- windows/hook.c | 105 +++++++++++++++++++++---------------------- 3 files changed, 54 insertions(+), 55 deletions(-) diff --git a/dlls/shell32/shell.c b/dlls/shell32/shell.c index 5e28f2c3c1b..5cb71e884e6 100644 --- a/dlls/shell32/shell.c +++ b/dlls/shell32/shell.c @@ -494,7 +494,7 @@ LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam) } PostMessageA( SHELL_hWnd, uMsg, wParam, 0 ); } - return CallNextHookEx16( WH_SHELL, code, wParam, lParam ); + return CallNextHookEx16( SHELL_hHook, code, wParam, lParam ); } /************************************************************************* diff --git a/include/windef.h b/include/windef.h index 65dd6765831..f3e2a36f4de 100644 --- a/include/windef.h +++ b/include/windef.h @@ -79,7 +79,7 @@ DECLARE_OLD_HANDLE(HDC); DECLARE_HANDLE(HDESK); DECLARE_OLD_HANDLE(HENHMETAFILE); DECLARE_OLD_HANDLE(HFONT); -DECLARE_OLD_HANDLE(HHOOK); +DECLARE_HANDLE(HHOOK); DECLARE_OLD_HANDLE(HICON); DECLARE_OLD_HANDLE(HINSTANCE); DECLARE_OLD_HANDLE(HKEY); diff --git a/windows/hook.c b/windows/hook.c index 895ce0716a7..add34d6a68e 100644 --- a/windows/hook.c +++ b/windows/hook.c @@ -61,6 +61,8 @@ typedef struct #include "poppack.h" #define HOOK_MAGIC ((int)'H' | (int)'K' << 8) /* 'HK' */ +#define HHOOK_32(h) ((HHOOK)(h ? MAKELONG(h, HOOK_MAGIC) : 0)) +#define HHOOK_16(h) ((HANDLE16)((HIWORD(h) == HOOK_MAGIC) ? LOWORD(h) : 0)) /* This should probably reside in USER heap */ static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, }; @@ -590,16 +592,16 @@ inline static LRESULT call_hook( HOOKDATA *data, INT fromtype, INT code, * * Get the next hook of a given hook. */ -static HANDLE16 HOOK_GetNextHook( HANDLE16 hook ) +static HHOOK HOOK_GetNextHook( HHOOK hook ) { - HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hook ); + HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)); if (!data || !hook) return 0; - if (data->next) return data->next; + if (data->next) return HHOOK_32(data->next); if (!data->ownerQueue) return 0; /* Already system hook */ /* Now start enumerating the system hooks */ - return HOOK_systemHooks[data->id - WH_MINHOOK]; + return HHOOK_32(HOOK_systemHooks[data->id - WH_MINHOOK]); } @@ -608,15 +610,15 @@ static HANDLE16 HOOK_GetNextHook( HANDLE16 hook ) * * Get the first hook for a given type. */ -static HANDLE16 HOOK_GetHook( INT16 id ) +static HHOOK HOOK_GetHook( INT16 id ) { MESSAGEQUEUE *queue; - HANDLE16 hook = 0; + HANDLE16 handle = 0; if ((queue = QUEUE_Current()) != NULL) - hook = queue->hooks[id - WH_MINHOOK]; - if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK]; - return hook; + handle = queue->hooks[id - WH_MINHOOK]; + if (!handle) handle = HOOK_systemHooks[id - WH_MINHOOK]; + return HHOOK_32(handle); } @@ -677,7 +679,7 @@ static HHOOK HOOK_SetHook( INT16 id, LPVOID proc, INT type, TRACE("Setting hook %d: ret=%04x [next=%04x]\n", id, handle, data->next ); - return (HHOOK)( handle? MAKELONG( handle, HOOK_MAGIC ) : 0 ); + return HHOOK_32(handle); } @@ -686,14 +688,14 @@ static HHOOK HOOK_SetHook( INT16 id, LPVOID proc, INT type, * * Remove a hook from the list. */ -static BOOL HOOK_RemoveHook( HANDLE16 hook ) +static BOOL HOOK_RemoveHook( HHOOK hook ) { HOOKDATA *data; - HANDLE16 *prevHook; + HANDLE16 *prevHandle; TRACE("Removing hook %04x\n", hook ); - if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return FALSE; + if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)))) return FALSE; if (data->flags & HOOK_INUSE) { /* Mark it for deletion later on */ @@ -710,18 +712,18 @@ static BOOL HOOK_RemoveHook( HANDLE16 hook ) { MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( data->ownerQueue ); if (!queue) return FALSE; - prevHook = &queue->hooks[data->id - WH_MINHOOK]; + prevHandle = &queue->hooks[data->id - WH_MINHOOK]; QUEUE_Unlock( queue ); } - else prevHook = &HOOK_systemHooks[data->id - WH_MINHOOK]; + else prevHandle = &HOOK_systemHooks[data->id - WH_MINHOOK]; - while (*prevHook && *prevHook != hook) - prevHook = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHook))->next; + while (*prevHandle && *prevHandle != HHOOK_16(hook)) + prevHandle = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHandle))->next; - if (!*prevHook) return FALSE; - *prevHook = data->next; + if (!*prevHandle) return FALSE; + *prevHandle = data->next; - USER_HEAP_FREE( hook ); + USER_HEAP_FREE(HHOOK_16(hook)); return TRUE; } @@ -729,15 +731,15 @@ static BOOL HOOK_RemoveHook( HANDLE16 hook ) /*********************************************************************** * HOOK_FindValidHook */ -static HANDLE16 HOOK_FindValidHook( HANDLE16 hook ) +static HHOOK HOOK_FindValidHook( HHOOK hook ) { HOOKDATA *data; for (;;) { - if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return 0; + if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)))) return 0; if (data->proc) return hook; - hook = data->next; + hook = HHOOK_32(data->next); } } @@ -746,17 +748,17 @@ static HANDLE16 HOOK_FindValidHook( HANDLE16 hook ) * * Call a hook procedure. */ -static LRESULT HOOK_CallHook( HANDLE16 hook, INT fromtype, INT code, +static LRESULT HOOK_CallHook( HHOOK hook, INT fromtype, INT code, WPARAM wParam, LPARAM lParam ) { MESSAGEQUEUE *queue; - HANDLE16 prevHook; - HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); + HANDLE16 prevHandle; + HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)); LRESULT ret; if (!(queue = QUEUE_Current())) return 0; - prevHook = queue->hCurHook; - queue->hCurHook = hook; + prevHandle = queue->hCurHook; + queue->hCurHook = HHOOK_16(hook); TRACE("Calling hook %04x: %d %08x %08lx\n", hook, code, wParam, lParam ); @@ -766,7 +768,7 @@ static LRESULT HOOK_CallHook( HANDLE16 hook, INT fromtype, INT code, TRACE("Ret hook %04x = %08lx\n", hook, ret ); - queue->hCurHook = prevHook; + queue->hCurHook = prevHandle; if (!data->proc) HOOK_RemoveHook( hook ); return ret; } @@ -794,7 +796,7 @@ BOOL HOOK_IsHooked( INT16 id ) LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam, LPARAM lParam ) { - HANDLE16 hook; + HHOOK hook; if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_FindValidHook(hook))) return 0; @@ -809,7 +811,7 @@ LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam, LRESULT HOOK_CallHooksA( INT id, INT code, WPARAM wParam, LPARAM lParam ) { - HANDLE16 hook; + HHOOK hook; if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_FindValidHook(hook))) return 0; @@ -824,7 +826,7 @@ LRESULT HOOK_CallHooksA( INT id, INT code, WPARAM wParam, LRESULT HOOK_CallHooksW( INT id, INT code, WPARAM wParam, LPARAM lParam ) { - HANDLE16 hook; + HHOOK hook; if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_FindValidHook(hook))) return 0; @@ -841,24 +843,24 @@ void HOOK_FreeModuleHooks( HMODULE16 hModule ) /* remove all system hooks registered by this module */ HOOKDATA* hptr; - HHOOK hook, next; + HANDLE16 handle, next; int id; for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ ) { - hook = HOOK_systemHooks[id - WH_MINHOOK]; - while( hook ) - if( (hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook)) ) + handle = HOOK_systemHooks[id - WH_MINHOOK]; + while( handle ) + if( (hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(handle)) ) { next = hptr->next; if( hptr->ownerModule == hModule ) { hptr->flags &= HOOK_MAPTYPE; - HOOK_RemoveHook(hook); + HOOK_RemoveHook(HHOOK_32(handle)); } - hook = next; + handle = next; } - else hook = 0; + else handle = 0; } } @@ -880,7 +882,7 @@ void HOOK_FreeQueueHooks(void) { next = HOOK_GetNextHook(hook); - hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); + hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)); if( hptr && hptr->ownerQueue ) { hptr->flags &= HOOK_MAPTYPE; @@ -969,13 +971,13 @@ BOOL16 WINAPI UnhookWindowsHook16( INT16 id, HOOKPROC16 proc ) */ BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC proc ) { - HANDLE16 hook = HOOK_GetHook( id ); + HHOOK hook = HOOK_GetHook( id ); TRACE("%d %08lx\n", id, (DWORD)proc ); while (hook) { - HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); + HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook)); if (data->proc == proc) break; hook = HOOK_GetNextHook( hook ); } @@ -989,7 +991,7 @@ BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC proc ) */ BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook ) { - return UnhookWindowsHookEx( hhook ); + return HOOK_RemoveHook(hhook); } /*********************************************************************** @@ -997,8 +999,7 @@ BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook ) */ BOOL WINAPI UnhookWindowsHookEx( HHOOK hhook ) { - if (HIWORD(hhook) != HOOK_MAGIC) return FALSE; /* Not a new format hook */ - return HOOK_RemoveHook( LOWORD(hhook) ); + return HOOK_RemoveHook(hhook); } @@ -1012,10 +1013,9 @@ BOOL WINAPI UnhookWindowsHookEx( HHOOK hhook ) LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam, LPARAM lParam ) { - HANDLE16 next; + HHOOK next; - if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ - if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0; + if (!(next = HOOK_GetNextHook(hhook))) return 0; return HOOK_CallHook( next, HOOK_WIN16, code, wParam, lParam ); } @@ -1029,14 +1029,13 @@ LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam, LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wParam, LPARAM lParam ) { - HANDLE16 next; + HHOOK next; INT fromtype; /* figure out Ansi/Unicode */ HOOKDATA *oldhook; - if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ - if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0; + if (!(next = HOOK_GetNextHook(hhook))) return 0; - oldhook = (HOOKDATA *)USER_HEAP_LIN_ADDR( LOWORD(hhook) ); + oldhook = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hhook)); fromtype = oldhook->flags & HOOK_MAPTYPE; if (fromtype == HOOK_WIN16) @@ -1057,7 +1056,7 @@ LRESULT WINAPI DefHookProc16( INT16 code, WPARAM16 wParam, LPARAM lParam, MESSAGEQUEUE *queue; if (!(queue = QUEUE_Current())) return 0; - return CallNextHookEx16( queue->hCurHook, code, wParam, lParam ); + return CallNextHookEx16(HHOOK_32(queue->hCurHook), code, wParam, lParam); }