mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-14 17:36:20 +00:00
- 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:
parent
98acc0fcbf
commit
37553b7a13
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
|
|
@ -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);
|
||||||
|
|
105
windows/hook.c
105
windows/hook.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue