- Converted HHOOK to a void*.
- Changed the internal HOOK_* functions to pass only HHOOK's between
them.
- Fixed wrong HHOOK <-> HANDLE16 conversions.
diff --git a/dlls/shell32/shell.c b/dlls/shell32/shell.c
index 5e28f2c..5cb71e8 100644
--- a/dlls/shell32/shell.c
+++ b/dlls/shell32/shell.c
@@ -494,7 +494,7 @@
}
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 65dd676..f3e2a36 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -79,7 +79,7 @@
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 895ce07..add34d6 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -61,6 +61,8 @@
#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 @@
*
* 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 @@
*
* 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 @@
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 @@
*
* 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 @@
{
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 @@
/***********************************************************************
* 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 @@
*
* 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 @@
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 @@
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_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_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 @@
/* 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 @@
{
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 @@
*/
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 @@
*/
BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook )
{
- return UnhookWindowsHookEx( hhook );
+ return HOOK_RemoveHook(hhook);
}
/***********************************************************************
@@ -997,8 +999,7 @@
*/
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 @@
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 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 @@
MESSAGEQUEUE *queue;
if (!(queue = QUEUE_Current())) return 0;
- return CallNextHookEx16( queue->hCurHook, code, wParam, lParam );
+ return CallNextHookEx16(HHOOK_32(queue->hCurHook), code, wParam, lParam);
}