Release 970215

Sat Feb 15 11:59:17 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [*/*]
	Converted a lot of functions to Win32 types.
	Removed HWND type.

Fri Feb 14 15:09:19 1997  Onno Hovers <onno@stack.nl>

	* [memory/global.c]
	Implemented GMEM_MOVEABLE blocks for Win32.

Fri Feb 14 00:24:39 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [loader/task.c] [windows/queue.c]
	Do not read X events while in the intertask SendMessage().

	* [misc/lstr.c]
	Fixed CharPrev32A().

	* [windows/hook.c] [include/hook.h]
	Restored broken WH_CALLWNDPROC functionality for dialogs, etc...

	* [windows/win.c] [windows/defwnd.c] [windows/mdi.c]
	  [windows/event.c] [controls/edit.c] 
	Added WIN_ISWIN32 flag to windows created by Win32 calls. 
	Several new Win32 messages are sent when this flag is on.
	
	* [msdos/dosmem.c] [memory/global.c]
	Some changes in DOS memory allocation.

Fri Feb  7 21:46:03 1997  Andrew Taylor  <andrew@riscan.com>

	* [win32/security.c]
	Added SID manipulation functions.

	* [include/debug.h]
	Added debugging class "security".

Fri  Feb 7 20:46:33 1997  Robert Pouliot <krynos@clic.net>

	* [debugger/msc.c] [debugger/source.c] 
	  [documentation/wine_os2.txt] [loader/signal.c]
	Some more changes for OS/2. Doesn't work yet.

Fri  Feb 7 09:31:17 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [scheduler/process.c]
	Added ExpandEnvironmentStrings*.

	* [misc/ntdll.c] [include/ntdll.h]
	Added some new functions.

	* [objects/cursoricon.c]
	CURSORICON_LoadHandler: check against some bizarre out of memory
	conditions.
	
	* [windows/mdi.c]
	Fixed DefFrameProc32*, added TranslateMDISysAccel32.

Wed Feb  5 01:31:05 1997  John Zero <john@globe.graphisoft.hu>

	* [resources/sysres_Hu.rc] [misc/ole2nls.c] [misc/main.c]
	  [programs/progman/Hu.rc] [programs/winhelp/Hu.rc]
	Added Hungarian language support.
diff --git a/windows/hook.c b/windows/hook.c
index 1a9b793..59ffd20 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -22,6 +22,7 @@
 #include "user.h"
 #include "heap.h"
 #include "struct32.h"
+#include "winproc.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -35,8 +36,7 @@
     INT16      id;                 /* 06 Hook id (WH_xxx) */
     HQUEUE16   ownerQueue;         /* 08 Owner queue (0 for system hook) */
     HMODULE16  ownerModule;        /* 0a Owner module */
-    WORD       inHookProc;         /* 0c TRUE if in this->proc */
-    INT32      flags;
+    WORD       flags;              /* 0c flags */
 } HOOKDATA;
 
 #pragma pack(4)
@@ -50,33 +50,29 @@
 typedef VOID (*HOOK_UnMapFunc)(INT32, INT32, WPARAM32, LPARAM, WPARAM32,
 			       LPARAM);
 
-
-/***********************************************************************
- *           Hook Mapping Functions
- */
-
-
 /***********************************************************************
  *           HOOK_Map16To32Common
  */
 static void HOOK_Map16To32Common(INT32 id, INT32 code, WPARAM32 *pwParam,
-				 LPARAM *plParam)
+				 LPARAM *plParam, BOOL32 bA )
 {
-    switch (id)
-    {
-    case WH_MSGFILTER:
-    case WH_SYSMSGFILTER:
-    case WH_GETMESSAGE:
-    case WH_JOURNALRECORD:
+
+   switch( id )
+   {
+	case WH_MSGFILTER:
+	case WH_SYSMSGFILTER: 
+	case WH_GETMESSAGE: 
+	case WH_JOURNALRECORD:
         {
             LPMSG16 lpmsg16 = PTR_SEG_TO_LIN(*plParam);
             LPMSG32 lpmsg32 = HeapAlloc( SystemHeap, 0, sizeof(*lpmsg32) );
 	
             STRUCT32_MSG16to32( lpmsg16, lpmsg32 );
             *plParam = (LPARAM)lpmsg32;
-            break;
-        }
-    case WH_JOURNALPLAYBACK:
+	    break;
+        } 
+
+	case WH_JOURNALPLAYBACK:
         {
             LPEVENTMSG16 lpem16 = PTR_SEG_TO_LIN(*plParam);
             LPEVENTMSG32 lpem32 = HeapAlloc( SystemHeap, 0, sizeof(*lpem32) );
@@ -88,12 +84,61 @@
             lpem32->hwnd = 0;	/* FIXME */
 
             *plParam = (LPARAM)lpem32;
-            break;
-        }
-    case WH_CBT:
-	switch (code)
+	    break;
+        } 
+
+	case WH_CALLWNDPROC:
 	{
-        case HCBT_ACTIVATE:
+	    INT32	(*localMap)(UINT16, WPARAM16, UINT32*, WPARAM32*, LPARAM*)
+			  = (bA) ? WINPROC_MapMsg16To32A : WINPROC_MapMsg16To32W;
+	    LPCWPSTRUCT16   lpcwp16 = PTR_SEG_TO_LIN(*plParam);
+	    LPCWPSTRUCT32   lpcwp32 = HeapAlloc( SystemHeap, 0, sizeof(*lpcwp32) );
+	    
+	    lpcwp32->hwnd = lpcwp16->hwnd;
+	    lpcwp32->lParam = lpcwp16->lParam;
+	    
+	    (*localMap)(lpcwp16->message, lpcwp16->wParam, 
+		       &lpcwp32->message, &lpcwp32->wParam, &lpcwp32->lParam );
+	    break;
+	}
+
+	case WH_CBT:
+	  switch (code)
+	  {
+	    case HCBT_CREATEWND:
+	    {
+		LPCBT_CREATEWND16  lpcbtcw16 = PTR_SEG_TO_LIN(*plParam);
+		LPCREATESTRUCT16   lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs);
+		LPCBT_CREATEWND32A lpcbtcw32 = HeapAlloc( SystemHeap, 0,
+							  sizeof(*lpcbtcw32) );
+		lpcbtcw32->lpcs = HeapAlloc( SystemHeap, 0,
+					     sizeof(*lpcbtcw32->lpcs) );
+
+		STRUCT32_CREATESTRUCT16to32A( lpcs16,
+					     (LPCREATESTRUCT32A)lpcbtcw32->lpcs );
+
+		if (HIWORD(lpcs16->lpszName))
+		    lpcbtcw32->lpcs->lpszName = 
+			(bA) ? PTR_SEG_TO_LIN(lpcs16->lpszName)
+			     : HEAP_strdupAtoW( SystemHeap, 0,
+                                                PTR_SEG_TO_LIN(lpcs16->lpszName) );
+		else
+		    lpcbtcw32->lpcs->lpszName = (LPCSTR)lpcs16->lpszName;
+
+		if (HIWORD(lpcs16->lpszClass))
+		    lpcbtcw32->lpcs->lpszClass =
+			(bA) ? PTR_SEG_TO_LIN(lpcs16->lpszClass)
+			     : HEAP_strdupAtoW( SystemHeap, 0,
+                                                PTR_SEG_TO_LIN(lpcs16->lpszClass) );
+		else
+		    lpcbtcw32->lpcs->lpszClass = (LPCSTR)lpcs16->lpszClass;
+
+		lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter;
+
+		*plParam = (LPARAM)lpcbtcw32;
+		break;
+	    } 
+	    case HCBT_ACTIVATE:
             {
                 LPCBTACTIVATESTRUCT16 lpcas16 = PTR_SEG_TO_LIN(*plParam);
                 LPCBTACTIVATESTRUCT32 lpcas32 = HeapAlloc( SystemHeap, 0,
@@ -103,7 +148,7 @@
                 *plParam = (LPARAM)lpcas32;
                 break;
             }
-        case HCBT_CLICKSKIPPED:
+            case HCBT_CLICKSKIPPED:
             {
                 LPMOUSEHOOKSTRUCT16 lpms16 = PTR_SEG_TO_LIN(*plParam);
                 LPMOUSEHOOKSTRUCT32 lpms32 = HeapAlloc( SystemHeap, 0,
@@ -120,7 +165,7 @@
                 *plParam = (LPARAM)lpms32;
                 break;
             }
-        case HCBT_MOVESIZE:
+            case HCBT_MOVESIZE:
             {
                 LPRECT16 lprect16 = PTR_SEG_TO_LIN(*plParam);
                 LPRECT32 lprect32 = HeapAlloc( SystemHeap, 0,
@@ -130,9 +175,10 @@
                 *plParam = (LPARAM)lprect32;
                 break;
             }
-	}
-	break;
-    case WH_MOUSE:
+	    break;
+	  } 
+
+	case WH_MOUSE:
         {
             LPMOUSEHOOKSTRUCT16 lpms16 = PTR_SEG_TO_LIN(*plParam);
             LPMOUSEHOOKSTRUCT32 lpms32 = HeapAlloc( SystemHeap, 0,
@@ -146,9 +192,10 @@
             lpms32->dwExtraInfo = lpms16->dwExtraInfo;
             lpms32->hwnd = lpms16->hwnd;
             *plParam = (LPARAM)lpms32;
-            break;
-        }
-    case WH_DEBUG:
+	    break;
+        } 
+
+	case WH_DEBUG:
         {
             LPDEBUGHOOKINFO16 lpdh16 = PTR_SEG_TO_LIN(*plParam);
             LPDEBUGHOOKINFO32 lpdh32 = HeapAlloc( SystemHeap, 0,
@@ -164,19 +211,17 @@
             if (*pwParam == 0xffff) *pwParam = WH_MSGFILTER;
 
             *plParam = (LPARAM)lpdh32;
-            break;
+	    break;
         }
-    case WH_SHELL:
-    case WH_KEYBOARD:
-	break;
 
-    case WH_CALLWNDPROC:
-    case WH_HARDWARE:
-	break;	/* NYI */
+	case WH_SHELL:
+	case WH_KEYBOARD:
+	    break;
 
-    default:
-	fprintf(stderr, "Unknown hook id: %d\n", id);
-	return;
+	case WH_HARDWARE: 
+	case WH_FOREGROUNDIDLE: 
+	case WH_CALLWNDPROCRET:
+	    fprintf(stderr, "\t[%i] 16to32 translation unimplemented\n", id);
     }
 }
 
@@ -187,34 +232,7 @@
 static void HOOK_Map16To32A(INT32 id, INT32 code, WPARAM32 *pwParam,
 			    LPARAM *plParam)
 {
-    if (id == WH_CBT && code == HCBT_CREATEWND)
-    {
-	LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(*plParam);
-	LPCBT_CREATEWND32A lpcbtcw32 = HeapAlloc( SystemHeap, 0,
-						  sizeof(*lpcbtcw32) );
-	lpcbtcw32->lpcs = HeapAlloc( SystemHeap, 0,
-				     sizeof(*lpcbtcw32->lpcs) );
-
-	STRUCT32_CREATESTRUCT16to32A( lpcbtcw16->lpcs, lpcbtcw32->lpcs );
-
-	if (HIWORD(lpcbtcw16->lpcs->lpszName))
-            lpcbtcw32->lpcs->lpszName
-                = PTR_SEG_TO_LIN(lpcbtcw16->lpcs->lpszName);
-	else
-            lpcbtcw32->lpcs->lpszName = (LPSTR)lpcbtcw16->lpcs->lpszName;
-
-	if (HIWORD(lpcbtcw16->lpcs->lpszClass))
-            lpcbtcw32->lpcs->lpszClass
-                = PTR_SEG_TO_LIN(lpcbtcw16->lpcs->lpszClass);
-	else
-            lpcbtcw32->lpcs->lpszClass = (LPSTR)lpcbtcw16->lpcs->lpszClass;
-
-	lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter;
-
-	*plParam = (LPARAM)lpcbtcw32;
-    }
-    else
-        HOOK_Map16To32Common( id, code, pwParam, plParam );
+    HOOK_Map16To32Common( id, code, pwParam, plParam, TRUE );
 }
 
 
@@ -224,35 +242,7 @@
 static void HOOK_Map16To32W(INT32 id, INT32 code, WPARAM32 *pwParam,
 			    LPARAM *plParam)
 {
-    if (id == WH_CBT && code == HCBT_CREATEWND)
-    {
-	LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(*plParam);
-	LPCREATESTRUCT16 lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs);
-	LPCBT_CREATEWND32W lpcbtcw32 = HeapAlloc( SystemHeap, 0,
-						  sizeof(*lpcbtcw32) );
-	lpcbtcw32->lpcs = HeapAlloc( SystemHeap, 0,
-				     sizeof(*lpcbtcw32->lpcs) );
-
-	STRUCT32_CREATESTRUCT16to32A( lpcs16,
-				      (LPCREATESTRUCT32A)lpcbtcw32->lpcs );
-
-	if (HIWORD(lpcs16->lpszName))
-            lpcbtcw32->lpcs->lpszName = HEAP_strdupAtoW( SystemHeap, 0,
-                                            PTR_SEG_TO_LIN(lpcs16->lpszName) );
-	else
-            lpcbtcw32->lpcs->lpszName = (LPWSTR)lpcs16->lpszName;
-
-	if (HIWORD(lpcs16->lpszClass))
-            lpcbtcw32->lpcs->lpszClass = HEAP_strdupAtoW( SystemHeap, 0,
-                                           PTR_SEG_TO_LIN(lpcs16->lpszClass) );
-	else
-            lpcbtcw32->lpcs->lpszClass = (LPWSTR)lpcs16->lpszClass;
-
-	lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter;
-
-	*plParam = (LPARAM)lpcbtcw32;
-    }
-    else HOOK_Map16To32Common( id, code, pwParam, plParam );
+    HOOK_Map16To32Common( id, code, pwParam, plParam, FALSE );
 }
 
 
@@ -261,56 +251,82 @@
  */
 static void HOOK_UnMap16To32Common(INT32 id, INT32 code, WPARAM32 wParamOrig,
 				   LPARAM lParamOrig, WPARAM32 wParam,
-				   LPARAM lParam)
+				   LPARAM lParam, BOOL32 bA)
 {
     switch (id)
     {
-      case WH_MSGFILTER:
-      case WH_SYSMSGFILTER:
-      case WH_JOURNALRECORD:
-      case WH_JOURNALPLAYBACK:
-      {
-	  HeapFree( SystemHeap, 0, (LPVOID)lParam );
-	  break;
-      }
-
-      case WH_GETMESSAGE:
-      {
-	  LPMSG16 lpmsg16 = PTR_SEG_TO_LIN(lParamOrig);
-	  STRUCT32_MSG32to16( (LPMSG32)lParam, lpmsg16 );
-	  HeapFree( SystemHeap, 0, (LPVOID)lParam );
-	  break;
-      }
-
-      case WH_MOUSE:
-      case WH_DEBUG:
-	HeapFree( SystemHeap, 0, (LPVOID)lParam );
-	break;
-
-	/* I don't think any of these need to be copied */
-      case WH_CBT:
-	switch (code)
-	{
-	  case HCBT_ACTIVATE:
-	  case HCBT_CLICKSKIPPED:
-	  case HCBT_MOVESIZE:
-	    HeapFree( SystemHeap, 0, (LPVOID)lParam);
+	case WH_MSGFILTER:
+	case WH_SYSMSGFILTER:
+	case WH_JOURNALRECORD:
+	case WH_JOURNALPLAYBACK:
+      
+	    HeapFree( SystemHeap, 0, (LPVOID)lParam );
 	    break;
+
+	case WH_CALLWNDPROC:
+	{
+            void          (*localUnMap)(UINT32, WPARAM32, LPARAM)
+                            = (bA) ? WINPROC_UnmapMsg16To32A : WINPROC_UnmapMsg16To32W;
+            LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)lParam;
+
+            (*localUnMap)(lpcwp32->message, lpcwp32->wParam, lpcwp32->lParam );
+	    HeapFree( SystemHeap, 0, lpcwp32 );
+            break;
 	}
-	break;
 
-      case WH_SHELL:
-      case WH_KEYBOARD:
-	break;
+	case WH_GETMESSAGE:
+        {
+	    LPMSG16 lpmsg16 = PTR_SEG_TO_LIN(lParamOrig);
+	    STRUCT32_MSG32to16( (LPMSG32)lParam, lpmsg16 );
+	    HeapFree( SystemHeap, 0, (LPVOID)lParam );
+	    break;
+        }
 
-      case WH_CALLWNDPROC:
-      case WH_HARDWARE:
-	fprintf(stderr, "Can't map hook id: %d\n", id);
-	break;
+        case WH_MOUSE:
+        case WH_DEBUG:
 
-      default:
-	fprintf(stderr, "Unknown hook id: %d\n", id);
-	return;
+	    HeapFree( SystemHeap, 0, (LPVOID)lParam );
+	    break;
+
+        case WH_CBT:
+	    switch (code)
+  	    {
+	      case HCBT_CREATEWND:
+	      {
+		LPCBT_CREATEWND32A lpcbtcw32 = (LPCBT_CREATEWND32A)lParam;
+		LPCBT_CREATEWND16  lpcbtcw16 = PTR_SEG_TO_LIN(lParamOrig);
+
+		if( !bA )
+		{
+		   if (HIWORD(lpcbtcw32->lpcs->lpszName))
+                       HeapFree( SystemHeap, 0, (LPWSTR)lpcbtcw32->lpcs->lpszName );
+		   if (HIWORD(lpcbtcw32->lpcs->lpszClass))
+                       HeapFree( SystemHeap, 0, (LPWSTR)lpcbtcw32->lpcs->lpszClass );
+		}
+
+		lpcbtcw16->hwndInsertAfter = lpcbtcw32->hwndInsertAfter;
+
+		HeapFree( SystemHeap, 0, lpcbtcw32->lpcs );
+	      } /* fall through */
+
+	      case HCBT_ACTIVATE:
+	      case HCBT_CLICKSKIPPED:
+	      case HCBT_MOVESIZE:
+
+	        HeapFree( SystemHeap, 0, (LPVOID)lParam);
+	        break;
+	    }
+  	    break;
+
+        case WH_SHELL:
+        case WH_KEYBOARD:
+	    break;
+
+        case WH_HARDWARE:
+	case WH_FOREGROUNDIDLE:
+	case WH_CALLWNDPROCRET:
+	    fprintf(stderr, "\t[%i] skipping unmap\n", id);
+  	    break;
     }
 }
 
@@ -322,16 +338,8 @@
 			      LPARAM lParamOrig, WPARAM32 wParam,
 			      LPARAM lParam)
 {
-    if (id == WH_CBT && code == HCBT_CREATEWND)
-    {
-	LPCBT_CREATEWND32A lpcbtcw32 = (LPCBT_CREATEWND32A)lParam;
-	HeapFree( SystemHeap, 0, lpcbtcw32->lpcs );
-	HeapFree( SystemHeap, 0, lpcbtcw32 );
-    }
-    else
-      HOOK_UnMap16To32Common( id, code, wParamOrig, lParamOrig, wParam,
-			      lParam);
-    return;
+    HOOK_UnMap16To32Common( id, code, wParamOrig, lParamOrig, wParam,
+			    lParam, TRUE );
 }
 
 
@@ -342,18 +350,8 @@
 			      LPARAM lParamOrig, WPARAM32 wParam,
 			      LPARAM lParam)
 {
-    if (id == WH_CBT && code == HCBT_CREATEWND)
-    {
-	LPCBT_CREATEWND32W lpcbtcw32 = (LPCBT_CREATEWND32W)lParam;
-	if (HIWORD(lpcbtcw32->lpcs->lpszName))
-            HeapFree( SystemHeap, 0, (LPWSTR)lpcbtcw32->lpcs->lpszName );
-	if (HIWORD(lpcbtcw32->lpcs->lpszClass))
-            HeapFree( SystemHeap, 0, (LPWSTR)lpcbtcw32->lpcs->lpszClass );
-	HeapFree( SystemHeap, 0, lpcbtcw32->lpcs );
-	HeapFree( SystemHeap, 0, lpcbtcw32 );
-    }
-    else
-      HOOK_UnMap16To32Common(id, code, wParamOrig, lParamOrig, wParam, lParam);
+    HOOK_UnMap16To32Common( id, code, wParamOrig, lParamOrig, wParam, 
+			    lParam, FALSE );
 }
 
 
@@ -361,7 +359,7 @@
  *           HOOK_Map32To16Common
  */
 static void HOOK_Map32To16Common(INT32 id, INT32 code, WPARAM32 *pwParam,
-				 LPARAM *plParam)
+				 LPARAM *plParam, BOOL32 bA)
 {
     switch (id)
     {
@@ -393,6 +391,22 @@
 	  break;
       }
 
+      case WH_CALLWNDPROC:
+      {
+          INT32       (*localMap)(UINT32, WPARAM32, UINT16*, WPARAM16*, LPARAM*)
+                          = (bA) ? WINPROC_MapMsg32ATo16 : WINPROC_MapMsg32WTo16;
+          LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)*plParam;
+	  LPCWPSTRUCT16   lpcwp16 = SEGPTR_NEW( CWPSTRUCT16 );
+
+          lpcwp16->hwnd = lpcwp32->hwnd;
+          lpcwp16->lParam = lpcwp32->lParam;
+
+         (*localMap)(lpcwp32->message, lpcwp32->wParam,
+                    &lpcwp16->message, &lpcwp16->wParam, &lpcwp16->lParam );
+	  *plParam = (LPARAM)SEGPTR_GET( lpcwp16 );
+          break;
+      }
+
       case WH_CBT:
 	switch (code)
 	{
@@ -402,8 +416,8 @@
 	      LPCBTACTIVATESTRUCT16 lpcas16 =SEGPTR_NEW( CBTACTIVATESTRUCT16 );
 
 	      lpcas16->fMouse     = lpcas32->fMouse;
-	      lpcas16->hWndActive = lpcas32->hWndActive
-;
+	      lpcas16->hWndActive = lpcas32->hWndActive;
+
 	      *plParam = (LPARAM)SEGPTR_GET( lpcas16 );
 	      break;
 	  }
@@ -470,14 +484,10 @@
       case WH_KEYBOARD:
 	break;
 
-      case WH_CALLWNDPROC:
       case WH_HARDWARE:
-	fprintf(stderr, "Can't map hook id: %d\n", id);
-	break;
-
-      default:
-	fprintf(stderr, "Unknown hook id: %d\n", id);
-	return;
+      case WH_FOREGROUNDIDLE:
+      case WH_CALLWNDPROCRET:
+	fprintf(stderr,"\t[%i] 32to16 translation unimplemented\n", id);
     }
 }
 
@@ -513,7 +523,7 @@
 
 	*plParam = (LPARAM)SEGPTR_GET( lpcbtcw16 );
     }
-    else HOOK_Map32To16Common(id, code, pwParam, plParam);
+    else HOOK_Map32To16Common(id, code, pwParam, plParam, TRUE);
 }
 
 
@@ -542,7 +552,7 @@
 
 	*plParam = (LPARAM)SEGPTR_GET( lpcbtcw16 );
     }
-    else HOOK_Map32To16Common(id, code, pwParam, plParam);
+    else HOOK_Map32To16Common(id, code, pwParam, plParam, FALSE);
 }
 
 
@@ -551,7 +561,7 @@
  */
 static void HOOK_UnMap32To16Common(INT32 id, INT32 code, WPARAM32 wParamOrig,
 				   LPARAM lParamOrig, WPARAM32 wParam,
-				   LPARAM lParam)
+				   LPARAM lParam, BOOL32 bA)
 {
     switch (id)
     {
@@ -564,6 +574,18 @@
 	SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
 	break;
 
+      case WH_CALLWNDPROC:
+      {
+          void          (*localUnMap)(UINT32, WPARAM16, LPARAM)
+                          = (bA) ? WINPROC_UnmapMsg32ATo16 : WINPROC_UnmapMsg32WTo16;
+          LPCWPSTRUCT16   lpcwp16 = (LPCWPSTRUCT16)PTR_SEG_TO_LIN(lParam);
+	  LPCWPSTRUCT32   lpcwp32 = (LPCWPSTRUCT32)lParamOrig;
+
+          (*localUnMap)(lpcwp32->message, lpcwp16->wParam, lpcwp16->lParam );
+	  SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
+          break;
+      }
+
       case WH_GETMESSAGE:
       {
 	  LPMSG32 lpmsg32 = (LPMSG32)lParamOrig;
@@ -576,11 +598,29 @@
       case WH_CBT:
 	switch (code)
 	{
+	  case HCBT_CREATEWND:
+	  {
+	       LPCBT_CREATEWND32A lpcbtcw32 = (LPCBT_CREATEWND32A)(lParamOrig);
+               LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(lParam);
+               LPCREATESTRUCT16  lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs);
+
+               if (HIWORD(lpcs16->lpszName))
+                   SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszName) );
+
+               if (HIWORD(lpcs16->lpszClass))
+                   SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszClass) );
+
+	       lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter;
+
+               SEGPTR_FREE( lpcs16 );
+	  } /* fall through */
+
 	  case HCBT_ACTIVATE:
 	  case HCBT_CLICKSKIPPED:
 	  case HCBT_MOVESIZE:
-	    SEGPTR_FREE( (LPVOID)lParam );
-	    break;
+
+	       SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) );
+	       break;
 	}
 	break;
 
@@ -588,14 +628,10 @@
       case WH_KEYBOARD:
 	break;
 
-      case WH_CALLWNDPROC:
       case WH_HARDWARE:
-	fprintf(stderr, "Can't map hook id: %d\n", id);
-	break;
-
-      default:
-	fprintf(stderr, "Unknown hook id: %d\n", id);
-	return;
+      case WH_FOREGROUNDIDLE:
+      case WH_CALLWNDPROCRET:
+	fprintf(stderr, "\t[%i] skipping unmap\n", id);
     }
 }
 
@@ -607,24 +643,8 @@
 			      LPARAM lParamOrig, WPARAM32 wParam,
 			      LPARAM lParam)
 {
-    if (id == WH_CBT && code == HCBT_CREATEWND)
-    {
-	LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(lParam);
-	LPCREATESTRUCT16 lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs);
-
-	if (HIWORD(lpcs16->lpszName))
-	  SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszName) );
-
-	if (HIWORD(lpcs16->lpszClass))
-	  SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszClass) );
-
-	SEGPTR_FREE( lpcs16 );
-	SEGPTR_FREE( lpcbtcw16 );
-    }
-    else
-      return HOOK_UnMap32To16Common( id, code, wParamOrig, lParamOrig, wParam,
-				     lParam );
-    return;
+    HOOK_UnMap32To16Common( id, code, wParamOrig, lParamOrig, wParam,
+			    lParam, TRUE );
 }
 
 
@@ -635,7 +655,8 @@
 			      LPARAM lParamOrig, WPARAM32 wParam,
 			      LPARAM lParam)
 {
-    HOOK_UnMap32ATo16( id, code, wParamOrig, lParamOrig, wParam, lParam );
+    HOOK_UnMap32To16Common( id, code, wParamOrig, lParamOrig, wParam,
+                            lParam, FALSE );
 }
 
 
@@ -841,7 +862,6 @@
     data->id          = id;
     data->ownerQueue  = hQueue;
     data->ownerModule = hInst;
-    data->inHookProc  = 0;
     data->flags       = type;
 
     /* Insert it in the correct linked list */
@@ -876,7 +896,7 @@
     dprintf_hook( stddeb, "Removing hook %04x\n", hook );
 
     if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return FALSE;
-    if (data->inHookProc)
+    if (data->flags & HOOK_INUSE)
     {
         /* Mark it for deletion later on */
         dprintf_hook( stddeb, "Hook still running, deletion delayed\n" );
@@ -952,7 +972,7 @@
     if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     prevHook = queue->hCurHook;
     queue->hCurHook = hook;
-    data->inHookProc = TRUE;
+    data->flags |= HOOK_INUSE;
 
     dprintf_hook( stddeb, "Calling hook %04x: %d %08x %08lx\n",
                   hook, code, wParam, lParam );
@@ -965,7 +985,7 @@
 
     dprintf_hook( stddeb, "Ret hook %04x = %08lx\n", hook, ret );
 
-    data->inHookProc = FALSE;
+    data->flags &= ~HOOK_INUSE;
     queue->hCurHook = prevHook;
 
     if (UnMapFunc)
@@ -1100,7 +1120,7 @@
 	      next = hptr->next;
 	      if( hptr->ownerModule == hModule )
                 {
-                  hptr->inHookProc = 0;
+                  hptr->flags &= HOOK_MAPTYPE;
                   HOOK_RemoveHook(hook);
                 }
 	      hook = next;
@@ -1130,7 +1150,7 @@
 	  hptr = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook);
 	  if( hptr && hptr->ownerQueue == hQueue )
 	    {
-	      hptr->inHookProc = 0;
+	      hptr->flags &= HOOK_MAPTYPE;
 	      HOOK_RemoveHook(hook);
 	    }
 	  hook = next;