Made access to the wnd struct thread-safe.

diff --git a/windows/mdi.c b/windows/mdi.c
index 0473ba7..5be8bc3 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -76,7 +76,11 @@
 				 wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
     BOOL	    bRet	    = 0;
 
-    if( !clientInfo->hWindowMenu ) return 0;
+    if( !clientInfo->hWindowMenu )
+    {
+        bRet =  FALSE;
+        goto END;
+    }
 
     if (wndPtr->text) lstrcpynA(buffer + n, wndPtr->text, sizeof(buffer) - n );
 
@@ -84,6 +88,8 @@
     bRet = ModifyMenuA(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
                       MF_BYCOMMAND | MF_STRING, wndPtr->wIDmenu, buffer );
     CheckMenuItem(clientInfo->hWindowMenu ,wndPtr->wIDmenu , n & MF_CHECKED);
+END:
+    WIN_ReleaseWndPtr(wndPtr);
     return bRet;
 }
 
@@ -96,9 +102,14 @@
     MDICLIENTINFO *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
     WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
     UINT	 index      = 0,id,n;
+    BOOL         retvalue;
 
     if( !clientInfo->nActiveChildren ||
-	!clientInfo->hWindowMenu ) return 0;
+        !clientInfo->hWindowMenu )
+    {
+        retvalue = FALSE;
+        goto END;
+    }
 
     id = wndPtr->wIDmenu;
     DeleteMenu(clientInfo->hWindowMenu,id,MF_BYCOMMAND);
@@ -127,7 +138,10 @@
 	ModifyMenuA(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
                       index - 1 , buffer ); 
     }
-    return 1;
+    retvalue = TRUE;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    return retvalue;
 }
 
 /**********************************************************************
@@ -146,9 +160,9 @@
 
     if( !(wndPtr = WIN_FindWndPtr(hWnd)) ) return 0;
 
-    for ( pWnd = wndPtr->next; ; pWnd = pWnd->next )
+    for ( pWnd = WIN_LockWndPtr(wndPtr->next); ; WIN_UpdateWndPtr(&pWnd,pWnd->next))
     {
-        if (!pWnd ) pWnd = wndPtr->parent->child;
+        if (!pWnd ) WIN_UpdateWndPtr(&pWnd,wndPtr->parent->child);
 
         if ( pWnd == wndPtr ) break; /* went full circle */
 
@@ -158,6 +172,8 @@
 	    if ( bNext ) break;
         }
     }
+    WIN_ReleaseWndPtr(wndPtr);
+    WIN_ReleaseWndPtr(pWnd);
     return pWndLast ? pWndLast->hwndSelf : 0;
 }
 
@@ -243,8 +259,10 @@
         SetMenu(hwndFrame, hmenuFrame);
         if( ci->hwndChildMaximized )
             MDI_AugmentFrameMenu(ci, w->parent, ci->hwndChildMaximized );
+        WIN_ReleaseWndPtr(w);
         return oldFrameMenu;
     }
+    WIN_ReleaseWndPtr(w);
     return 0;
 }
 
@@ -385,6 +403,7 @@
                 SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
 
 	}
+        WIN_ReleaseWndPtr(wnd);
         TRACE(mdi, "created child - %04x\n",hwnd);
     }
     else
@@ -420,8 +439,11 @@
     lpMinMax->ptMaxPosition.x = rect.left;
     lpMinMax->ptMaxPosition.y = rect.top; 
 
+    WIN_ReleaseWndPtr(childWnd);
+    
     TRACE(mdi,"max rect (%i,%i - %i, %i)\n", 
                         rect.left,rect.top,rect.right,rect.bottom);
+    
 }
 
 /**********************************************************************
@@ -444,7 +466,7 @@
 
     TRACE(mdi, "from %04x, to %04x\n",childHwnd,hwndTo);
 
-    if ( !hwndTo ) return; /* no window to switch to */
+    if ( !hwndTo ) goto END; /* no window to switch to */
 
     hwndPrev = ci->hwndActiveChild;
 
@@ -467,6 +489,8 @@
 	if( bOptimize )
 	    ShowWindow( clientHwnd, SW_SHOW );
     }
+END:
+    WIN_ReleaseWndPtr(w);
 }
 
 	    
@@ -499,6 +523,7 @@
 	    }
 	    MDI_MenuDeleteItem(w_parent, child);
 	}
+        WIN_ReleaseWndPtr(childPtr);
 	
         ci->nActiveChildren--;
 
@@ -527,11 +552,22 @@
     WND                 *wndPtr = WIN_FindWndPtr( hWndChild );
     WND			*wndPrev = WIN_FindWndPtr( prevActiveWnd );
     BOOL		 isActiveFrameWnd = 0;	 
+    LONG               retvalue;
 
-    if( hWndChild == prevActiveWnd ) return 0L;
+    if( hWndChild == prevActiveWnd )
+    {
+        retvalue = 0L;
+        goto END;
+    }
 
     if( wndPtr )
-        if( wndPtr->dwStyle & WS_DISABLED ) return 0L;
+    {
+        if( wndPtr->dwStyle & WS_DISABLED )
+        {
+            retvalue = 0L;
+            goto END;
+        }
+    }
 
     TRACE(mdi,"%04x\n", hWndChild);
 
@@ -570,7 +606,8 @@
     {
 	if( isActiveFrameWnd )
 	    SetFocus( clientInfo->self );
-	return 0;
+        retvalue = 0;
+        goto END;
     }
 	
     /* check menu item */
@@ -592,7 +629,10 @@
     }
     SendMessageA( hWndChild, WM_MDIACTIVATE, (WPARAM)prevActiveWnd,
                     (LPARAM)hWndChild );
-    return 1;
+    retvalue = 1;
+END:
+    WIN_ReleaseWndPtr(wndPtr);
+    WIN_ReleaseWndPtr(wndPrev);
 }
 
 /* -------------------- MDI client window functions ------------------- */
@@ -766,7 +806,12 @@
 
     TRACE(mdi,"frame %p,child %04x\n",frame,hChild);
 
-    if( !frame->wIDmenu || !child->hSysMenu ) return 0; 
+    if( !frame->wIDmenu || !child->hSysMenu )
+    {
+        WIN_ReleaseWndPtr(child);
+        return 0;
+    }
+    WIN_ReleaseWndPtr(child);
 
     /* create a copy of sysmenu popup and insert it into frame menu bar */
 
@@ -856,6 +901,7 @@
 
     if (!clientWnd)
            return;
+    WIN_ReleaseWndPtr(clientWnd);
 
     if (!ci)
            return;
@@ -897,6 +943,7 @@
 		    strcat( lpBuffer, "]" );
 		}
 	    }
+            WIN_ReleaseWndPtr(childWnd);
 	}
 	else
 	{
@@ -929,8 +976,9 @@
     MDICLIENTINFO       *ci;
     RECT		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
-    WND			*frameWnd = w->parent;
+    WND			*frameWnd = WIN_LockWndPtr(w->parent);
     INT nItems;
+    LRESULT            retvalue;
     
     ci = (MDICLIENTINFO *) w->wExtra;
     
@@ -982,7 +1030,8 @@
 	TRACE(mdi,"Client created - hwnd = %04x, idFirst = %u\n",
 			   hwnd, ci->idFirstChild );
 
-	return 0;
+        retvalue = 0;
+        goto END;
       
       case WM_DESTROY:
 	if( ci->hwndChildMaximized ) MDI_RestoreFrameMenu(w, frameWnd->hwndSelf);
@@ -993,38 +1042,46 @@
 	    while( ci->nActiveChildren-- )
 	        DeleteMenu(ci->hWindowMenu,MF_BYPOSITION,ci->idFirstChild--);
 	}
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_MDIACTIVATE:
         if( ci->hwndActiveChild != (HWND)wParam )
 	    SetWindowPos((HWND)wParam, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_MDICASCADE:
-	return MDICascade(w, ci);
+        retvalue = MDICascade(w, ci);
+        goto END;
 
       case WM_MDICREATE:
-        if (lParam) return MDICreateChild( w, ci, hwnd,
+        if (lParam) retvalue = MDICreateChild( w, ci, hwnd,
                                            (MDICREATESTRUCTA*)lParam );
-	return 0;
+        else retvalue = 0;
+        goto END;
 
       case WM_MDIDESTROY:
-	return MDIDestroyChild( w, ci, hwnd, (HWND)wParam, TRUE );
+	retvalue = MDIDestroyChild( w, ci, hwnd, (HWND)wParam, TRUE );
+        goto END;
 
       case WM_MDIGETACTIVE:
           if (lParam) *(BOOL *)lParam = (ci->hwndChildMaximized > 0);
-          return ci->hwndActiveChild;
+          retvalue = ci->hwndActiveChild;
+          goto END;
 
       case WM_MDIICONARRANGE:
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
         ArrangeIconicWindows(hwnd);
 	ci->sbRecalc = SB_BOTH+1;
 	SendMessageA(hwnd, WM_MDICALCCHILDSCROLL, 0, 0L);
-	return 0;
+        retvalue = 0;
+        goto END;
 	
       case WM_MDIMAXIMIZE:
 	ShowWindow( (HWND)wParam, SW_MAXIMIZE );
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_MDINEXT: /* lParam != 0 means previous window */
 	MDI_SwitchActiveChild(hwnd, (HWND)wParam, (lParam)? FALSE : TRUE );
@@ -1032,27 +1089,31 @@
 	
       case WM_MDIRESTORE:
         SendMessageA( (HWND)wParam, WM_SYSCOMMAND, SC_RESTORE, 0);
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_MDISETMENU:
-          return MDISetMenu( hwnd, (HMENU)wParam, (HMENU)lParam );
-	
+          retvalue = MDISetMenu( hwnd, (HMENU)wParam, (HMENU)lParam );
+	  goto END;
       case WM_MDIREFRESHMENU:
-          return MDIRefreshMenu( hwnd, (HMENU)wParam, (HMENU)lParam );
+          retvalue = MDIRefreshMenu( hwnd, (HMENU)wParam, (HMENU)lParam );
+          goto END;
 
       case WM_MDITILE:
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
 	ShowScrollBar(hwnd,SB_BOTH,FALSE);
 	MDITile(w, ci, wParam);
         ci->mdiFlags &= ~MDIF_NEEDUPDATE;
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_VSCROLL:
       case WM_HSCROLL:
 	ci->mdiFlags |= MDIF_NEEDUPDATE;
         ScrollChildren(hwnd, message, wParam, lParam);
 	ci->mdiFlags &= ~MDIF_NEEDUPDATE;
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_SETFOCUS:
 	if( ci->hwndActiveChild )
@@ -1061,7 +1122,8 @@
 	   if( !(w->dwStyle & WS_MINIMIZE) )
 	       SetFocus( ci->hwndActiveChild );
 	} 
-	return 0;
+        retvalue = 0;
+        goto END;
 	
       case WM_NCACTIVATE:
         if( ci->hwndActiveChild )
@@ -1079,7 +1141,8 @@
             if( child && child != hwnd && child != ci->hwndActiveChild )
                 SetWindowPos(child, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
         }
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_SIZE:
         if( IsWindow(ci->hwndChildMaximized) )
@@ -1090,6 +1153,7 @@
 	    AdjustWindowRectEx(&rect, child->dwStyle, 0, child->dwExStyle);
 	    MoveWindow(ci->hwndChildMaximized, rect.left, rect.top,
 			 rect.right - rect.left, rect.bottom - rect.top, 1);
+            WIN_ReleaseWndPtr(child);
 	}
 	else
 	    MDI_PostUpdate(hwnd, ci, SB_BOTH+1);
@@ -1103,10 +1167,15 @@
 	    ci->sbRecalc = 0;
 	    ci->mdiFlags &= ~MDIF_NEEDUPDATE;
 	}
-	return 0;
+        retvalue = 0;
+        goto END;
     }
     
-    return DefWindowProcA( hwnd, message, wParam, lParam );
+    retvalue = DefWindowProcA( hwnd, message, wParam, lParam );
+END:
+    WIN_ReleaseWndPtr(w);
+    WIN_ReleaseWndPtr(frameWnd);
+    return retvalue;
 }
 
 
@@ -1136,6 +1205,7 @@
 	    ci     = (MDICLIENTINFO*)wndPtr->wExtra;
 
 	    /* check for possible syscommands for maximized MDI child */
+            WIN_ReleaseWndPtr(wndPtr);
 
 	    if( ci && (
 	    	wParam <  ci->idFirstChild || 
@@ -1159,8 +1229,10 @@
 	      }
 	    else
 	      {
-	    	childHwnd = MDI_GetChildByID( WIN_FindWndPtr(hwndMDIClient),
-                                          wParam );
+                wndPtr = WIN_FindWndPtr(hwndMDIClient);
+                childHwnd = MDI_GetChildByID(wndPtr,wParam );
+                WIN_ReleaseWndPtr(wndPtr);
+
  	    	if( childHwnd )
 	            SendMessage16(hwndMDIClient, WM_MDIACTIVATE,
                                   (WPARAM16)childHwnd , 0L);
@@ -1172,9 +1244,11 @@
 	    break;
 
 	  case WM_SETTEXT:
-	    MDI_UpdateFrameText(WIN_FindWndPtr(hwnd), hwndMDIClient, 
+            wndPtr = WIN_FindWndPtr(hwnd);
+            MDI_UpdateFrameText(wndPtr, hwndMDIClient,
 				      MDI_REPAINTFRAME, 
 			             (LPCSTR)PTR_SEG_TO_LIN(lParam));
+            WIN_ReleaseWndPtr(wndPtr);
 	    return 0;
 	
 	  case WM_SETFOCUS:
@@ -1202,11 +1276,16 @@
 		    (wParam == VK_RIGHT &&
 		     GetSubMenu16(wndPtr->parent->hSysMenu, 0) == LOWORD(lParam)) )
 		{
+                    LRESULT retvalue;
+                    WIN_ReleaseWndPtr(wndPtr);
 		    wndPtr = WIN_FindWndPtr(ci->hwndActiveChild);
-		    return MAKELONG( GetSubMenu16(wndPtr->hSysMenu, 0), 
+		    retvalue = MAKELONG( GetSubMenu16(wndPtr->hSysMenu, 0),
 						  ci->hwndActiveChild);
+                    WIN_ReleaseWndPtr(wndPtr);
+                    return retvalue;
 		}
 	    }
+            WIN_ReleaseWndPtr(wndPtr);
 	    break;
 	}
     }
@@ -1302,7 +1381,8 @@
                                   WPARAM16 wParam, LPARAM lParam )
 {
     MDICLIENTINFO       *ci;
-    WND                 *clientWnd;
+    WND                 *clientWnd,*tmpWnd = 0;
+    LRESULT             retvalue;
 
     clientWnd  = WIN_FindWndPtr(GetParent16(hwnd));
     ci         = (MDICLIENTINFO *) clientWnd->wExtra;
@@ -1315,11 +1395,13 @@
 	if( ci->hwndChildMaximized == hwnd )
 	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL );
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_CLOSE:
 	SendMessage16(ci->self,WM_MDIDESTROY,(WPARAM16)hwnd,0L);
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_SETFOCUS:
 	if( ci->hwndActiveChild != hwnd )
@@ -1328,7 +1410,8 @@
 
       case WM_CHILDACTIVATE:
 	MDI_ChildActivate(clientWnd, hwnd);
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_NCPAINT:
 	TRACE(mdi,"WM_NCPAINT for %04x, active %04x\n",
@@ -1339,30 +1422,44 @@
 	switch( wParam )
 	{
 		case SC_MOVE:
-		     if( ci->hwndChildMaximized == hwnd) return 0;
+                     if( ci->hwndChildMaximized == hwnd)
+                     {
+                         retvalue = 0;
+                         goto END;
+                     }
 		     break;
 	        case SC_RESTORE:
 	        case SC_MINIMIZE:
-		     WIN_FindWndPtr(hwnd)->dwStyle |= WS_SYSMENU;
+                     tmpWnd = WIN_FindWndPtr(hwnd);
+                     tmpWnd->dwStyle |= WS_SYSMENU;
+                     WIN_ReleaseWndPtr(tmpWnd);
 		     break;
 		case SC_MAXIMIZE:
 		     if( ci->hwndChildMaximized == hwnd) 
-			 return SendMessage16( clientWnd->parent->hwndSelf,
+                     {
+		          retvalue = SendMessage16( clientWnd->parent->hwndSelf,
                                              message, wParam, lParam);
-		     WIN_FindWndPtr(hwnd)->dwStyle &= ~WS_SYSMENU;
+                          goto END;
+                     }
+                     tmpWnd = WIN_FindWndPtr(hwnd);
+                     tmpWnd->dwStyle &= ~WS_SYSMENU;
+                     WIN_ReleaseWndPtr(tmpWnd);
 		     break;
 		case SC_NEXTWINDOW:
 		     SendMessage16( ci->self, WM_MDINEXT, 0, 0);
-		     return 0;
+                     retvalue = 0;
+                     goto END;
 		case SC_PREVWINDOW:
 		     SendMessage16( ci->self, WM_MDINEXT, 0, 1);
-		     return 0;
+                     retvalue = 0;
+                     goto END;
 	}
 	break;
 	
       case WM_GETMINMAXINFO:
 	MDI_ChildGetMinMaxInfo(clientWnd, hwnd, (MINMAXINFO16*) PTR_SEG_TO_LIN(lParam));
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_SETVISIBLE:
          if( ci->hwndChildMaximized) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
@@ -1424,16 +1521,23 @@
 	/* MDI children don't have menu bars */
 	PostMessage16( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
                        (WPARAM16)SC_KEYMENU, (LPARAM)wParam);
-	return 0x00010000L;
+        retvalue = 0x00010000L;
+        goto END;
 
       case WM_NEXTMENU:
 
 	if( wParam == VK_LEFT )		/* switch to frame system menu */
-	  return MAKELONG( GetSubMenu16(clientWnd->parent->hSysMenu, 0), 
+        {
+            retvalue = MAKELONG( GetSubMenu16(clientWnd->parent->hSysMenu, 0),
 			   clientWnd->parent->hwndSelf );
+            goto END;
+        }
 	if( wParam == VK_RIGHT )	/* to frame menu bar */
-	  return MAKELONG( clientWnd->parent->wIDmenu,
+        {
+            retvalue = MAKELONG( clientWnd->parent->wIDmenu,
 			   clientWnd->parent->hwndSelf );
+            goto END;
+        }
 
 	break;	
 
@@ -1442,11 +1546,14 @@
 	   {
 	   	SendMessage16(hwnd,WM_SYSCOMMAND,
 			(WPARAM16)SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
-		return 0;
+                retvalue = 0;
+                goto END;
 	   }
     }
 	
-    return DefWindowProc16(hwnd, message, wParam, lParam);
+    retvalue = DefWindowProc16(hwnd, message, wParam, lParam);
+END:
+    WIN_ReleaseWndPtr(clientWnd);
 }
 
 
@@ -1457,10 +1564,13 @@
                                    WPARAM wParam, LPARAM lParam )
 {
     MDICLIENTINFO       *ci;
-    WND                 *clientWnd;
+    WND                 *clientWnd,*tmpWnd;
+    LRESULT             retvalue;
 
-    clientWnd  = WIN_FindWndPtr(WIN_FindWndPtr(hwnd)->parent->hwndSelf);
+    tmpWnd     = WIN_FindWndPtr(hwnd);
+    clientWnd  = WIN_FindWndPtr(tmpWnd->parent->hwndSelf);
     ci         = (MDICLIENTINFO *) clientWnd->wExtra;
+    WIN_ReleaseWndPtr(tmpWnd);
 
     switch (message)
     {
@@ -1470,7 +1580,8 @@
 	if( ci->hwndChildMaximized == hwnd )
 	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL );
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_GETMINMAXINFO:
         {
@@ -1479,14 +1590,16 @@
             MDI_ChildGetMinMaxInfo( clientWnd, hwnd, &mmi );
             STRUCT32_MINMAXINFO16to32( &mmi, (MINMAXINFO *)lParam );
         }
-	return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_MENUCHAR:
 
 	/* MDI children don't have menu bars */
 	PostMessage16( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
                        (WPARAM16)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
-	return 0x00010000L;
+        retvalue = 0x00010000L;
+        goto END;
 
       case WM_CLOSE:
       case WM_SETFOCUS:
@@ -1496,17 +1609,22 @@
       case WM_SETVISIBLE:
       case WM_SIZE:
       case WM_NEXTMENU:
-          return DefMDIChildProc16( hwnd, message, (WPARAM16)wParam, lParam );
+          retvalue = DefMDIChildProc16( hwnd, message, (WPARAM16)wParam, lParam );
+          goto END;
 
       case WM_SYSCHAR:
       	   if (wParam == '-')
 	   {
 	   	SendMessageA(hwnd,WM_SYSCOMMAND,
 			(WPARAM)SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
-		return 0;
+                retvalue = 0;
+                goto END;
 	   }
     }
-    return DefWindowProcA(hwnd, message, wParam, lParam);
+    retvalue = DefWindowProcA(hwnd, message, wParam, lParam);
+END:
+    WIN_ReleaseWndPtr(clientWnd);
+    return retvalue;
 }
 
 
@@ -1518,6 +1636,7 @@
 {
     MDICLIENTINFO       *ci;
     WND                 *clientWnd;
+    LRESULT             retvalue;
 
     clientWnd  = WIN_FindWndPtr(GetParent16(hwnd));
     ci         = (MDICLIENTINFO *) clientWnd->wExtra;
@@ -1530,7 +1649,8 @@
 	if( ci->hwndChildMaximized == hwnd )
 	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL );
-        return 0;
+        retvalue = 0;
+        goto END;
 
       case WM_GETMINMAXINFO:
       case WM_MENUCHAR:
@@ -1542,17 +1662,23 @@
       case WM_SETVISIBLE:
       case WM_SIZE:
       case WM_NEXTMENU:
-          return DefMDIChildProcA( hwnd, message, (WPARAM16)wParam, lParam );
+          retvalue = DefMDIChildProcA( hwnd, message, (WPARAM16)wParam, lParam );
+          goto END;
 
       case WM_SYSCHAR:
       	   if (wParam == '-')
 	   {
 	   	SendMessageW(hwnd,WM_SYSCOMMAND,
 			(WPARAM)SC_KEYMENU, (LPARAM)(DWORD)VK_SPACE);
-		return 0;
+                retvalue = 0;
+                goto END;
 	   }
     }
-    return DefWindowProcW(hwnd, message, wParam, lParam);
+    retvalue = DefWindowProcW(hwnd, message, wParam, lParam);
+END:
+    WIN_ReleaseWndPtr(clientWnd);
+    return retvalue;
+    
 }
 
 
@@ -1601,6 +1727,7 @@
     MDICLIENTINFO* pCi;
     MDICREATESTRUCTA cs;
     WND *pWnd=WIN_FindWndPtr(hWndParent);
+    HWND retvalue;
 
     TRACE(mdi, "(%s,%s,%ld,%d,%d,%d,%d,%x,%d,%ld)\n",
           debugstr_a(lpClassName),debugstr_a(lpWindowName),dwStyle,X,Y,
@@ -1622,7 +1749,9 @@
 
     pCi=(MDICLIENTINFO *)pWnd->wExtra;
     
-    return MDICreateChild(pWnd,pCi,hWndParent,&cs);
+    retvalue = MDICreateChild(pWnd,pCi,hWndParent,&cs);
+    WIN_ReleaseWndPtr(pWnd);
+    return retvalue;
 }
 
 /***************************************
@@ -1701,11 +1830,13 @@
 	WND*		wnd;
 
 	ci = (MDICLIENTINFO*) clientWnd->wExtra;
+        WIN_ReleaseWndPtr(clientWnd);
 	wnd = WIN_FindWndPtr(ci->hwndActiveChild);
 	if( wnd && !(wnd->dwStyle & WS_DISABLED) )
 	{
 	    WPARAM16	wParam = 0;
 
+            WIN_ReleaseWndPtr(wnd);
 	    /* translate if the Ctrl key is down and Alt not. */
   
 	    if( (GetKeyState(VK_CONTROL) & 0x8000) && 
@@ -1731,7 +1862,9 @@
 	        return 1;
 	    }
 	}
+        WIN_ReleaseWndPtr(wnd);
     }
+    WIN_ReleaseWndPtr(clientWnd);
     return 0; /* failure */
 }
 
@@ -1750,15 +1883,17 @@
     GetClientRect( hwnd, &clientRect );
     SetRectEmpty( &childRect );
 
-    for ( pWnd = pWnd->child; pWnd; pWnd = pWnd->next )
+    for ( WIN_UpdateWndPtr(&pWnd,pWnd->child); pWnd; WIN_UpdateWndPtr(&pWnd,pWnd->next))
     {
 	  if( pWnd->dwStyle & WS_MAXIMIZE )
 	  {
 	      ShowScrollBar(hwnd, SB_BOTH, FALSE);
+              WIN_ReleaseWndPtr(pWnd);
 	      return;
 	  }
 	  UnionRect( &childRect, &pWnd->rectWindow, &childRect );
     } 
+    WIN_ReleaseWndPtr(pWnd);
     UnionRect( &childRect, &clientRect, &childRect );
 
     hmin = childRect.left; hmax = childRect.right - clientRect.right;
@@ -1780,6 +1915,7 @@
 			SCROLL_SetNCSbState( Wnd, vmin, vmax, vpos,
 						  hmin, hmax, hpos);
     }    
+    WIN_ReleaseWndPtr(Wnd);
 }
 
 
@@ -1818,8 +1954,13 @@
 	length = (wndPtr->rectClient.bottom - wndPtr->rectClient.top)/2;
 	shift = SYSMETRICS_CXVSCROLL;
     }
-    else return;
+    else
+    {
+        WIN_ReleaseWndPtr(wndPtr);
+        return;
+    }
 
+    WIN_ReleaseWndPtr(wndPtr);
     switch( wParam )
     {
 	case SB_LINEUP: