- 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);
 }