[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: CallNextHookEx16 strageness
From:       Michael Stefaniuc <mstefani () redhat ! de>
Date:       2002-07-27 20:46:59
[Download RAW message or body]

[Attachment #2 (multipart/mixed)]


On Tue, Jul 23, 2002 at 03:18:04PM -0700, Alexandre Julliard wrote:
> Michael Stefaniuc <mstefani@redhat.de> writes:
> 
> > It seems that we don't have an implicit transformation of a HHOOK to a
> > HANDLE16. Most of the internal HOOK_* functions are using HANDLE16's and
> > the few functions that accepts as parameter a HHOOK are checking for the
> > presence of the HOOK_MAGIC and are doing the conversion to a HANDLE16
> > with LOWORD(hhook).
> 
> Well yes, the hook functions are mostly using HANDLE16 internally, but
> it would be much better to change them to use HHOOK. There isn't much
> point in making HHOOK work with -DSTRICT if we don't use it anywhere.
Hmm ... looking at windows/hook.c i guess that we have to keep using
with HOOKDATA, MESSAGEQUEUE, USER_HEAP_LIN_ADDR, etc. and this ones are
using HANDLE16. HOOK_systemHooks could be changed to HHOOK, but this
would introduce a lot of conversions.
I've changed all internal HOOK_* functions to pass only HHOOK's to each
other. I've kept the use of HANDLE16 in functions that make extensive
use of HOOKDATA and MESSAGEQUEUE but changed the variables name from
hook to handle to not produce confusion.

> -    return CallNextHookEx16( WH_SHELL, code, wParam, lParam );
> +    return CallNextHookEx16( (HHOOK)MAKELONG(WH_SHELL, HOOK_MAGIC), code,
> +			    wParam, lParam );
> 
> WH_SHELL is not a valid hook handle, this code is broken (of course it
> was broken before too).
ShellHookProc is only a win < win95 function and I couldn't find any
documentation for it (searching on msdn revealed nothing) so i've made a
separat patch for it, but it's a pure guesstimation.

License: LGPL, X11
Changelog:
    Michael Stefaniuc <mstefani@redhat.com>
    - converted HHOOK to a void*
    - changed the internal HOOK_* functions to pass only HHOOK's between
      them
    - fixed wrong HHOOK <-> HANDLE16 conversions

bye
	michael
-- 
Michael Stefaniuc               Tel.: +49-711-96437-199
System Administration           Fax.: +49-711-96437-111
Red Hat GmbH                    Email: mstefani@redhat.com
Hauptstaetterstr. 58            http://www.redhat.de/
D-70178 Stuttgart

["HHOOK.patch2" (text/plain)]

Index: include/windef.h
===================================================================
RCS file: /home/wine/wine/include/windef.h,v
retrieving revision 1.65
diff -u -r1.65 windef.h
--- include/windef.h	19 Jul 2002 00:28:13 -0000	1.65
+++ include/windef.h	27 Jul 2002 17:13:00 -0000
@@ -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);
Index: windows/hook.c
===================================================================
RCS file: /home/wine/wine/windows/hook.c,v
retrieving revision 1.35
diff -u -r1.35 hook.c
--- windows/hook.c	10 Jul 2002 23:20:49 -0000	1.35
+++ windows/hook.c	27 Jul 2002 17:13:02 -0000
@@ -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);
 }
 
 

["ShellHookProc.patch" (text/plain)]

Index: dlls/shell32/shell.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell.c,v
retrieving revision 1.41
diff -u -r1.41 shell.c
--- dlls/shell32/shell.c	21 Jun 2002 20:08:50 -0000	1.41
+++ dlls/shell32/shell.c	27 Jul 2002 20:16:53 -0000
@@ -494,7 +494,7 @@
         }
 	PostMessageA( SHELL_hWnd, uMsg, wParam, 0 );
     }
-    return CallNextHookEx16( WH_SHELL, code, wParam, lParam );
+    return CallNextHookEx16( SHELL_hHook, code, wParam, lParam );
 }
 
 /*************************************************************************

[Attachment #7 (application/pgp-signature)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic