Made all 16<->32 HWND conversions use explicit functions instead of
implicit type casts.
Moved a lot of 16-bit functions to the new wnd16.c file.
Changed DIALOGINFO structure handling to support 32-bit handles.

diff --git a/windows/win.c b/windows/win.c
index 5684fb9..9aa8dd3 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -34,8 +34,6 @@
 /* Desktop window */
 static WND *pWndDesktop = NULL;
 
-static HWND hwndSysModal = 0;
-
 static WORD wDragWidth = 4;
 static WORD wDragHeight= 3;
 
@@ -80,7 +78,7 @@
 static WND *create_window_handle( BOOL desktop, INT size )
 {
     BOOL res;
-    unsigned int handle = 0;
+    user_handle_t handle = 0;
     WND *win = HeapAlloc( GetProcessHeap(), 0, size );
 
     if (!win) return NULL;
@@ -111,7 +109,7 @@
         return NULL;
     }
     user_handles[LOWORD(handle)] = win;
-    win->hwndSelf = (HWND)handle;
+    win->hwndSelf = handle;
     win->dwMagic = WND_MAGIC;
     win->irefCount = 1;
     return win;
@@ -177,9 +175,11 @@
 HWND WIN_Handle32( HWND16 hwnd16 )
 {
     WND *ptr;
-    HWND hwnd = (HWND)hwnd16;
+    HWND hwnd = (HWND)(ULONG_PTR)hwnd16;
 
-    if (!hwnd || hwnd == HWND_BROADCAST) return hwnd;
+    if (hwnd16 <= 1 || hwnd16 == 0xffff) return hwnd;
+    /* do sign extension for -2 and -3 */
+    if (hwnd16 >= (HWND16)-3) return (HWND)(LONG_PTR)(INT16)hwnd16;
 
     if ((ptr = get_wnd_ptr( hwnd )))
     {
@@ -190,7 +190,7 @@
     {
         SERVER_START_REQ( get_window_info )
         {
-            req->handle = (user_handle_t)hwnd16;
+            req->handle = hwnd;
             if (!SERVER_CALL_ERR()) hwnd = req->full_handle;
         }
         SERVER_END_REQ;
@@ -804,8 +804,10 @@
 
 	cbtc.lpcs = cs;
 	cbtc.hwndInsertAfter = hwndLinkAfter;
-        ret = (type == WIN_PROC_32W) ? HOOK_CallHooksW(WH_CBT, HCBT_CREATEWND, hwnd, (LPARAM)&cbtc)
-                      : HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND, hwnd, (LPARAM)&cbtc);
+        ret = (type == WIN_PROC_32W) ? HOOK_CallHooksW(WH_CBT, HCBT_CREATEWND,
+                                                       (WPARAM)hwnd, (LPARAM)&cbtc)
+                                     : HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND,
+                                                       (WPARAM)hwnd, (LPARAM)&cbtc);
         if (ret)
 	{
 	    TRACE("CBT-hook returned 0\n");
@@ -915,7 +917,7 @@
     /* Call WH_SHELL hook */
 
     if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
-        HOOK_CallHooksA( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
+        HOOK_CallHooksA( WH_SHELL, HSHELL_WINDOWCREATED, (WPARAM)hwnd, 0 );
 
     TRACE("created window %04x\n", hwnd);
  end:
@@ -983,13 +985,13 @@
     cs.lpCreateParams = data;
     cs.hInstance      = (HINSTANCE)instance;
     cs.hMenu          = (HMENU)menu;
-    cs.hwndParent     = (HWND)parent;
+    cs.hwndParent     = WIN_Handle32( parent );
     cs.style          = style;
     cs.lpszName       = windowName;
     cs.lpszClass      = className;
     cs.dwExStyle      = exStyle;
 
-    return WIN_CreateWindowEx( &cs, classAtom, WIN_PROC_16 );
+    return WIN_Handle16( WIN_CreateWindowEx( &cs, classAtom, WIN_PROC_16 ));
 }
 
 
@@ -1153,15 +1155,6 @@
 
 
 /***********************************************************************
- *		DestroyWindow (USER.53)
- */
-BOOL16 WINAPI DestroyWindow16( HWND16 hwnd )
-{
-    return DestroyWindow(hwnd);
-}
-
-
-/***********************************************************************
  *		DestroyWindow (USER32.@)
  */
 BOOL WINAPI DestroyWindow( HWND hwnd )
@@ -1190,12 +1183,12 @@
 
       /* Call hooks */
 
-    if( HOOK_CallHooksA( WH_CBT, HCBT_DESTROYWND, hwnd, 0L) ) return FALSE;
+    if( HOOK_CallHooksA( WH_CBT, HCBT_DESTROYWND, (WPARAM)hwnd, 0L) ) return FALSE;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
     if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
     {
-        HOOK_CallHooksA( WH_SHELL, HSHELL_WINDOWDESTROYED, hwnd, 0L );
+        HOOK_CallHooksA( WH_SHELL, HSHELL_WINDOWDESTROYED, (WPARAM)hwnd, 0L );
         /* FIXME: clean up palette - see "Internals" p.352 */
     }
 
@@ -1293,15 +1286,6 @@
 
 
 /***********************************************************************
- *		CloseWindow (USER.43)
- */
-BOOL16 WINAPI CloseWindow16( HWND16 hwnd )
-{
-    return CloseWindow( hwnd );
-}
-
-
-/***********************************************************************
  *		CloseWindow (USER32.@)
  */
 BOOL WINAPI CloseWindow( HWND hwnd )
@@ -1324,15 +1308,6 @@
 
 
 /***********************************************************************
- *		OpenIcon (USER.44)
- */
-BOOL16 WINAPI OpenIcon16( HWND16 hwnd )
-{
-    return OpenIcon( hwnd );
-}
-
-
-/***********************************************************************
  *		OpenIcon (USER32.@)
  */
 BOOL WINAPI OpenIcon( HWND hwnd )
@@ -1399,24 +1374,6 @@
 
 
 /***********************************************************************
- *		FindWindow (USER.50)
- */
-HWND16 WINAPI FindWindow16( LPCSTR className, LPCSTR title )
-{
-    return FindWindowA( className, title );
-}
-
-
-/***********************************************************************
- *		FindWindowEx (USER.427)
- */
-HWND16 WINAPI FindWindowEx16( HWND16 parent, HWND16 child, LPCSTR className, LPCSTR title )
-{
-    return FindWindowExA( parent, child, className, title );
-}
-
-
-/***********************************************************************
  *		FindWindowA (USER32.@)
  */
 HWND WINAPI FindWindowA( LPCSTR className, LPCSTR title )
@@ -1487,15 +1444,6 @@
 
 
 /**********************************************************************
- *		GetDesktopWindow (USER.286)
- */
-HWND16 WINAPI GetDesktopWindow16(void)
-{
-    return (HWND16)pWndDesktop->hwndSelf;
-}
-
-
-/**********************************************************************
  *		GetDesktopWindow (USER32.@)
  */
 HWND WINAPI GetDesktopWindow(void)
@@ -1507,27 +1455,6 @@
 }
 
 
-/**********************************************************************
- *		GetDesktopHwnd (USER.278)
- *
- * Exactly the same thing as GetDesktopWindow(), but not documented.
- * Don't ask me why...
- */
-HWND16 WINAPI GetDesktopHwnd16(void)
-{
-    return (HWND16)pWndDesktop->hwndSelf;
-}
-
-
-/*******************************************************************
- *		EnableWindow (USER.34)
- */
-BOOL16 WINAPI EnableWindow16( HWND16 hwnd, BOOL16 enable )
-{
-    return EnableWindow( hwnd, enable );
-}
-
-
 /*******************************************************************
  *		EnableWindow (USER32.@)
  */
@@ -1571,15 +1498,6 @@
 
 
 /***********************************************************************
- *		IsWindowEnabled (USER.35)
- */
-BOOL16 WINAPI IsWindowEnabled16(HWND16 hWnd)
-{
-    return IsWindowEnabled(hWnd);
-}
-
-
-/***********************************************************************
  *		IsWindowEnabled (USER32.@)
  */
 BOOL WINAPI IsWindowEnabled(HWND hWnd)
@@ -1611,15 +1529,6 @@
 
 
 /**********************************************************************
- *		GetWindowWord (USER.133)
- */
-WORD WINAPI GetWindowWord16( HWND16 hwnd, INT16 offset )
-{
-    return GetWindowWord( hwnd, offset );
-}
-
-
-/**********************************************************************
  *		GetWindowWord (USER32.@)
  */
 WORD WINAPI GetWindowWord( HWND hwnd, INT offset )
@@ -1633,44 +1542,29 @@
         {
             WARN("Invalid offset %d\n", offset );
             retvalue = 0;
-            goto end;
         }
-        retvalue = *(WORD *)(((char *)wndPtr->wExtra) + offset);
-        goto end;
+        else retvalue = *(WORD *)(((char *)wndPtr->wExtra) + offset);
+        WIN_ReleaseWndPtr(wndPtr);
+        return retvalue;
     }
+
+    WIN_ReleaseWndPtr(wndPtr);
     switch(offset)
     {
-    case GWW_ID:
-    	if (HIWORD(wndPtr->wIDmenu))
-    		WARN("GWW_ID: discards high bits of 0x%08x!\n",
-                    wndPtr->wIDmenu);
-        retvalue = (WORD)wndPtr->wIDmenu;
-        goto end;
-    case GWW_HWNDPARENT:
-    	retvalue =  GetParent(hwnd);
-        goto end;
-    case GWW_HINSTANCE:
-    	if (HIWORD(wndPtr->hInstance))
-    		WARN("GWW_HINSTANCE: discards high bits of 0x%08x!\n",
-                    wndPtr->hInstance);
-        retvalue = (WORD)wndPtr->hInstance;
-        goto end;
+    case GWL_HWNDPARENT:
+        return GetWindowLongW( hwnd, offset );
+    case GWL_ID:
+    case GWL_HINSTANCE:
+        {
+            LONG ret = GetWindowLongW( hwnd, offset );
+            if (HIWORD(ret))
+                WARN("%d: discards high bits of 0x%08lx!\n", offset, ret );
+            return LOWORD(ret);
+        }
     default:
         WARN("Invalid offset %d\n", offset );
-        retvalue = 0;
-        goto end;
+        return 0;
     }
-end:
-    WIN_ReleaseWndPtr(wndPtr);
-    return retvalue;
-}
-
-/**********************************************************************
- *		SetWindowWord (USER.134)
- */
-WORD WINAPI SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
-{
-    return SetWindowWord( hwnd, offset, newval );
 }
 
 
@@ -1687,27 +1581,27 @@
         if (offset + sizeof(WORD) > wndPtr->cbWndExtra)
         {
             WARN("Invalid offset %d\n", offset );
-            retval = 0;
-            goto end;
+            WIN_ReleaseWndPtr(wndPtr);
+            return 0;
         }
         ptr = (WORD *)(((char *)wndPtr->wExtra) + offset);
+        retval = *ptr;
+        *ptr = newval;
+        WIN_ReleaseWndPtr(wndPtr);
+        return retval;
     }
-    else switch(offset)
-    {
-	case GWW_ID:        ptr = (WORD *)&wndPtr->wIDmenu; break;
-	case GWW_HINSTANCE: ptr = (WORD *)&wndPtr->hInstance; break;
-        case GWW_HWNDPARENT: retval = SetParent( hwnd, newval );
-                             goto end;
-	default:
-            WARN("Invalid offset %d\n", offset );
-            retval = 0;
-            goto end;
-    }
-    retval = *ptr;
-    *ptr = newval;
-end:
+
     WIN_ReleaseWndPtr(wndPtr);
-    return retval;
+    switch(offset)
+    {
+    case GWL_ID:
+    case GWL_HINSTANCE:
+    case GWL_HWNDPARENT:
+        return SetWindowLongW( hwnd, offset, (UINT)newval );
+    default:
+        WARN("Invalid offset %d\n", offset );
+        return 0;
+    }
 }
 
 
@@ -1751,7 +1645,7 @@
         case GWL_WNDPROC:    retvalue = (LONG)WINPROC_GetProc( wndPtr->winproc,
                                                            type );
                              goto end;
-        case GWL_HWNDPARENT: retvalue = GetParent(hwnd);
+        case GWL_HWNDPARENT: retvalue = (LONG)GetParent(hwnd);
                              goto end;
         case GWL_HINSTANCE:  retvalue = wndPtr->hInstance;
                              goto end;
@@ -1870,7 +1764,7 @@
  */
 LONG WINAPI GetWindowLong16( HWND16 hwnd, INT16 offset )
 {
-    return WIN_GetWindowLong( (HWND)hwnd, offset, WIN_PROC_16 );
+    return WIN_GetWindowLong( WIN_Handle32(hwnd), offset, WIN_PROC_16 );
 }
 
 
@@ -1897,7 +1791,7 @@
  */
 LONG WINAPI SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
 {
-    return WIN_SetWindowLong( hwnd, offset, newval, WIN_PROC_16 );
+    return WIN_SetWindowLong( WIN_Handle32(hwnd), offset, newval, WIN_PROC_16 );
 }
 
 
@@ -1995,15 +1889,6 @@
 
 
 /*******************************************************************
- *		GetWindowText (USER.36)
- */
-INT16 WINAPI GetWindowText16( HWND16 hwnd, SEGPTR lpString, INT16 nMaxCount )
-{
-    return (INT16)SendMessage16(hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString);
-}
-
-
-/*******************************************************************
  *		GetWindowTextA (USER32.@)
  */
 INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount )
@@ -2037,15 +1922,6 @@
 
 
 /*******************************************************************
- *		SetWindowText (USER.37)
- */
-BOOL16 WINAPI SetWindowText16( HWND16 hwnd, SEGPTR lpString )
-{
-    return (BOOL16)SendMessage16( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
-}
-
-
-/*******************************************************************
  *		SetWindowText  (USER32.@)
  *		SetWindowTextA (USER32.@)
  */
@@ -2065,15 +1941,6 @@
 
 
 /*******************************************************************
- *		GetWindowTextLength (USER.38)
- */
-INT16 WINAPI GetWindowTextLength16( HWND16 hwnd )
-{
-    return (INT16)GetWindowTextLengthA( hwnd );
-}
-
-
-/*******************************************************************
  *		GetWindowTextLengthA (USER32.@)
  */
 INT WINAPI GetWindowTextLengthA( HWND hwnd )
@@ -2091,16 +1958,6 @@
 
 
 /*******************************************************************
- *		IsWindow (USER.47)
- */
-BOOL16 WINAPI IsWindow16( HWND16 hwnd )
-{
-    CURRENT_STACK16->es = USER_HeapSel;
-    return IsWindow( hwnd );
-}
-
-
-/*******************************************************************
  *		IsWindow (USER32.@)
  */
 BOOL WINAPI IsWindow( HWND hwnd )
@@ -2167,15 +2024,6 @@
 
 
 /*****************************************************************
- *		GetParent (USER.46)
- */
-HWND16 WINAPI GetParent16( HWND16 hwnd )
-{
-    return (HWND16)GetParent( hwnd );
-}
-
-
-/*****************************************************************
  *		GetParent (USER32.@)
  */
 HWND WINAPI GetParent( HWND hwnd )
@@ -2234,15 +2082,6 @@
 
 
 /*****************************************************************
- *		SetParent (USER.233)
- */
-HWND16 WINAPI SetParent16( HWND16 hwndChild, HWND16 hwndNewParent )
-{
-    return SetParent( hwndChild, hwndNewParent );
-}
-
-
-/*****************************************************************
  *		SetParent (USER32.@)
  */
 HWND WINAPI SetParent( HWND hwnd, HWND parent )
@@ -2302,15 +2141,6 @@
 
 
 /*******************************************************************
- *		IsChild (USER.48)
- */
-BOOL16 WINAPI IsChild16( HWND16 parent, HWND16 child )
-{
-    return IsChild(parent,child);
-}
-
-
-/*******************************************************************
  *		IsChild (USER32.@)
  */
 BOOL WINAPI IsChild( HWND parent, HWND child )
@@ -2329,15 +2159,6 @@
 
 
 /***********************************************************************
- *		IsWindowVisible (USER.49)
- */
-BOOL16 WINAPI IsWindowVisible16( HWND16 hwnd )
-{
-    return IsWindowVisible(hwnd);
-}
-
-
-/***********************************************************************
  *		IsWindowVisible (USER32.@)
  */
 BOOL WINAPI IsWindowVisible( HWND hwnd )
@@ -2384,15 +2205,6 @@
 
 
 /*******************************************************************
- *		GetTopWindow (USER.229)
- */
-HWND16 WINAPI GetTopWindow16( HWND16 hwnd )
-{
-    return GetTopWindow(hwnd);
-}
-
-
-/*******************************************************************
  *		GetTopWindow (USER32.@)
  */
 HWND WINAPI GetTopWindow( HWND hwnd )
@@ -2403,15 +2215,6 @@
 
 
 /*******************************************************************
- *		GetWindow (USER.262)
- */
-HWND16 WINAPI GetWindow16( HWND16 hwnd, WORD rel )
-{
-    return GetWindow( hwnd,rel );
-}
-
-
-/*******************************************************************
  *		GetWindow (USER32.@)
  */
 HWND WINAPI GetWindow( HWND hwnd, WORD rel )
@@ -2484,15 +2287,6 @@
 }
 
 
-/*******************************************************************
- *		GetNextWindow (USER.230)
- */
-HWND16 WINAPI GetNextWindow16( HWND16 hwnd, WORD flag )
-{
-    if ((flag != GW_HWNDNEXT) && (flag != GW_HWNDPREV)) return 0;
-    return GetWindow16( hwnd, flag );
-}
-
 /***********************************************************************
  *           WIN_InternalShowOwnedPopups
  *
@@ -2558,15 +2352,6 @@
 }
 
 /*******************************************************************
- *		ShowOwnedPopups (USER.265)
- */
-void WINAPI ShowOwnedPopups16( HWND16 owner, BOOL16 fShow )
-{
-    ShowOwnedPopups( owner, fShow );
-}
-
-
-/*******************************************************************
  *		ShowOwnedPopups (USER32.@)
  */
 BOOL WINAPI ShowOwnedPopups( HWND owner, BOOL fShow )
@@ -2618,14 +2403,6 @@
 
 
 /*******************************************************************
- *		GetLastActivePopup (USER.287)
- */
-HWND16 WINAPI GetLastActivePopup16( HWND16 hwnd )
-{
-    return GetLastActivePopup( hwnd );
-}
-
-/*******************************************************************
  *		GetLastActivePopup (USER32.@)
  */
 HWND WINAPI GetLastActivePopup( HWND hwnd )
@@ -2873,15 +2650,6 @@
 
 
 /*******************************************************************
- *		FlashWindow (USER.105)
- */
-BOOL16 WINAPI FlashWindow16( HWND16 hWnd, BOOL16 bInvert )
-{
-    return FlashWindow( hWnd, bInvert );
-}
-
-
-/*******************************************************************
  *		FlashWindow (USER32.@)
  */
 BOOL WINAPI FlashWindow( HWND hWnd, BOOL bInvert )
@@ -2927,27 +2695,6 @@
 
 
 /*******************************************************************
- *		SetSysModalWindow (USER.188)
- */
-HWND16 WINAPI SetSysModalWindow16( HWND16 hWnd )
-{
-    HWND hWndOldModal = hwndSysModal;
-    hwndSysModal = hWnd;
-    FIXME("EMPTY STUB !! SetSysModalWindow(%04x) !\n", hWnd);
-    return hWndOldModal;
-}
-
-
-/*******************************************************************
- *		GetSysModalWindow (USER.189)
- */
-HWND16 WINAPI GetSysModalWindow16(void)
-{
-    return hwndSysModal;
-}
-
-
-/*******************************************************************
  *		GetWindowContextHelpId (USER32.@)
  */
 DWORD WINAPI GetWindowContextHelpId( HWND hwnd )
@@ -3044,16 +2791,6 @@
 
 
 /*******************************************************************
- *		DragDetect (USER.465)
- */
-BOOL16 WINAPI DragDetect16( HWND16 hWnd, POINT16 pt )
-{
-    POINT pt32;
-    CONV_POINT16TO32( &pt, &pt32 );
-    return DragDetect( hWnd, pt32 );
-}
-
-/*******************************************************************
  *		DragDetect (USER32.@)
  */
 BOOL WINAPI DragDetect( HWND hWnd, POINT pt )