- Converted HHOOK to a void*.

- Changed the internal HOOK_* functions to pass only HHOOK's between
  them.
- Fixed wrong HHOOK <-> HANDLE16 conversions.
This commit is contained in:
Michael Stefaniuc 2002-07-28 17:42:05 +00:00 committed by Alexandre Julliard
parent 98acc0fcbf
commit 37553b7a13
3 changed files with 54 additions and 55 deletions

View file

@ -494,7 +494,7 @@ LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam)
} }
PostMessageA( SHELL_hWnd, uMsg, wParam, 0 ); PostMessageA( SHELL_hWnd, uMsg, wParam, 0 );
} }
return CallNextHookEx16( WH_SHELL, code, wParam, lParam ); return CallNextHookEx16( SHELL_hHook, code, wParam, lParam );
} }
/************************************************************************* /*************************************************************************

View file

@ -79,7 +79,7 @@ DECLARE_OLD_HANDLE(HDC);
DECLARE_HANDLE(HDESK); DECLARE_HANDLE(HDESK);
DECLARE_OLD_HANDLE(HENHMETAFILE); DECLARE_OLD_HANDLE(HENHMETAFILE);
DECLARE_OLD_HANDLE(HFONT); DECLARE_OLD_HANDLE(HFONT);
DECLARE_OLD_HANDLE(HHOOK); DECLARE_HANDLE(HHOOK);
DECLARE_OLD_HANDLE(HICON); DECLARE_OLD_HANDLE(HICON);
DECLARE_OLD_HANDLE(HINSTANCE); DECLARE_OLD_HANDLE(HINSTANCE);
DECLARE_OLD_HANDLE(HKEY); DECLARE_OLD_HANDLE(HKEY);

View file

@ -61,6 +61,8 @@ typedef struct
#include "poppack.h" #include "poppack.h"
#define HOOK_MAGIC ((int)'H' | (int)'K' << 8) /* 'HK' */ #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 */ /* This should probably reside in USER heap */
static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, }; 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. * 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 || !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 */ if (!data->ownerQueue) return 0; /* Already system hook */
/* Now start enumerating the system hooks */ /* 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. * Get the first hook for a given type.
*/ */
static HANDLE16 HOOK_GetHook( INT16 id ) static HHOOK HOOK_GetHook( INT16 id )
{ {
MESSAGEQUEUE *queue; MESSAGEQUEUE *queue;
HANDLE16 hook = 0; HANDLE16 handle = 0;
if ((queue = QUEUE_Current()) != NULL) if ((queue = QUEUE_Current()) != NULL)
hook = queue->hooks[id - WH_MINHOOK]; handle = queue->hooks[id - WH_MINHOOK];
if (!hook) hook = HOOK_systemHooks[id - WH_MINHOOK]; if (!handle) handle = HOOK_systemHooks[id - WH_MINHOOK];
return hook; 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", TRACE("Setting hook %d: ret=%04x [next=%04x]\n",
id, handle, data->next ); 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. * Remove a hook from the list.
*/ */
static BOOL HOOK_RemoveHook( HANDLE16 hook ) static BOOL HOOK_RemoveHook( HHOOK hook )
{ {
HOOKDATA *data; HOOKDATA *data;
HANDLE16 *prevHook; HANDLE16 *prevHandle;
TRACE("Removing hook %04x\n", hook ); 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) if (data->flags & HOOK_INUSE)
{ {
/* Mark it for deletion later on */ /* Mark it for deletion later on */
@ -710,18 +712,18 @@ static BOOL HOOK_RemoveHook( HANDLE16 hook )
{ {
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( data->ownerQueue ); MESSAGEQUEUE *queue = (MESSAGEQUEUE *)QUEUE_Lock( data->ownerQueue );
if (!queue) return FALSE; if (!queue) return FALSE;
prevHook = &queue->hooks[data->id - WH_MINHOOK]; prevHandle = &queue->hooks[data->id - WH_MINHOOK];
QUEUE_Unlock( queue ); QUEUE_Unlock( queue );
} }
else prevHook = &HOOK_systemHooks[data->id - WH_MINHOOK]; else prevHandle = &HOOK_systemHooks[data->id - WH_MINHOOK];
while (*prevHook && *prevHook != hook) while (*prevHandle && *prevHandle != HHOOK_16(hook))
prevHook = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHook))->next; prevHandle = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHandle))->next;
if (!*prevHook) return FALSE; if (!*prevHandle) return FALSE;
*prevHook = data->next; *prevHandle = data->next;
USER_HEAP_FREE( hook ); USER_HEAP_FREE(HHOOK_16(hook));
return TRUE; return TRUE;
} }
@ -729,15 +731,15 @@ static BOOL HOOK_RemoveHook( HANDLE16 hook )
/*********************************************************************** /***********************************************************************
* HOOK_FindValidHook * HOOK_FindValidHook
*/ */
static HANDLE16 HOOK_FindValidHook( HANDLE16 hook ) static HHOOK HOOK_FindValidHook( HHOOK hook )
{ {
HOOKDATA *data; HOOKDATA *data;
for (;;) 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; 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. * 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 ) WPARAM wParam, LPARAM lParam )
{ {
MESSAGEQUEUE *queue; MESSAGEQUEUE *queue;
HANDLE16 prevHook; HANDLE16 prevHandle;
HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook));
LRESULT ret; LRESULT ret;
if (!(queue = QUEUE_Current())) return 0; if (!(queue = QUEUE_Current())) return 0;
prevHook = queue->hCurHook; prevHandle = queue->hCurHook;
queue->hCurHook = hook; queue->hCurHook = HHOOK_16(hook);
TRACE("Calling hook %04x: %d %08x %08lx\n", hook, code, wParam, lParam ); 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 ); TRACE("Ret hook %04x = %08lx\n", hook, ret );
queue->hCurHook = prevHook; queue->hCurHook = prevHandle;
if (!data->proc) HOOK_RemoveHook( hook ); if (!data->proc) HOOK_RemoveHook( hook );
return ret; return ret;
} }
@ -794,7 +796,7 @@ BOOL HOOK_IsHooked( INT16 id )
LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam, LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HANDLE16 hook; HHOOK hook;
if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_GetHook( id ))) return 0;
if (!(hook = HOOK_FindValidHook(hook))) 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, LRESULT HOOK_CallHooksA( INT id, INT code, WPARAM wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HANDLE16 hook; HHOOK hook;
if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_GetHook( id ))) return 0;
if (!(hook = HOOK_FindValidHook(hook))) 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, LRESULT HOOK_CallHooksW( INT id, INT code, WPARAM wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HANDLE16 hook; HHOOK hook;
if (!(hook = HOOK_GetHook( id ))) return 0; if (!(hook = HOOK_GetHook( id ))) return 0;
if (!(hook = HOOK_FindValidHook(hook))) 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 */ /* remove all system hooks registered by this module */
HOOKDATA* hptr; HOOKDATA* hptr;
HHOOK hook, next; HANDLE16 handle, next;
int id; int id;
for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ ) for( id = WH_MINHOOK; id <= WH_MAXHOOK; id++ )
{ {
hook = HOOK_systemHooks[id - WH_MINHOOK]; handle = HOOK_systemHooks[id - WH_MINHOOK];
while( hook ) while( handle )
if( (hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook)) ) if( (hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(handle)) )
{ {
next = hptr->next; next = hptr->next;
if( hptr->ownerModule == hModule ) if( hptr->ownerModule == hModule )
{ {
hptr->flags &= HOOK_MAPTYPE; 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); next = HOOK_GetNextHook(hook);
hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(HHOOK_16(hook));
if( hptr && hptr->ownerQueue ) if( hptr && hptr->ownerQueue )
{ {
hptr->flags &= HOOK_MAPTYPE; hptr->flags &= HOOK_MAPTYPE;
@ -969,13 +971,13 @@ BOOL16 WINAPI UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
*/ */
BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC 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 ); TRACE("%d %08lx\n", id, (DWORD)proc );
while (hook) 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; if (data->proc == proc) break;
hook = HOOK_GetNextHook( hook ); hook = HOOK_GetNextHook( hook );
} }
@ -989,7 +991,7 @@ BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC proc )
*/ */
BOOL16 WINAPI UnhookWindowsHookEx16( HHOOK hhook ) 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 ) BOOL WINAPI UnhookWindowsHookEx( HHOOK hhook )
{ {
if (HIWORD(hhook) != HOOK_MAGIC) return FALSE; /* Not a new format hook */ return HOOK_RemoveHook(hhook);
return HOOK_RemoveHook( LOWORD(hhook) );
} }
@ -1012,10 +1013,9 @@ BOOL WINAPI UnhookWindowsHookEx( HHOOK hhook )
LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam, LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HANDLE16 next; HHOOK next;
if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ if (!(next = HOOK_GetNextHook(hhook))) return 0;
if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0;
return HOOK_CallHook( next, HOOK_WIN16, code, wParam, lParam ); 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, LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HANDLE16 next; HHOOK next;
INT fromtype; /* figure out Ansi/Unicode */ INT fromtype; /* figure out Ansi/Unicode */
HOOKDATA *oldhook; HOOKDATA *oldhook;
if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ if (!(next = HOOK_GetNextHook(hhook))) return 0;
if (!(next = HOOK_GetNextHook( LOWORD(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; fromtype = oldhook->flags & HOOK_MAPTYPE;
if (fromtype == HOOK_WIN16) if (fromtype == HOOK_WIN16)
@ -1057,7 +1056,7 @@ LRESULT WINAPI DefHookProc16( INT16 code, WPARAM16 wParam, LPARAM lParam,
MESSAGEQUEUE *queue; MESSAGEQUEUE *queue;
if (!(queue = QUEUE_Current())) return 0; if (!(queue = QUEUE_Current())) return 0;
return CallNextHookEx16( queue->hCurHook, code, wParam, lParam ); return CallNextHookEx16(HHOOK_32(queue->hCurHook), code, wParam, lParam);
} }