Made access to the wnd struct thread-safe.

diff --git a/controls/button.c b/controls/button.c
index fe2f98f..6c59172 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -79,6 +79,7 @@
                               WPARAM wParam, LPARAM lParam )
 {
     RECT rect;
+    LRESULT retvalue;
     POINT pt = { LOWORD(lParam), HIWORD(lParam) };
     WND *wndPtr = WIN_FindWndPtr(hWnd);
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
@@ -87,6 +88,7 @@
     switch (uMsg)
     {
     case WM_GETDLGCODE:
+        WIN_ReleaseWndPtr(wndPtr);
         switch(style)
         {
         case BS_PUSHBUTTON:      return DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON;
@@ -109,12 +111,18 @@
             checkBoxWidth  = bmp.bmWidth / 4;
             checkBoxHeight = bmp.bmHeight / 3;
         }
-        if (style < 0L || style >= MAX_BTN_TYPE) return -1; /* abort */
+        if (style < 0L || style >= MAX_BTN_TYPE)
+        {
+            WIN_ReleaseWndPtr(wndPtr);
+            return -1; /* abort */
+        }
         infoPtr->state = BUTTON_UNCHECKED;
         infoPtr->hFont = 0;
+        WIN_ReleaseWndPtr(wndPtr);
         return 0;
 
     case WM_ERASEBKGND:
+        WIN_ReleaseWndPtr(wndPtr);
         return 1;
 
     case WM_PAINT:
@@ -171,6 +179,7 @@
         break;
 
     case WM_NCHITTEST:
+        WIN_ReleaseWndPtr(wndPtr);
         if(style == BS_GROUPBOX) return HTTRANSPARENT;
         return DefWindowProcA( hWnd, uMsg, wParam, lParam );
 
@@ -178,6 +187,7 @@
         DEFWND_SetText( wndPtr, (LPCSTR)lParam );
 	if( wndPtr->dwStyle & WS_VISIBLE )
             PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+        WIN_ReleaseWndPtr(wndPtr);
         return 0;
 
     case WM_SETFONT:
@@ -187,7 +197,9 @@
         break;
 
     case WM_GETFONT:
-        return infoPtr->hFont;
+        retvalue = infoPtr->hFont;
+        WIN_ReleaseWndPtr(wndPtr);
+        return retvalue;
 
     case WM_SETFOCUS:
         infoPtr->state |= BUTTON_HASFOCUS;
@@ -219,7 +231,9 @@
 
     case BM_GETCHECK16:
     case BM_GETCHECK:
-        return infoPtr->state & 3;
+        retvalue = infoPtr->state & 3;
+        WIN_ReleaseWndPtr(wndPtr);
+        return retvalue;
 
     case BM_SETCHECK16:
     case BM_SETCHECK:
@@ -242,7 +256,9 @@
 
     case BM_GETSTATE16:
     case BM_GETSTATE:
-        return infoPtr->state;
+        retvalue = infoPtr->state;
+        WIN_ReleaseWndPtr(wndPtr);
+        return retvalue;
 
     case BM_SETSTATE16:
     case BM_SETSTATE:
@@ -260,8 +276,10 @@
         break;
 
     default:
+        WIN_ReleaseWndPtr(wndPtr);
         return DefWindowProcA(hWnd, uMsg, wParam, lParam);
     }
+    WIN_ReleaseWndPtr(wndPtr);
     return 0;
 }
 
@@ -522,11 +540,14 @@
     start = sibling = GetNextDlgGroupItem( parent, wndPtr->hwndSelf, TRUE );
     do
     {
+        WND *tmpWnd;
         if (!sibling) break;
+        tmpWnd = WIN_FindWndPtr(sibling);
         if ((wndPtr->hwndSelf != sibling) &&
-            ((WIN_FindWndPtr(sibling)->dwStyle & 0x0f) == BS_AUTORADIOBUTTON))
+            ((tmpWnd->dwStyle & 0x0f) == BS_AUTORADIOBUTTON))
             SendMessageA( sibling, BM_SETCHECK, BUTTON_UNCHECKED, 0 );
         sibling = GetNextDlgGroupItem( parent, sibling, FALSE );
+        WIN_ReleaseWndPtr(tmpWnd);
     } while (sibling != start);
 }
 
diff --git a/controls/combo.c b/controls/combo.c
index 47fa929..1778402 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -1286,6 +1286,7 @@
 LRESULT WINAPI ComboWndProc( HWND hwnd, UINT message,
                              WPARAM wParam, LPARAM lParam )
 {
+    LRESULT retvalue;
     WND*	pWnd = WIN_FindWndPtr(hwnd);
    
     if( pWnd )
@@ -1302,58 +1303,59 @@
 	/* System messages */
 
      	case WM_NCCREATE: 
-		return COMBO_NCCreate(pWnd, lParam);
-
+                retvalue = COMBO_NCCreate(pWnd, lParam);
+                goto END;
      	case WM_NCDESTROY: 
 		COMBO_NCDestroy(lphc);
 		break;
 
      	case WM_CREATE: 
-		return COMBO_Create(lphc, pWnd, lParam);
+                retvalue = COMBO_Create(lphc, pWnd, lParam);
+                goto END;
 
      	case WM_PAINT:
 		/* wParam may contain a valid HDC! */
-		return COMBO_Paint(lphc, wParam);
-
+		retvalue = COMBO_Paint(lphc, wParam);
+                goto END;
 	case WM_ERASEBKGND:
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
      	case WM_GETDLGCODE: 
-		return (LRESULT)(DLGC_WANTARROWS | DLGC_WANTCHARS);
-
+		retvalue = (LRESULT)(DLGC_WANTARROWS | DLGC_WANTCHARS);
+                goto END;
 	case WM_SIZE:
 	        if( lphc->hWndLBox && 
 		  !(lphc->wState & CBF_NORESIZE) ) COMBO_Size( lphc );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_SETFONT:
 		COMBO_Font( lphc, (HFONT16)wParam, (BOOL)lParam );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_GETFONT:
-		return (LRESULT)lphc->hFont;
-
+		retvalue = (LRESULT)lphc->hFont;
+                goto END;
 	case WM_SETFOCUS:
 		if( lphc->wState & CBF_EDIT )
 		    SetFocus( lphc->hWndEdit );
 		else
 		    COMBO_SetFocus( lphc );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_KILLFOCUS:
 #define hwndFocus ((HWND16)wParam)
 		if( !hwndFocus ||
 		    (hwndFocus != lphc->hWndEdit && hwndFocus != lphc->hWndLBox ))
 		    COMBO_KillFocus( lphc );
 #undef hwndFocus
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_COMMAND:
-		return COMBO_Command( lphc, wParam, (HWND)lParam );
-
+		retvalue = COMBO_Command( lphc, wParam, (HWND)lParam );
+                goto END;
 	case WM_GETTEXT:
-		return COMBO_GetText( lphc, (UINT)wParam, (LPSTR)lParam );
-
+		retvalue = COMBO_GetText( lphc, (UINT)wParam, (LPSTR)lParam );
+                goto END;
 	case WM_SETTEXT:
 	case WM_GETTEXTLENGTH:
 	case WM_CLEAR:
@@ -1361,21 +1363,24 @@
         case WM_PASTE:
 	case WM_COPY:
 		if( lphc->wState & CBF_EDIT )
-		    return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
-		return CB_ERR;
-
+                {
+                    retvalue = SendMessageA( lphc->hWndEdit, message, wParam, lParam );
+                    goto END;
+                }
+		retvalue = CB_ERR;
+                goto END;
 	case WM_DRAWITEM:
 	case WM_DELETEITEM:
 	case WM_COMPAREITEM:
 	case WM_MEASUREITEM:
-		return COMBO_ItemOp( lphc, message, wParam, lParam );
-
+		retvalue = COMBO_ItemOp( lphc, message, wParam, lParam );
+                goto END;
 	case WM_ENABLE:
 		if( lphc->wState & CBF_EDIT )
 		    EnableWindow( lphc->hWndEdit, (BOOL)wParam ); 
 		EnableWindow( lphc->hWndLBox, (BOOL)wParam );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_SETREDRAW:
 		if( wParam )
 		    lphc->wState &= ~CBF_NOREDRAW;
@@ -1385,8 +1390,8 @@
 		if( lphc->wState & CBF_EDIT )
 		    SendMessageA( lphc->hWndEdit, message, wParam, lParam );
 		SendMessageA( lphc->hWndLBox, message, wParam, lParam );
-		return 0;
-		
+		retvalue = 0;
+		goto END;
 	case WM_SYSKEYDOWN:
 		if( KEYDATA_ALT & HIWORD(lParam) )
 		    if( wParam == VK_UP || wParam == VK_DOWN )
@@ -1396,106 +1401,113 @@
 	case WM_CHAR:
 	case WM_KEYDOWN:
 		if( lphc->wState & CBF_EDIT )
-		    return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
+		    retvalue = SendMessageA( lphc->hWndEdit, message, wParam, lParam );
 		else
-		    return SendMessageA( lphc->hWndLBox, message, wParam, lParam );
+		    retvalue = SendMessageA( lphc->hWndLBox, message, wParam, lParam );
 
 	case WM_LBUTTONDOWN: 
 		if( !(lphc->wState & CBF_FOCUSED) ) SetFocus( lphc->self->hwndSelf );
 		if( lphc->wState & CBF_FOCUSED ) COMBO_LButtonDown( lphc, lParam );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_LBUTTONUP:
 		COMBO_LButtonUp( lphc, lParam );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case WM_MOUSEMOVE: 
 		if( lphc->wState & CBF_CAPTURE ) 
 		    COMBO_MouseMove( lphc, wParam, lParam );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	/* Combo messages */
 
 	case CB_ADDSTRING16:
 		if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_ADDSTRING:
-		return SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam);
+                goto END;
 	case CB_INSERTSTRING16:
 		wParam = (INT)(INT16)wParam;
 		if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_INSERTSTRING:
-		return SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
+                goto END;
 	case CB_DELETESTRING16:
 	case CB_DELETESTRING:
-		return SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
+                goto END;
 	case CB_SELECTSTRING16:
 		wParam = (INT)(INT16)wParam;
 		if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_SELECTSTRING:
-		return COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam );
-
+		retvalue = COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam );
+                goto END;
 	case CB_FINDSTRING16:
 		wParam = (INT)(INT16)wParam;
 		if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_FINDSTRING:
-		return SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
+                goto END;
 	case CB_FINDSTRINGEXACT16:
 		wParam = (INT)(INT16)wParam;
 		if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_FINDSTRINGEXACT:
-		return SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT, 
+		retvalue = SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT, 
 						       wParam, lParam );
+                goto END;
 	case CB_SETITEMHEIGHT16:
 		wParam = (INT)(INT16)wParam;	/* signed integer */
 	case CB_SETITEMHEIGHT:
-		return COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
-
+		retvalue = COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
+                goto END;
 	case CB_GETITEMHEIGHT16:
 		wParam = (INT)(INT16)wParam;
 	case CB_GETITEMHEIGHT:
 		if( (INT)wParam >= 0 )	/* listbox item */
-		    return SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
-		return (lphc->RectEdit.bottom - lphc->RectEdit.top);
-
+                {
+                    retvalue = SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
+                    goto END;
+                }
+                retvalue = (lphc->RectEdit.bottom - lphc->RectEdit.top);
+                goto END;
 	case CB_RESETCONTENT16: 
 	case CB_RESETCONTENT:
 		SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 );
 		CBPaintText( lphc, 0 );
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case CB_INITSTORAGE:
-		return SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
+                goto END;
 	case CB_GETHORIZONTALEXTENT:
-		return SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
+                goto END;
 	case CB_SETHORIZONTALEXTENT:
-		return SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
+                goto END;
 	case CB_GETTOPINDEX:
-		return SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
+                goto END;
 	case CB_GETLOCALE:
-		return SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
+                goto END;
 	case CB_SETLOCALE:
-		return SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
+                goto END;
 	case CB_GETDROPPEDWIDTH:
 		if( lphc->droppedWidth )
-		    return lphc->droppedWidth;
-		return lphc->RectCombo.right - lphc->RectCombo.left - 
+                {
+                    retvalue = lphc->droppedWidth;
+                    goto END;
+                }
+		retvalue = lphc->RectCombo.right - lphc->RectCombo.left - 
 		           (lphc->wState & CBF_EDIT) ? CBitOffset : 0;
-
+                goto END;
 	case CB_SETDROPPEDWIDTH:
 		if( (CB_GETTYPE(lphc) != CBS_SIMPLE) &&
 		    (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam;
-		return CB_ERR;
-
+		retvalue = CB_ERR;
+                goto END;
 	case CB_GETDROPPEDCONTROLRECT16:
 		lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 		if( lParam ) 
@@ -1504,22 +1516,23 @@
 		    CBGetDroppedControlRect( lphc, &r );
 		    CONV_RECT32TO16( &r, (LPRECT16)lParam );
 		}
-		return CB_OKAY;
-
+		retvalue = CB_OKAY;
+                goto END;
 	case CB_GETDROPPEDCONTROLRECT:
 		if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
-		return CB_OKAY;
-
+		retvalue = CB_OKAY;
+                goto END;
 	case CB_GETDROPPEDSTATE16:
 	case CB_GETDROPPEDSTATE:
-		return (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
-
+		retvalue = (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
+                goto END;
 	case CB_DIR16: 
                 lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
                 /* fall through */
 	case CB_DIR:
-		return COMBO_Directory( lphc, (UINT)wParam, 
+		retvalue = COMBO_Directory( lphc, (UINT)wParam, 
 				       (LPSTR)lParam, (message == CB_DIR));
+                goto END;
 	case CB_SHOWDROPDOWN16:
 	case CB_SHOWDROPDOWN:
 		if( CB_GETTYPE(lphc) != CBS_SIMPLE )
@@ -1533,16 +1546,16 @@
 			if( lphc->wState & CBF_DROPPED ) 
 		            CBRollUp( lphc, FALSE, TRUE );
 		}
-		return TRUE;
-
+		retvalue = TRUE;
+                goto END;
 	case CB_GETCOUNT16: 
 	case CB_GETCOUNT:
-		return SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
+                goto END;
 	case CB_GETCURSEL16: 
 	case CB_GETCURSEL:
-		return SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
+                goto END;
 	case CB_SETCURSEL16:
 		wParam = (INT)(INT16)wParam;
 	case CB_SETCURSEL:
@@ -1554,29 +1567,29 @@
 		    CBPaintText( lphc, 0 );
 		    lphc->wState &= ~CBF_SELCHANGE;
 		}
-	        return lParam;
-
+	        retvalue = lParam;
+                goto END;
 	case CB_GETLBTEXT16: 
 		wParam = (INT)(INT16)wParam;
 		lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
 	case CB_GETLBTEXT:
-		return SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
+                goto END;
 	case CB_GETLBTEXTLEN16: 
 		wParam = (INT)(INT16)wParam;
 	case CB_GETLBTEXTLEN:
-		return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
+                goto END;
 	case CB_GETITEMDATA16:
 		wParam = (INT)(INT16)wParam;
 	case CB_GETITEMDATA:
-		return SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
+                goto END;
 	case CB_SETITEMDATA16:
 		wParam = (INT)(INT16)wParam;
 	case CB_SETITEMDATA:
-		return SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
-
+		retvalue = SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
+                goto END;
 	case CB_GETEDITSEL16: 
 		wParam = lParam = 0;   /* just in case */
 	case CB_GETEDITSEL:
@@ -1584,37 +1597,48 @@
 		{
 		    INT	a, b;
 
-		    return SendMessageA( lphc->hWndEdit, EM_GETSEL,
+		    retvalue = SendMessageA( lphc->hWndEdit, EM_GETSEL,
 					   (wParam) ? wParam : (WPARAM)&a,
 					   (lParam) ? lParam : (LPARAM)&b );
+                    goto END;
 		}
-		return CB_ERR;
-
+		retvalue = CB_ERR;
+                goto END;
 	case CB_SETEDITSEL16: 
 	case CB_SETEDITSEL:
 		if( lphc->wState & CBF_EDIT ) 
-		    return SendMessageA( lphc->hWndEdit, EM_SETSEL, 
+                {
+                    retvalue = SendMessageA( lphc->hWndEdit, EM_SETSEL,
 			  (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) );
-		return CB_ERR;
-
+                    goto END;
+                }
+		retvalue = CB_ERR;
+                goto END;
 	case CB_SETEXTENDEDUI16:
 	case CB_SETEXTENDEDUI:
-		if( CB_GETTYPE(lphc) == CBS_SIMPLE ) return CB_ERR;
-
+                if( CB_GETTYPE(lphc) == CBS_SIMPLE )
+                {
+                    retvalue = CB_ERR;
+                    goto END;
+                }
 		if( wParam )
 		    lphc->wState |= CBF_EUI;
 		else lphc->wState &= ~CBF_EUI;
-		return CB_OKAY;
-
+		retvalue = CB_OKAY;
+                goto END;
 	case CB_GETEXTENDEDUI16:
 	case CB_GETEXTENDEDUI:
-		return (lphc->wState & CBF_EUI) ? TRUE : FALSE;
-
+		retvalue = (lphc->wState & CBF_EUI) ? TRUE : FALSE;
+                goto END;
 	case (WM_USER + 0x1B):
 	        WARN(combo, "[%04x]: undocumented msg!\n", hwnd );
     }
-    return DefWindowProcA(hwnd, message, wParam, lParam);
+    retvalue = DefWindowProcA(hwnd, message, wParam, lParam);
+    goto END;
   }
-  return CB_ERR;
+    retvalue = CB_ERR;
+END:
+    WIN_ReleaseWndPtr(pWnd);
+    return retvalue;
 }
 
diff --git a/controls/desktop.c b/controls/desktop.c
index 96f5a34..f2573f8 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -24,8 +24,12 @@
  */
 int DESKTOP_GetScreenWidth()
 {
+    int retvalue;
   DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
-  return MONITOR_GetWidth(pDesktop->pPrimaryMonitor);
+    retvalue = MONITOR_GetWidth(pDesktop->pPrimaryMonitor);
+    WIN_ReleaseDesktop();
+    return retvalue;
+    
 }
 
 /***********************************************************************
@@ -35,8 +39,12 @@
  */
 int DESKTOP_GetScreenHeight()
 {
+    int retvalue;
   DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
-  return MONITOR_GetHeight(pDesktop->pPrimaryMonitor);
+    retvalue = MONITOR_GetHeight(pDesktop->pPrimaryMonitor);
+    WIN_ReleaseDesktop();
+    return retvalue;
+    
 }
 
 /***********************************************************************
@@ -46,8 +54,12 @@
  */
 int DESKTOP_GetScreenDepth()
 {
+    int retvalue;
   DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
-  return MONITOR_GetDepth(pDesktop->pPrimaryMonitor);
+    retvalue = MONITOR_GetDepth(pDesktop->pPrimaryMonitor);
+    WIN_ReleaseDesktop();
+    return retvalue;
+
 }
 
 /***********************************************************************
@@ -119,6 +131,8 @@
     if (Wnd->hrgnUpdate > 1) DeleteObject( Wnd->hrgnUpdate );
     Wnd->hrgnUpdate = 0;
 
+    WIN_ReleaseWndPtr(Wnd);
+    
     GetClientRect( hwnd, &rect );    
 
     /* Paint desktop pattern (only if wall paper does not cover everything) */
@@ -173,6 +187,7 @@
 LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message,
                                WPARAM wParam, LPARAM lParam )
 {
+    LRESULT retvalue;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     DESKTOP *desktopPtr = (DESKTOP *)wndPtr->wExtra;
 
@@ -187,23 +202,36 @@
 	desktopPtr->hbitmapWallPaper = 0;
 	SetDeskPattern();
 	SetDeskWallPaper( (LPSTR)-1 );
-	return 1;
+        retvalue = 1;
+        goto END;
 	
     case WM_ERASEBKGND:
 	if (X11DRV_WND_GetXRootWindow(wndPtr) == 
 	    DefaultRootWindow(display))
-	  return 1;
-	return DESKTOP_DoEraseBkgnd( hwnd, (HDC)wParam, desktopPtr );
+        {
+            retvalue = 1;
+            goto END;
+        }
+        retvalue = DESKTOP_DoEraseBkgnd( hwnd, (HDC)wParam, desktopPtr );
+        goto END;
 
     case WM_SYSCOMMAND:
-	if ((wParam & 0xfff0) != SC_CLOSE) return 0;
+        if ((wParam & 0xfff0) != SC_CLOSE)
+        {
+            retvalue = 0;
+            goto END;
+        }
 	ExitWindows16( 0, 0 ); 
 
     case WM_SETCURSOR:
-        return (LRESULT)SetCursor16( LoadCursor16( 0, IDC_ARROW16 ) );
+        retvalue = (LRESULT)SetCursor16( LoadCursor16( 0, IDC_ARROW16 ) );
+        goto END;
     }
     
-    return 0;
+    retvalue = 0;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 /***********************************************************************
@@ -212,11 +240,14 @@
  */
 BOOL WINAPI PaintDesktop(HDC hdc)
 {
+    BOOL retvalue;
     HWND hwnd = GetDesktopWindow();
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     DESKTOP *desktopPtr = (DESKTOP *)wndPtr->wExtra;
+    retvalue = DESKTOP_DoEraseBkgnd( hwnd, hdc, desktopPtr );
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 
-    return DESKTOP_DoEraseBkgnd( hwnd, hdc, desktopPtr );
 }
 
 /***********************************************************************
@@ -270,6 +301,7 @@
 	desktopPtr->bitmapSize.cx = (bmp.bmWidth != 0) ? bmp.bmWidth : 1;
 	desktopPtr->bitmapSize.cy = (bmp.bmHeight != 0) ? bmp.bmHeight : 1;
     }
+    WIN_ReleaseDesktop();
     return TRUE;
 }
 
@@ -301,6 +333,7 @@
 	DeleteObject( hbitmap );
     }
     else desktopPtr->hbrushPattern = CreateSolidBrush( GetSysColor(COLOR_BACKGROUND) );
+    WIN_ReleaseDesktop();
     return TRUE;
 }
 
diff --git a/controls/edit.c b/controls/edit.c
index 125ed0f..0971dda 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -310,15 +310,21 @@
 	case WM_DESTROY:
 		DPRINTF_EDIT_MSG32("WM_DESTROY");
 		EDIT_WM_Destroy(wnd, es);
-		return 0;
+                result = 0;
+                goto END;
 
 	case WM_NCCREATE:
 		DPRINTF_EDIT_MSG32("WM_NCCREATE");
-		return EDIT_WM_NCCreate(wnd, (LPCREATESTRUCTA)lParam);
+                result = EDIT_WM_NCCreate(wnd, (LPCREATESTRUCTA)lParam);
+                goto END;
 	}
 
 	if (!es)
-		return DefWindowProcA(hwnd, msg, wParam, lParam);
+        {
+            result = DefWindowProcA(hwnd, msg, wParam, lParam);
+            goto END;
+        }
+
 
 	EDIT_LockBuffer(wnd, es);
 	switch (msg) {
@@ -633,7 +639,7 @@
 			wnd->dwStyle &= ~ES_READONLY;
 			es->style &= ~ES_READONLY;
 		}
-		return 1;
+                result = 1;
  		break;
 
 	case EM_SETWORDBREAKPROC16:
@@ -856,7 +862,10 @@
 		break;
 	}
 	EDIT_UnlockBuffer(wnd, es, FALSE);
+    END:
+        WIN_ReleaseWndPtr(wnd);
 	return result;
+        
 }
 
 
diff --git a/controls/icontitle.c b/controls/icontitle.c
index 38d5b78..82dd726 100644
--- a/controls/icontitle.c
+++ b/controls/icontitle.c
@@ -54,6 +54,7 @@
 	wndPtr->owner = wnd;	/* MDI depends on this */
 	wndPtr->dwStyle &= ~(WS_CAPTION | WS_BORDER);
 	if( wnd->dwStyle & WS_DISABLED ) wndPtr->dwStyle |= WS_DISABLED;
+        WIN_ReleaseWndPtr(wndPtr);
 	return hWnd;
     }
     return 0;
@@ -187,24 +188,25 @@
 LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg,
                                  WPARAM wParam, LPARAM lParam )
 {
+    LRESULT retvalue;
     WND *wnd = WIN_FindWndPtr( hWnd );
 
     switch( msg )
     {
 	case WM_NCHITTEST:
-	     return HTCAPTION;
-
+	     retvalue = HTCAPTION;
+             goto END;
 	case WM_NCMOUSEMOVE:
 	case WM_NCLBUTTONDBLCLK:
-	     return SendMessageA( wnd->owner->hwndSelf, msg, wParam, lParam );	
-
+	     retvalue = SendMessageA( wnd->owner->hwndSelf, msg, wParam, lParam );	
+             goto END;
 	case WM_ACTIVATE:
 	     if( wParam ) SetActiveWindow( wnd->owner->hwndSelf );
 	     /* fall through */
 
 	case WM_CLOSE:
-	     return 0;
-
+	     retvalue = 0;
+             goto END;
 	case WM_SHOWWINDOW:
 	     if( wnd && wParam )
 	     {
@@ -220,25 +222,30 @@
 				     titleRect.right, titleRect.bottom, 
 				     SWP_NOACTIVATE | SWP_NOZORDER );
 	     }
-	     return 0;
-
+	     retvalue = 0;
+             goto END;
 	case WM_ERASEBKGND:
 	     if( wnd )
 	     {
-		 WND* iconWnd = wnd->owner;
+		 WND* iconWnd = WIN_LockWndPtr(wnd->owner);
 
 		 if( iconWnd->dwStyle & WS_CHILD )
 		     lParam = SendMessageA( iconWnd->hwndSelf, WM_ISACTIVEICON, 0, 0 );
 		 else
 		     lParam = (iconWnd->hwndSelf == GetActiveWindow16());
 
+                 WIN_ReleaseWndPtr(iconWnd);
 		 if( ICONTITLE_Paint( wnd, (HDC)wParam, (BOOL)lParam ) )
 		     ValidateRect( hWnd, NULL );
-	         return 1;
+                 retvalue = 1;
+                 goto END;
 	     }
     }
 
-    return DefWindowProcA( hWnd, msg, wParam, lParam );
+    retvalue = DefWindowProcA( hWnd, msg, wParam, lParam );
+END:
+    WIN_ReleaseWndPtr(wnd);
+    return retvalue;
 }
 
 
diff --git a/controls/listbox.c b/controls/listbox.c
index 1c17bef..a298ff9 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2120,19 +2120,26 @@
     LRESULT ret;
     LB_DESCR *descr;
     WND *wnd = WIN_FindWndPtr( hwnd );
+    LRESULT retvalue;
 
     if (!wnd) return 0;
     if (!(descr = *(LB_DESCR **)wnd->wExtra))
     {
         if (msg == WM_CREATE)
         {
-            if (!LISTBOX_Create( wnd, NULL )) return -1;
+            if (!LISTBOX_Create( wnd, NULL ))
+            {
+                retvalue = -1;
+                goto END;
+            }
             TRACE(listbox, "creating wnd=%04x descr=%p\n",
 			 hwnd, *(LB_DESCR **)wnd->wExtra );
-            return 0;
+            retvalue = 0;
+            goto END;
         }
         /* Ignore all other messages before we get a WM_CREATE */
-        return DefWindowProcA( hwnd, msg, wParam, lParam );
+        retvalue = DefWindowProcA( hwnd, msg, wParam, lParam );
+        goto END;
     }
 
     TRACE(listbox, "[%04x]: msg %s wp %08x lp %08lx\n",
@@ -2142,104 +2149,133 @@
     case LB_RESETCONTENT16:
     case LB_RESETCONTENT:
         LISTBOX_ResetContent( wnd, descr );
-        return 0;
+        retvalue = 0;
+        goto END;
 
     case LB_ADDSTRING16:
         if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         /* fall through */
     case LB_ADDSTRING:
         wParam = LISTBOX_FindStringPos( wnd, descr, (LPCSTR)lParam, FALSE );
-        return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        goto END;
 
     case LB_INSERTSTRING16:
         if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         wParam = (INT)(INT16)wParam;
         /* fall through */
     case LB_INSERTSTRING:
-        return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        goto END;
 
     case LB_ADDFILE16:
         if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         /* fall through */
     case LB_ADDFILE:
         wParam = LISTBOX_FindFileStrPos( wnd, descr, (LPCSTR)lParam );
-        return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+        goto END;
 
     case LB_DELETESTRING16:
     case LB_DELETESTRING:
-        return LISTBOX_RemoveItem( wnd, descr, wParam );
+        retvalue = LISTBOX_RemoveItem( wnd, descr, wParam );
+        goto END;
 
     case LB_GETITEMDATA16:
     case LB_GETITEMDATA:
         if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
-            return LB_ERR;
-        return descr->items[wParam].data;
+        {
+            retvalue = LB_ERR;
+            goto END;
+        }
+        retvalue = descr->items[wParam].data;
+        goto END;
 
     case LB_SETITEMDATA16:
     case LB_SETITEMDATA:
         if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
-            return LB_ERR;
+        {
+            retvalue = LB_ERR;
+            goto END;
+        }
         descr->items[wParam].data = (DWORD)lParam;
-        return LB_OKAY;
+        retvalue = LB_OKAY;
+        goto END;
 
     case LB_GETCOUNT16:
     case LB_GETCOUNT:
-        return descr->nb_items;
+        retvalue = descr->nb_items;
+        goto END;
 
     case LB_GETTEXT16:
         lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         /* fall through */
     case LB_GETTEXT:
-        return LISTBOX_GetText( wnd, descr, wParam, (LPSTR)lParam );
+        retvalue = LISTBOX_GetText( wnd, descr, wParam, (LPSTR)lParam );
+        goto END;
 
     case LB_GETTEXTLEN16:
         /* fall through */
     case LB_GETTEXTLEN:
-        if (wParam >= descr->nb_items) return LB_ERR;
-        return (HAS_STRINGS(descr) ? strlen(descr->items[wParam].str)
+        if (wParam >= descr->nb_items)
+        {
+            retvalue = LB_ERR;
+            goto END;
+        }
+        retvalue = (HAS_STRINGS(descr) ? strlen(descr->items[wParam].str)
                                    : sizeof(DWORD));
+        goto END;
 
     case LB_GETCURSEL16:
     case LB_GETCURSEL:
-        return descr->selected_item;
+        retvalue = descr->selected_item;
+        goto END;
 
     case LB_GETTOPINDEX16:
     case LB_GETTOPINDEX:
-        return descr->top_item;
+        retvalue = descr->top_item;
+        goto END;
 
     case LB_GETITEMHEIGHT16:
     case LB_GETITEMHEIGHT:
-        return LISTBOX_GetItemHeight( wnd, descr, wParam );
+        retvalue = LISTBOX_GetItemHeight( wnd, descr, wParam );
+        goto END;
 
     case LB_SETITEMHEIGHT16:
         lParam = LOWORD(lParam);
         /* fall through */
     case LB_SETITEMHEIGHT:
-        return LISTBOX_SetItemHeight( wnd, descr, wParam, lParam );
+        retvalue = LISTBOX_SetItemHeight( wnd, descr, wParam, lParam );
+        goto END;
 
     case LB_ITEMFROMPOINT:
         {
             POINT pt = { LOWORD(lParam), HIWORD(lParam) };
             RECT rect = { 0, 0, descr->width, descr->height };
-            return MAKELONG( LISTBOX_GetItemFromPoint(wnd, descr, pt.x, pt.y),
+            retvalue = MAKELONG( LISTBOX_GetItemFromPoint(wnd, descr, pt.x, pt.y),
                              PtInRect( &rect, pt ) );
+            goto END;
         }
 
     case LB_SETCARETINDEX16:
     case LB_SETCARETINDEX:
-        return LISTBOX_SetCaretIndex( wnd, descr, wParam, !lParam );
+        retvalue = LISTBOX_SetCaretIndex( wnd, descr, wParam, !lParam );
+        goto END;
 
     case LB_GETCARETINDEX16:
     case LB_GETCARETINDEX:
-        return descr->focus_item;
+        retvalue = descr->focus_item;
+        goto END;
 
     case LB_SETTOPINDEX16:
     case LB_SETTOPINDEX:
-        return LISTBOX_SetTopItem( wnd, descr, wParam, TRUE );
+        retvalue = LISTBOX_SetTopItem( wnd, descr, wParam, TRUE );
+        goto END;
 
     case LB_SETCOLUMNWIDTH16:
     case LB_SETCOLUMNWIDTH:
-        return LISTBOX_SetColumnWidth( wnd, descr, wParam );
+        retvalue = LISTBOX_SetColumnWidth( wnd, descr, wParam );
+        goto END;
 
     case LB_GETITEMRECT16:
         {
@@ -2247,24 +2283,28 @@
             ret = LISTBOX_GetItemRect( wnd, descr, (INT16)wParam, &rect );
             CONV_RECT32TO16( &rect, (RECT16 *)PTR_SEG_TO_LIN(lParam) );
         }
-        return ret;
+        retvalue = ret;
+        goto END;
 
     case LB_GETITEMRECT:
-        return LISTBOX_GetItemRect( wnd, descr, wParam, (RECT *)lParam );
+        retvalue = LISTBOX_GetItemRect( wnd, descr, wParam, (RECT *)lParam );
+        goto END;
 
     case LB_FINDSTRING16:
         wParam = (INT)(INT16)wParam;
         if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         /* fall through */
     case LB_FINDSTRING:
-        return LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, FALSE );
+        retvalue = LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, FALSE );
+        goto END;
 
     case LB_FINDSTRINGEXACT16:
         wParam = (INT)(INT16)wParam;
         if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
         /* fall through */
     case LB_FINDSTRINGEXACT:
-        return LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+        retvalue = LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+        goto END;
 
     case LB_SELECTSTRING16:
         wParam = (INT)(INT16)wParam;
@@ -2274,9 +2314,14 @@
         {
             INT index = LISTBOX_FindString( wnd, descr, wParam,
                                               (LPCSTR)lParam, FALSE );
-            if (index == LB_ERR) return LB_ERR;
+            if (index == LB_ERR)
+            {
+                retvalue = LB_ERR;
+                goto END;
+            }
             LISTBOX_SetSelection( wnd, descr, index, TRUE, FALSE );
-            return index;
+            retvalue = index;
+            goto END;
         }
 
     case LB_GETSEL16:
@@ -2284,128 +2329,171 @@
         /* fall through */
     case LB_GETSEL:
         if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
-            return LB_ERR;
-        return descr->items[wParam].selected;
+        {
+            retvalue = LB_ERR;
+            goto END;
+        }
+        retvalue = descr->items[wParam].selected;
+        goto END;
 
     case LB_SETSEL16:
         lParam = (INT)(INT16)lParam;
         /* fall through */
     case LB_SETSEL:
-        return LISTBOX_SetSelection( wnd, descr, lParam, wParam, FALSE );
+        retvalue = LISTBOX_SetSelection( wnd, descr, lParam, wParam, FALSE );
+        goto END;
 
     case LB_SETCURSEL16:
         wParam = (INT)(INT16)wParam;
         /* fall through */
     case LB_SETCURSEL:
         LISTBOX_SetCaretIndex( wnd, descr, wParam, TRUE );  
-        return LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE );
+        retvalue = LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE );
+        goto END;
 
     case LB_GETSELCOUNT16:
     case LB_GETSELCOUNT:
-        return LISTBOX_GetSelCount( wnd, descr );
+        retvalue = LISTBOX_GetSelCount( wnd, descr );
+        goto END;
 
     case LB_GETSELITEMS16:
-        return LISTBOX_GetSelItems16( wnd, descr, wParam,
+        retvalue = LISTBOX_GetSelItems16( wnd, descr, wParam,
                                       (LPINT16)PTR_SEG_TO_LIN(lParam) );
+        goto END;
 
     case LB_GETSELITEMS:
-        return LISTBOX_GetSelItems( wnd, descr, wParam, (LPINT)lParam );
+        retvalue = LISTBOX_GetSelItems( wnd, descr, wParam, (LPINT)lParam );
+        goto END;
 
     case LB_SELITEMRANGE16:
     case LB_SELITEMRANGE:
         if (LOWORD(lParam) <= HIWORD(lParam))
-            return LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
+        {
+            retvalue = LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
                                             HIWORD(lParam), wParam );
+        }
         else
-            return LISTBOX_SelectItemRange( wnd, descr, HIWORD(lParam),
+        {
+            retvalue = LISTBOX_SelectItemRange( wnd, descr, HIWORD(lParam),
                                             LOWORD(lParam), wParam );
+        }
+        goto END;
 
     case LB_SELITEMRANGEEX16:
     case LB_SELITEMRANGEEX:
         if ((INT)lParam >= (INT)wParam)
-            return LISTBOX_SelectItemRange( wnd, descr, wParam, lParam, TRUE );
+            retvalue = LISTBOX_SelectItemRange( wnd, descr, wParam, lParam, TRUE );
         else
-            return LISTBOX_SelectItemRange( wnd, descr, lParam, wParam, FALSE);
+            retvalue = LISTBOX_SelectItemRange( wnd, descr, lParam, wParam, FALSE);
+        goto END;
 
     case LB_GETHORIZONTALEXTENT16:
     case LB_GETHORIZONTALEXTENT:
-        return descr->horz_extent;
+        retvalue = descr->horz_extent;
+        goto END;
 
     case LB_SETHORIZONTALEXTENT16:
     case LB_SETHORIZONTALEXTENT:
-        return LISTBOX_SetHorizontalExtent( wnd, descr, wParam );
+        retvalue = LISTBOX_SetHorizontalExtent( wnd, descr, wParam );
+        goto END;
 
     case LB_GETANCHORINDEX16:
     case LB_GETANCHORINDEX:
-        return descr->anchor_item;
+        retvalue = descr->anchor_item;
+        goto END;
 
     case LB_SETANCHORINDEX16:
         wParam = (INT)(INT16)wParam;
         /* fall through */
     case LB_SETANCHORINDEX:
         if (((INT)wParam < -1) || ((INT)wParam >= descr->nb_items))
-            return LB_ERR;
+        {
+            retvalue = LB_ERR;
+            goto END;
+        }
         descr->anchor_item = (INT)wParam;
-        return LB_OKAY;
+        retvalue = LB_OKAY;
+        goto END;
 
     case LB_DIR16:
-        return LISTBOX_Directory( wnd, descr, wParam,
+        retvalue = LISTBOX_Directory( wnd, descr, wParam,
                                   (LPCSTR)PTR_SEG_TO_LIN(lParam), FALSE );
+        goto END;
 
     case LB_DIR:
-        return LISTBOX_Directory( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+        retvalue = LISTBOX_Directory( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+        goto END;
 
     case LB_GETLOCALE:
-        return descr->locale;
+        retvalue = descr->locale;
+        goto END;
 
     case LB_SETLOCALE:
         descr->locale = (LCID)wParam;  /* FIXME: should check for valid lcid */
-        return LB_OKAY;
+        retvalue = LB_OKAY;
+        goto END;
 
     case LB_INITSTORAGE:
-        return LISTBOX_InitStorage( wnd, descr, wParam, (DWORD)lParam );
+        retvalue = LISTBOX_InitStorage( wnd, descr, wParam, (DWORD)lParam );
+        goto END;
 
     case LB_SETCOUNT:
-        return LISTBOX_SetCount( wnd, descr, (INT)wParam );
+        retvalue = LISTBOX_SetCount( wnd, descr, (INT)wParam );
+        goto END;
 
     case LB_SETTABSTOPS16:
-        return LISTBOX_SetTabStops( wnd, descr, (INT)(INT16)wParam,
+        retvalue = LISTBOX_SetTabStops( wnd, descr, (INT)(INT16)wParam,
                                     (LPINT)PTR_SEG_TO_LIN(lParam), TRUE );
+        goto END;
 
     case LB_SETTABSTOPS:
-        return LISTBOX_SetTabStops( wnd, descr, wParam,
+        retvalue = LISTBOX_SetTabStops( wnd, descr, wParam,
                                     (LPINT)lParam, FALSE );
+        goto END;
 
     case LB_CARETON16:
     case LB_CARETON:
-        if (descr->caret_on) return LB_OKAY;
+        if (descr->caret_on)
+        {
+            retvalue = LB_OKAY;
+            goto END;
+        }
         descr->caret_on = TRUE;
         if ((descr->focus_item != -1) && (GetFocus() == wnd->hwndSelf))
             LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
-        return LB_OKAY;
+        retvalue = LB_OKAY;
+        goto END;
 
     case LB_CARETOFF16:
     case LB_CARETOFF:
-        if (!descr->caret_on) return LB_OKAY;
+        if (!descr->caret_on)
+        {
+            retvalue = LB_OKAY;
+            goto END;
+        }
         descr->caret_on = FALSE;
         if ((descr->focus_item != -1) && (GetFocus() == wnd->hwndSelf))
             LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
-        return LB_OKAY;
+        retvalue = LB_OKAY;
+        goto END;
 
     case WM_DESTROY:
-        return LISTBOX_Destroy( wnd, descr );
+        retvalue = LISTBOX_Destroy( wnd, descr );
+        goto END;
 
     case WM_ENABLE:
         InvalidateRect( hwnd, NULL, TRUE );
-        return 0;
+        retvalue = 0;
+        goto END;
 
     case WM_SETREDRAW:
         LISTBOX_SetRedraw( wnd, descr, wParam != 0 );
-        return 0;
+        retvalue = 0;
+        goto END;
 
     case WM_GETDLGCODE:
-        return DLGC_WANTARROWS | DLGC_WANTCHARS;
-
+        retvalue =DLGC_WANTARROWS | DLGC_WANTCHARS;
+        goto END;
     case WM_PAINT:
         {
             PAINTSTRUCT ps;
@@ -2414,67 +2502,67 @@
             ret = LISTBOX_Paint( wnd, descr, hdc );
             if( !wParam ) EndPaint( hwnd, &ps );
         }
-        return ret;
-
+        retvalue =ret;
+        goto END;
     case WM_SIZE:
         LISTBOX_UpdateSize( wnd, descr );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_GETFONT:
-        return descr->font;
-
+        retvalue =descr->font;
+        goto END;
     case WM_SETFONT:
         LISTBOX_SetFont( wnd, descr, (HFONT)wParam );
         if (lParam) InvalidateRect( wnd->hwndSelf, 0, TRUE );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_SETFOCUS:
         descr->caret_on = TRUE;
         if (descr->focus_item != -1)
             LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
         SEND_NOTIFICATION( wnd, descr, LBN_SETFOCUS );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_KILLFOCUS:
         if ((descr->focus_item != -1) && descr->caret_on)
             LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
         SEND_NOTIFICATION( wnd, descr, LBN_KILLFOCUS );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_HSCROLL:
-        return LISTBOX_HandleHScroll( wnd, descr, wParam, lParam );
-
+        retvalue =LISTBOX_HandleHScroll( wnd, descr, wParam, lParam );
+        goto END;
     case WM_VSCROLL:
-        return LISTBOX_HandleVScroll( wnd, descr, wParam, lParam );
-
+        retvalue =LISTBOX_HandleVScroll( wnd, descr, wParam, lParam );
+        goto END;
     case WM_LBUTTONDOWN:
-        return LISTBOX_HandleLButtonDown( wnd, descr, wParam,
+        retvalue =LISTBOX_HandleLButtonDown( wnd, descr, wParam,
                                           (INT16)LOWORD(lParam),
                                           (INT16)HIWORD(lParam) );
-
+        goto END;
     case WM_LBUTTONDBLCLK:
         if (descr->style & LBS_NOTIFY)
             SEND_NOTIFICATION( wnd, descr, LBN_DBLCLK );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_MOUSEMOVE:
         if (GetCapture() == hwnd)
             LISTBOX_HandleMouseMove( wnd, descr, (INT16)LOWORD(lParam),
                                      (INT16)HIWORD(lParam) );
-        return 0;
-
+        retvalue =0;
+        goto END;
     case WM_LBUTTONUP:
-        return LISTBOX_HandleLButtonUp( wnd, descr );
-
+        retvalue =LISTBOX_HandleLButtonUp( wnd, descr );
+        goto END;
     case WM_KEYDOWN:
-        return LISTBOX_HandleKeyDown( wnd, descr, wParam );
-
+        retvalue =LISTBOX_HandleKeyDown( wnd, descr, wParam );
+        goto END;
     case WM_CHAR:
-        return LISTBOX_HandleChar( wnd, descr, wParam );
-
+        retvalue =LISTBOX_HandleChar( wnd, descr, wParam );
+        goto END;
     case WM_SYSTIMER:
-        return LISTBOX_HandleSystemTimer( wnd, descr );
-
+        retvalue =LISTBOX_HandleSystemTimer( wnd, descr );
+        goto END;
     case WM_ERASEBKGND:
         if (IS_OWNERDRAW(descr))
         {
@@ -2483,11 +2571,14 @@
                                               wParam, (LPARAM)wnd->hwndSelf );
             if (hbrush) FillRect( (HDC)wParam, &rect, hbrush );
         }
-        return 1;
-
+        retvalue =1;
+        goto END;
     case WM_DROPFILES:
         if( !descr->lphc ) 
-	    return SendMessageA( descr->owner, msg, wParam, lParam );
+        {
+            retvalue =SendMessageA( descr->owner, msg, wParam, lParam );
+            goto END;
+        }
 	break;
 
     case WM_DROPOBJECT:
@@ -2499,22 +2590,27 @@
             LPDRAGINFO dragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN( (SEGPTR)lParam );
             dragInfo->l = LISTBOX_GetItemFromPoint( wnd, descr, dragInfo->pt.x,
                                                 dragInfo->pt.y );
-            return SendMessageA( descr->owner, msg, wParam, lParam );
+            retvalue =SendMessageA( descr->owner, msg, wParam, lParam );
+            goto END;
         }
 	break;
 
     case WM_NCCREATE:
 	if (TWEAK_WineLook > WIN31_LOOK)
 	    wnd->dwExStyle |= WS_EX_CLIENTEDGE;
-        return DefWindowProcA( hwnd, msg, wParam, lParam );
-
+        retvalue =DefWindowProcA( hwnd, msg, wParam, lParam );
+        goto END;
     default:
         if ((msg >= WM_USER) && (msg < 0xc000))
             WARN(listbox, "[%04x]: unknown msg %04x wp %08x lp %08lx\n",
 			 hwnd, msg, wParam, lParam );
-        return DefWindowProcA( hwnd, msg, wParam, lParam );
+        retvalue =DefWindowProcA( hwnd, msg, wParam, lParam );
+        goto END;
     }
-    return 0;
+    retvalue =0;
+END:
+    WIN_ReleaseWndPtr(wnd);
+    return retvalue;
 }
 
 /***********************************************************************
@@ -2533,8 +2629,10 @@
 
 	    RedrawWindow( lphc->self->hwndSelf, NULL, 0, 
 			    RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW );
+            WIN_ReleaseWndPtr(wnd);
 	    return lRet;
 	}
+        WIN_ReleaseWndPtr(wnd);
     }
     return CB_ERR;
 }
@@ -2571,20 +2669,20 @@
 
 		     lphc = (LPHEADCOMBO)(lpcs->lpCreateParams);
 #undef  lpcs
-		     return LISTBOX_Create( wnd, lphc );
-
+		     lRet =LISTBOX_Create( wnd, lphc );
+                     goto END;
 		case WM_LBUTTONDOWN:
-		     return LISTBOX_HandleLButtonDown( wnd, descr, wParam,
+		     lRet =LISTBOX_HandleLButtonDown( wnd, descr, wParam,
                              (INT16)LOWORD(lParam), (INT16)HIWORD(lParam));
-
+                     goto END;
 		/* avoid activation at all costs */
 
 		case WM_MOUSEACTIVATE:
-		     return MA_NOACTIVATE;
-
+		     lRet =MA_NOACTIVATE;
+                     goto END;
                 case WM_NCACTIVATE:
-                     return FALSE;
-
+                     lRet =FALSE;
+                     goto END;
 		case WM_KEYDOWN:
 		     if( CB_GETTYPE(lphc) != CBS_SIMPLE )
 		     {
@@ -2596,30 +2694,34 @@
 			       && (wParam == VK_DOWN || wParam == VK_UP)) )
 			 {
 			     COMBO_FlipListbox( lphc, FALSE );
-			     return 0;
+                             lRet =0;
+                             goto END;
 			 }
 		     }
-		     return LISTBOX_HandleKeyDown( wnd, descr, wParam );
+		     lRet =LISTBOX_HandleKeyDown( wnd, descr, wParam );
+                     goto END;
 
 		case LB_SETCURSEL16:
 		case LB_SETCURSEL:
 		     lRet = ListBoxWndProc( hwnd, msg, wParam, lParam );
-		     return (lRet == LB_ERR) ? lRet : descr->selected_item; 
-
+		     lRet =(lRet == LB_ERR) ? lRet : descr->selected_item; 
+                     goto END;
 		case WM_NCDESTROY:
 		     if( CB_GETTYPE(lphc) != CBS_SIMPLE )
 			 lphc->hWndLBox = 0;
 		     /* fall through */
 
 	        default:
-		     return ListBoxWndProc( hwnd, msg, wParam, lParam );
+                    lRet =ListBoxWndProc( hwnd, msg, wParam, lParam );
+                    goto END;
 	    }
         }
         lRet = DefWindowProcA( hwnd, msg, wParam, lParam );
 
         TRACE(combo,"\t default on msg [%04x]\n", (UINT16)msg );
     }
-
+END:
+    WIN_ReleaseWndPtr(wnd);
     return lRet;
 }
 
diff --git a/controls/menu.c b/controls/menu.c
index afe3223..3ba4f66 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -272,6 +272,37 @@
     return hMenu;
 }
 
+/***********************************************************************
+ *           MENU_GetTopPopupWnd()
+ *
+ * Return the locked pointer pTopPopupWnd.
+ */
+WND *MENU_GetTopPopupWnd()
+{
+    return WIN_LockWndPtr(pTopPopupWnd);
+}
+/***********************************************************************
+ *           MENU_ReleaseTopPopupWnd()
+ *
+ * Realease the locked pointer pTopPopupWnd.
+ */
+void MENU_ReleaseTopPopupWnd()
+{
+    WIN_ReleaseWndPtr(pTopPopupWnd);
+}
+/***********************************************************************
+ *           MENU_DestroyTopPopupWnd()
+ *
+ * Destroy the locked pointer pTopPopupWnd.
+ */
+void MENU_DestroyTopPopupWnd()
+{
+    WND *tmpWnd = pTopPopupWnd;
+    pTopPopupWnd = NULL;
+    WIN_ReleaseWndPtr(tmpWnd);
+}
+
+
 
 /**********************************************************************
  *           MENU_GetSysMenu
@@ -536,6 +567,7 @@
     if (!(wndPtr = WIN_FindWndPtr( menu->hWnd ))) return NULL;
     pt.x -= wndPtr->rectWindow.left;
     pt.y -= wndPtr->rectWindow.top;
+    WIN_ReleaseWndPtr(wndPtr);
     item = menu->items;
     for (i = 0; i < menu->nItems; i++, item++)
     {
@@ -565,6 +597,7 @@
     {
 	WND* w = WIN_FindWndPtr(hwndOwner);
 	hmenu = GetSubMenu(w->hSysMenu, 0);
+        WIN_ReleaseWndPtr(w);
     }
 
     if (hmenu)
@@ -1212,16 +1245,24 @@
                          BOOL suppress_draw)
 {
     LPPOPUPMENU lppop;
-    UINT i;
+    UINT i,retvalue;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( (HMENU16)wndPtr->wIDmenu );
-    if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
+    if (lppop == NULL || lprect == NULL)
+    {
+        retvalue = SYSMETRICS_CYMENU;
+        goto END;
+    }
     TRACE(menu,"(%04x, %p, %p); !\n", 
 		 hDC, lprect, lppop);
     if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
     lprect->bottom = lprect->top + lppop->Height;
-    if (suppress_draw) return lppop->Height;
+    if (suppress_draw)
+    {
+        retvalue = lppop->Height;
+        goto END;
+    }
     
     FillRect(hDC, lprect, GetSysColorBrush(COLOR_MENU) );
 
@@ -1236,13 +1277,20 @@
 	LineTo( hDC, lprect->right, lprect->bottom );
     }
 
-    if (lppop->nItems == 0) return SYSMETRICS_CYMENU;
+    if (lppop->nItems == 0)
+    {
+        retvalue = SYSMETRICS_CYMENU;
+        goto END;
+    }
     for (i = 0; i < lppop->nItems; i++)
     {
 	MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE,
 			   ODA_DRAWENTIRE );
     }
-    return lppop->Height;
+    retvalue = lppop->Height;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 } 
 
 
@@ -1251,34 +1299,37 @@
  */
 BOOL MENU_PatchResidentPopup( HQUEUE16 checkQueue, WND* checkWnd )
 {
-    if( pTopPopupWnd )
+    WND *pTPWnd = MENU_GetTopPopupWnd();
+    
+    if( pTPWnd )
     {
 	HTASK16 hTask = 0;
 
 	TRACE(menu,"patching resident popup: %04x %04x [%04x %04x]\n", 
-		checkQueue, checkWnd ? checkWnd->hwndSelf : 0, pTopPopupWnd->hmemTaskQ, 
-		pTopPopupWnd->owner ? pTopPopupWnd->owner->hwndSelf : 0);
+		checkQueue, checkWnd ? checkWnd->hwndSelf : 0, pTPWnd->hmemTaskQ,
+		pTPWnd->owner ? pTPWnd->owner->hwndSelf : 0);
 
 	switch( checkQueue )
 	{
 	    case 0: /* checkWnd is the new popup owner */
 		 if( checkWnd )
 		 {
-		     pTopPopupWnd->owner = checkWnd;
-		     if( pTopPopupWnd->hmemTaskQ != checkWnd->hmemTaskQ )
+		     pTPWnd->owner = checkWnd;
+		     if( pTPWnd->hmemTaskQ != checkWnd->hmemTaskQ )
 			 hTask = QUEUE_GetQueueTask( checkWnd->hmemTaskQ );
 		 }
 		 break;
 
 	    case 0xFFFF: /* checkWnd is destroyed */
-		 if( pTopPopupWnd->owner == checkWnd )
-		     pTopPopupWnd->owner = NULL;
+		 if( pTPWnd->owner == checkWnd )
+                     pTPWnd->owner = NULL;
+                 MENU_ReleaseTopPopupWnd();
 		 return TRUE; 
 
 	    default: /* checkQueue is exiting */
-		 if( pTopPopupWnd->hmemTaskQ == checkQueue )
+		 if( pTPWnd->hmemTaskQ == checkQueue )
 		 {
-		     hTask = QUEUE_GetQueueTask( pTopPopupWnd->hmemTaskQ );
+		     hTask = QUEUE_GetQueueTask( pTPWnd->hmemTaskQ );
 		     hTask = TASK_GetNextTask( hTask );
 		 }
 		 break;
@@ -1289,13 +1340,15 @@
 	    TDB* task = (TDB*)GlobalLock16( hTask );
 	    if( task )
 	    {
-		pTopPopupWnd->hInstance = task->hInstance;
-		pTopPopupWnd->hmemTaskQ = task->hQueue;
+		pTPWnd->hInstance = task->hInstance;
+                pTPWnd->hmemTaskQ = task->hQueue;
+                MENU_ReleaseTopPopupWnd();
 		return TRUE;
 	    } 
 	    else WARN(menu,"failed to patch resident popup.\n");
 	} 
     }
+    MENU_ReleaseTopPopupWnd();
     return FALSE;
 }
 
@@ -1358,8 +1411,13 @@
 					  WS_POPUP, x, y, width, height,
 					  hwndOwner, 0, wndOwner->hInstance,
 					  (LPVOID)hmenu ));
-	    if (!pTopPopupWnd) return FALSE;
+            if (!pTopPopupWnd)
+            {
+                WIN_ReleaseWndPtr(wndOwner);
+                return FALSE;
+            }
 	    menu->hWnd = pTopPopupWnd->hwndSelf;
+            MENU_ReleaseTopPopupWnd();
 	} 
 	else
 	    if( uSubPWndLevel )
@@ -1370,19 +1428,25 @@
 					  WS_POPUP, x, y, width, height,
 					  menu->hWnd, 0, wndOwner->hInstance,
 					  (LPVOID)hmenu );
-		if( !menu->hWnd ) return FALSE;
+                if( !menu->hWnd )
+                {
+                    WIN_ReleaseWndPtr(wndOwner);
+                    return FALSE;
+                }
 	    }
 	    else /* top level popup menu window already exists */
 	    {
-		menu->hWnd = pTopPopupWnd->hwndSelf;
+                WND *pTPWnd = MENU_GetTopPopupWnd();
+		menu->hWnd = pTPWnd->hwndSelf;
 
 		MENU_PatchResidentPopup( 0, wndOwner );
-		SendMessage16( pTopPopupWnd->hwndSelf, MM_SETMENUHANDLE, (WPARAM16)hmenu, 0L);	
+		SendMessage16( pTPWnd->hwndSelf, MM_SETMENUHANDLE, (WPARAM16)hmenu, 0L);
 
 		/* adjust its size */
 
 	        SetWindowPos( menu->hWnd, 0, x, y, width, height,
 				SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
+                MENU_ReleaseTopPopupWnd();
 	    }
 
 	uSubPWndLevel++;	/* menu level counter */
@@ -1392,6 +1456,7 @@
 	SetWindowPos( menu->hWnd, HWND_TOP, 0, 0, 0, 0,
 			SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
 	UpdateWindow( menu->hWnd );
+        WIN_ReleaseWndPtr(wndOwner);
 	return TRUE;
     }
     return FALSE;
@@ -1785,7 +1850,7 @@
 	MENU_HideSubPopups( hwndOwner, hsubmenu, FALSE );
 	MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, sendMenuSelect );
 
-	if (submenu->hWnd == pTopPopupWnd->hwndSelf ) 
+	if (submenu->hWnd == MENU_GetTopPopupWnd()->hwndSelf )
 	{
 	    ShowWindow( submenu->hWnd, SW_HIDE );
 	    uSubPWndLevel = 0;
@@ -1795,6 +1860,7 @@
 	    DestroyWindow( submenu->hWnd );
 	    submenu->hWnd = 0;
 	}
+        MENU_ReleaseTopPopupWnd();
     }
 }
 
@@ -1817,11 +1883,19 @@
     if (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu ))) return hmenu;
 
     if (!(wndPtr = WIN_FindWndPtr( menu->hWnd )) ||
-         (menu->FocusedItem == NO_SELECTED_ITEM)) return hmenu;
+        (menu->FocusedItem == NO_SELECTED_ITEM))
+    {
+        WIN_ReleaseWndPtr(wndPtr);
+        return hmenu;
+    }
 
     item = &menu->items[menu->FocusedItem];
     if (!(item->fType & MF_POPUP) ||
-         (item->fState & (MF_GRAYED | MF_DISABLED))) return hmenu;
+        (item->fState & (MF_GRAYED | MF_DISABLED)))
+    {
+        WIN_ReleaseWndPtr(wndPtr);
+        return hmenu;
+    }
 
     /* message must be send before using item,
        because nearly everything may by changed by the application ! */
@@ -1877,6 +1951,7 @@
 		    rect.left, rect.top, rect.right, rect.bottom );
     if (selectFirst)
         MENU_MoveSelection( hwndOwner, item->hSubMenu, ITEM_NEXT );
+    WIN_ReleaseWndPtr(wndPtr);
     return item->hSubMenu;
 }
 
@@ -1908,6 +1983,7 @@
 
 	    ht = ( ht == HTSYSMENU ) ? (UINT)(wndPtr->hSysMenu)
 		 : ( ht == HTMENU ) ? (UINT)(wndPtr->wIDmenu) : 0;
+            WIN_ReleaseWndPtr(wndPtr);
 	}
    }
    return (HMENU)ht;
@@ -2135,7 +2211,10 @@
 		/* switch to the menu bar */
 
 		if( wndPtr->dwStyle & WS_CHILD || !wndPtr->wIDmenu ) 
+                {
+                    WIN_ReleaseWndPtr(wndPtr);
 		    return FALSE;
+                }
 
 	        hNewMenu = wndPtr->wIDmenu;
 	        if( vk == VK_LEFT )
@@ -2149,7 +2228,12 @@
 		/* switch to the system menu */
 	        hNewMenu = wndPtr->hSysMenu; 
 	    }
-	    else return FALSE;
+            else
+            {
+                WIN_ReleaseWndPtr(wndPtr);
+                return FALSE;
+	}
+            WIN_ReleaseWndPtr(wndPtr);
 	}
 	else    /* application returned a new menu to switch to */
 	{
@@ -2171,8 +2255,10 @@
 		     * try to track hNewMenu as a popup? */
 
 		    TRACE(menu," -- got confused.\n");
+                    WIN_ReleaseWndPtr(wndPtr);
 		    return FALSE;
 		}
+                WIN_ReleaseWndPtr(wndPtr);
 	    }
 	    else return FALSE;
 	}
@@ -2702,6 +2788,7 @@
                                  LPARAM lParam )
 {    
     WND* wndPtr = WIN_FindWndPtr(hwnd);
+    LRESULT retvalue;
 
     switch(message)
     {
@@ -2709,11 +2796,13 @@
 	{
 	    CREATESTRUCTA *cs = (CREATESTRUCTA*)lParam;
 	    SetWindowLongA( hwnd, 0, (LONG)cs->lpCreateParams );
-	    return 0;
+            retvalue = 0;
+            goto END;
 	}
 
     case WM_MOUSEACTIVATE:  /* We don't want to be activated */
-	return MA_NOACTIVATE;
+        retvalue = MA_NOACTIVATE;
+        goto END;
 
     case WM_PAINT:
 	{
@@ -2722,27 +2811,30 @@
 	    MENU_DrawPopupMenu( hwnd, ps.hdc,
                                 (HMENU)GetWindowLongA( hwnd, 0 ) );
 	    EndPaint( hwnd, &ps );
-	    return 0;
+            retvalue = 0;
+            goto END;
 	}
     case WM_ERASEBKGND:
-	return 1;
+        retvalue = 1;
+        goto END;
 
     case WM_DESTROY:
 
 	/* zero out global pointer in case resident popup window
 	 * was somehow destroyed. */
 
-	if( pTopPopupWnd )
+	if(MENU_GetTopPopupWnd() )
 	{
 	    if( hwnd == pTopPopupWnd->hwndSelf )
 	    {
 		ERR(menu, "resident popup destroyed!\n");
 
-		pTopPopupWnd = NULL;
+                MENU_DestroyTopPopupWnd();
 		uSubPWndLevel = 0;
 	    }
 	    else
 		uSubPWndLevel--;
+            MENU_ReleaseTopPopupWnd();
 	}
 	break;
 
@@ -2764,12 +2856,17 @@
 
     case MM_GETMENUHANDLE:
 
-	return *(HMENU*)wndPtr->wExtra;
+        retvalue = *(HMENU*)wndPtr->wExtra;
+        goto END;
 
     default:
-	return DefWindowProcA( hwnd, message, wParam, lParam );
+        retvalue = DefWindowProcA( hwnd, message, wParam, lParam );
+        goto END;
     }
-    return 0;
+    retvalue = 0;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 
@@ -2785,18 +2882,24 @@
     RECT rectBar;
     WND *wndPtr;
     LPPOPUPMENU lppop;
+    UINT retvalue;
 
     TRACE(menu, "HWND 0x%x, width %d, "
 		  "at (%d, %d).\n", hwnd, menubarWidth, orgX, orgY );
     
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu)))
+    {
+        WIN_ReleaseWndPtr(wndPtr);
       return 0;
+    }
     hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
     SetRect(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU);
     MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd );
     ReleaseDC( hwnd, hdc );
-    return lppop->Height;
+    retvalue = lppop->Height;
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 
@@ -3430,18 +3533,21 @@
     if (hMenu && hMenu != MENU_DefSysPopup)
     {
 	LPPOPUPMENU lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
+        WND *pTPWnd = MENU_GetTopPopupWnd();
 
-	if( pTopPopupWnd && (hMenu == *(HMENU*)pTopPopupWnd->wExtra) )
-	  *(UINT*)pTopPopupWnd->wExtra = 0;
+	if( pTPWnd && (hMenu == *(HMENU*)pTPWnd->wExtra) )
+	  *(UINT*)pTPWnd->wExtra = 0;
 
 	if (IS_A_MENU( lppop ))
 	{
 	    lppop->wMagic = 0;  /* Mark it as destroyed */
 
 	    if ((lppop->wFlags & MF_POPUP) && lppop->hWnd &&
-	        (!pTopPopupWnd || (lppop->hWnd != pTopPopupWnd->hwndSelf)))
+	        (!pTPWnd || (lppop->hWnd != pTPWnd->hwndSelf)))
 	        DestroyWindow( lppop->hWnd );
 
+            MENU_ReleaseTopPopupWnd();
+            
 	    if (lppop->items)	/* recursively destroy submenus */
 	    {
 	        int i;
@@ -3499,7 +3605,12 @@
 	    wndPtr->hSysMenu = MENU_GetSysMenu( hWnd, (HMENU)(-1) );
 
 	if( wndPtr->hSysMenu )
-	    return GetSubMenu16(wndPtr->hSysMenu, 0);
+        {
+            HMENU retvalue = GetSubMenu16(wndPtr->hSysMenu, 0);
+            WIN_ReleaseWndPtr(wndPtr);
+            return retvalue;
+        }
+        WIN_ReleaseWndPtr(wndPtr);
     }
     return 0;
 }
@@ -3525,6 +3636,7 @@
     {
 	if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
 	wndPtr->hSysMenu = MENU_GetSysMenu( hwnd, hMenu );
+        WIN_ReleaseWndPtr(wndPtr);
 	return TRUE;
     }
     return FALSE;
@@ -3536,10 +3648,17 @@
  */
 HMENU16 WINAPI GetMenu16( HWND16 hWnd ) 
 {
+    HMENU16 retvalue;
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr && !(wndPtr->dwStyle & WS_CHILD)) 
-	return (HMENU16)wndPtr->wIDmenu;
-    return 0;
+    {
+        retvalue = (HMENU16)wndPtr->wIDmenu;
+        goto END;
+}
+    retvalue = 0;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 
@@ -3548,10 +3667,17 @@
  */
 HMENU WINAPI GetMenu( HWND hWnd ) 
 { 
+    HMENU retvalue;
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr && !(wndPtr->dwStyle & WS_CHILD)) 
-	return (HMENU)wndPtr->wIDmenu;
-    return 0;
+    {
+        retvalue = (HMENU)wndPtr->wIDmenu;
+        goto END;
+    }
+    retvalue = 0;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 
@@ -3582,7 +3708,11 @@
 	{
 	    LPPOPUPMENU lpmenu;
 
-            if (!(lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
+            if (!(lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu)))
+            {
+                WIN_ReleaseWndPtr(wndPtr);
+                return FALSE;
+            }
             lpmenu->hWnd = hWnd;
             lpmenu->wFlags &= ~MF_POPUP;  /* Can't be a popup */
             lpmenu->Height = 0;  /* Make sure we recalculate the size */
@@ -3590,8 +3720,10 @@
 	if (IsWindowVisible(hWnd))
             SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
                         SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+        WIN_ReleaseWndPtr(wndPtr);
 	return TRUE;
     }
+    WIN_ReleaseWndPtr(wndPtr);
     return FALSE;
 }
 
@@ -3639,13 +3771,19 @@
     if (wndPtr && !(wndPtr->dwStyle & WS_CHILD) && wndPtr->wIDmenu)
     {
         lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu);
-        if (lppop == NULL) return FALSE;
+        if (lppop == NULL)
+        {
+            WIN_ReleaseWndPtr(wndPtr);
+            return FALSE;
+        }
 
         lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
         SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
                         SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+        WIN_ReleaseWndPtr(wndPtr);
         return TRUE;
     }
+    WIN_ReleaseWndPtr(wndPtr);
     return FALSE;
 }
 
diff --git a/controls/scroll.c b/controls/scroll.c
index b157d62..d5705cd 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -146,8 +146,11 @@
  */
 static SCROLLBAR_INFO *SCROLL_GetScrollInfo( HWND hwnd, INT nBar )
 {
+   SCROLLBAR_INFO *retvalue;
    WND *wndPtr = WIN_FindWndPtr( hwnd );
-   return SCROLL_GetPtrScrollInfo( wndPtr, nBar );
+   retvalue = SCROLL_GetPtrScrollInfo( wndPtr, nBar );
+   WIN_ReleaseWndPtr(wndPtr);
+   return retvalue;
 }
 
 
@@ -204,6 +207,7 @@
 	break;
 
     default:
+        WIN_ReleaseWndPtr(wndPtr);
         return FALSE;
     }
 
@@ -248,6 +252,7 @@
 		 + pixels * (info->CurVal-info->MinVal) / (max - info->MinVal);
         }
     }
+    WIN_ReleaseWndPtr(wndPtr);
     return vertical;
 }
 
@@ -560,8 +565,8 @@
 
     if (!wndPtr || !infoPtr ||
         ((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
-        ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
-    if (!WIN_IsWindowDrawable( wndPtr, FALSE )) return;
+        ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) goto END;
+    if (!WIN_IsWindowDrawable( wndPtr, FALSE )) goto END;
 
     vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
                                         &arrowSize, &thumbSize, &thumbPos );
@@ -581,6 +586,8 @@
     if( interior )
 	SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize,
                          thumbPos, infoPtr->flags, vertical, FALSE, FALSE );
+END:
+    WIN_ReleaseWndPtr(wndPtr);
 }
 
 
@@ -621,11 +628,13 @@
     case VK_UP:    msg = SB_LINEUP; break;
     case VK_DOWN:  msg = SB_LINEDOWN; break;
     default:
+        WIN_ReleaseWndPtr(wndPtr);
         return;
     }
     SendMessageA( GetParent(hwnd),
                     (wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
                     msg, hwnd );
+    WIN_ReleaseWndPtr(wndPtr);
 }
 
 
@@ -1383,6 +1392,7 @@
 			     BOOL fShowH, BOOL fShowV )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
+    BOOL retvalue = FALSE;
 
     if (!wndPtr) return FALSE;
     TRACE(scroll, "hwnd=%04x bar=%d horz=%d, vert=%d\n",
@@ -1392,7 +1402,8 @@
     {
     case SB_CTL:
         ShowWindow( hwnd, fShowH ? SW_SHOW : SW_HIDE );
-        return TRUE;
+        retvalue = TRUE;
+        goto END;
 
     case SB_BOTH:
     case SB_HORZ:
@@ -1423,17 +1434,22 @@
         break;
 
     default:
-        return FALSE;  /* Nothing to do! */
+        retvalue = FALSE;  /* Nothing to do! */
+        goto END;
     }
 
     if( fShowH || fShowV ) /* frame has been changed, let the window redraw itself */
     {
 	SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
                     | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
-        return TRUE;
+        retvalue = TRUE;
+        goto END;
     }
 
-    return FALSE; /* no frame changes */
+    retvalue = FALSE; /* no frame changes */
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 
diff --git a/controls/static.c b/controls/static.c
index c7c21d0..c7846e7 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -182,12 +182,14 @@
 
         if (style == SS_ICON)
         {
-            if (cs->lpszName) {
+            if (cs->lpszName)
+            {
 	    	if (!HIWORD(cs->lpszName) || cs->lpszName[0])
 		    STATIC_SetIcon( wndPtr,
                                 STATIC_LoadIcon( wndPtr, cs->lpszName ));
 	    }
-            return 1;
+            lResult = 1;
+            goto END;
         }
 	if (style == SS_BITMAP)
 	{
@@ -196,15 +198,18 @@
                                 STATIC_LoadBitmap( wndPtr, cs->lpszName ));
 	    WARN(static, "style SS_BITMAP, dwStyle is 0x%08lx\n",
 			wndPtr->dwStyle);
-            return 1;
+            lResult = 1;
+            goto END;
 	}
-	if (!HIWORD(cs->lpszName) && (cs->lpszName)) {
+        if (!HIWORD(cs->lpszName) && (cs->lpszName))
+        {
 		FIXME(static,"windowName is 0x%04x, not doing DefWindowProc\n",
-		    LOWORD(cs->lpszName)
-		);
-		return 1;
+		    LOWORD(cs->lpszName));
+                lResult = 1;
+                goto END;
 	}
-        return DefWindowProcA( hWnd, uMsg, wParam, lParam );
+        lResult = DefWindowProcA( hWnd, uMsg, wParam, lParam );
+        goto END;
     }
     case WM_CREATE:
         if (style < 0L || style > SS_TYPEMASK)
@@ -268,8 +273,16 @@
         break;
 
     case WM_SETFONT:
-        if (style == SS_ICON) return 0;
-        if (style == SS_BITMAP) return 0;
+        if (style == SS_ICON)
+        {
+            lResult = 0;
+            goto END;
+        }
+        if (style == SS_BITMAP)
+        {
+            lResult = 0;
+            goto END;
+        }
         infoPtr->hFont = (HFONT16)wParam;
         if (LOWORD(lParam))
         {
@@ -279,18 +292,22 @@
         break;
 
     case WM_GETFONT:
-        return infoPtr->hFont;
+        lResult = infoPtr->hFont;
+        goto END;
 
     case WM_NCHITTEST:
-        return HTTRANSPARENT;
+        lResult = HTTRANSPARENT;
+        goto END;
 
     case WM_GETDLGCODE:
-        return DLGC_STATIC;
+        lResult = DLGC_STATIC;
+        goto END;
 
     case STM_GETIMAGE:
     case STM_GETICON16:
     case STM_GETICON:
-        return infoPtr->hIcon;
+        lResult = infoPtr->hIcon;
+        goto END;
 
     case STM_SETIMAGE:
     	/* FIXME: handle wParam */
@@ -311,6 +328,8 @@
         break;
     }
     
+END:
+    WIN_ReleaseWndPtr(wndPtr);
     return lResult;
 }