[USER32]
authorSamuel Serapion <samuel.serapion@gmail.com>
Thu, 5 Nov 2009 01:56:29 +0000 (01:56 +0000)
committerSamuel Serapion <samuel.serapion@gmail.com>
Thu, 5 Nov 2009 01:56:29 +0000 (01:56 +0000)
- Fix several user32 warnings.
- Sync GetWindow*A/W with wine and unify all versions, commenting out a wine hack.
- As a bonus implement GetWindowLongPtrA/W.
- Tested to work in trunk.

svn path=/branches/ros-amd64-bringup/; revision=43965

reactos/dll/win32/user32/misc/exit.c
reactos/dll/win32/user32/misc/misc.c
reactos/dll/win32/user32/misc/resources.c
reactos/dll/win32/user32/misc/stubs.c
reactos/dll/win32/user32/windows/class.c

index 6c4bfa6..b363055 100644 (file)
@@ -101,7 +101,7 @@ RegisterServicesProcess(DWORD ServicesProcessId)
   NTSTATUS Status;
 
   CsrRequest = MAKE_CSR_API(REGISTER_SERVICES_PROCESS, CSR_GUI);
-  Request.Data.RegisterServicesProcessRequest.ProcessId = (HANDLE)ServicesProcessId;
+  Request.Data.RegisterServicesProcessRequest.ProcessId = LongToHandle(ServicesProcessId);
 
   Status = CsrClientCallServer(&Request,
                    NULL,
index 5b8e9be..811f4ab 100644 (file)
@@ -274,7 +274,7 @@ TestWindowProcess(PWND Wnd)
       return TRUE;
    else
       return (NtUserQueryWindow(Wnd->head.h, QUERY_WINDOW_UNIQUE_PROCESS_ID) ==
-              (DWORD)NtCurrentTeb()->ClientId.UniqueProcess );
+              (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess );
 }
 
 BOOL
@@ -300,7 +300,7 @@ GetUser32Handle(HANDLE handle)
     INT Index;
     USHORT generation;
 
-    Index = (((UINT)handle & 0xffff) - FIRST_USER_HANDLE) >> 1;
+    Index = (((UINT_PTR)handle & 0xffff) - FIRST_USER_HANDLE) >> 1;
 
     if (Index < 0 || Index >= gHandleTable->nb_handles)
         return NULL;
@@ -308,7 +308,7 @@ GetUser32Handle(HANDLE handle)
     if (!gHandleEntries[Index].type || !gHandleEntries[Index].ptr)
         return NULL;
 
-    generation = (UINT)handle >> 16;
+    generation = (UINT_PTR)handle >> 16;
 
     if (generation == gHandleEntries[Index].generation || !generation || generation == 0xffff)
         return &gHandleEntries[Index];
index 171494c..c0db56c 100644 (file)
@@ -174,7 +174,7 @@ UnregisterDeviceNotification(HDEVNOTIFY Handle)
         return FALSE;
     }
 
-    ConfigRet  = UnRegNotify((ULONG) Handle );
+    ConfigRet  = UnRegNotify( HandleToUlong(Handle) );
     if (ConfigRet != CR_SUCCESS)
     {
         switch (ConfigRet)
index b053f38..05c4c92 100644 (file)
@@ -193,11 +193,11 @@ SetSysColorsTemp(const COLORREF *pPens,
             SysColorBrushes[i] = pBrushes[i];
         }
 
-        return (DWORD) pOldCol; /* FIXME: pointer truncation */
+        return PtrToLong(pOldCol); /* FIXME: pointer truncation */
     }
     if (!pPens && !pBrushes) /* "restore" call */
     {
-        LPVOID pOldCol = (LPVOID)n; /* FIXME: not 64-bit safe */
+        LPVOID pOldCol = LongToPtr(n); /* FIXME: not 64-bit safe */
         LPVOID p = pOldCol;
         DWORD nCount = *(DWORD *)p;
         p = (char*)p + sizeof(DWORD);
index 1701cc1..1a8b292 100644 (file)
@@ -658,64 +658,74 @@ GetClassWord(
 }
 
 
-/*
- * @implemented
- */
-LONG
-WINAPI
-GetWindowLongA ( HWND hWnd, int nIndex )
+LONG_PTR Internal_GetWindowLong( HWND hwnd, INT offset, UINT size, BOOL unicode )
 {
-    PWND Wnd;
+    LONG_PTR retvalue = 0;
+    WND *wndPtr;
 
-    Wnd = ValidateHwnd(hWnd);
-    if (Wnd == NULL)
+    if (offset == GWLP_HWNDPARENT)
+    {
+        HWND parent = GetAncestor( hwnd, GA_PARENT );
+        if (parent == GetDesktopWindow()) parent = GetWindow( hwnd, GW_OWNER );
+        return (ULONG_PTR)parent;
+    }
+
+    if (!(wndPtr = ValidateHwnd( hwnd )))
+    {
+        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
+    }
 
-    if (nIndex >= 0)
+    if (offset >= 0)
     {
-        if ((DWORD)nIndex + sizeof(LONG) > Wnd->cbwndExtra)
+        if (offset > (int)(wndPtr->cbwndExtra - size))
         {
-            SetLastError(ERROR_INVALID_PARAMETER);
+            WARN("Invalid offset %d\n", offset );
+            SetLastError( ERROR_INVALID_INDEX );
             return 0;
         }
-        return *((LONG *)((PCHAR)(Wnd + 1) + nIndex));
+        retvalue = *((LONG_PTR *)((PCHAR)(wndPtr + 1) + offset));
+
+        /* WINE: special case for dialog window procedure */
+        //if ((offset == DWLP_DLGPROC) && (size == sizeof(LONG_PTR)) && (wndPtr->flags & WIN_ISDIALOG))
+        //    retvalue = (LONG_PTR)IntGetWndProc( (WNDPROC)retvalue, unicode );
+        return retvalue;
     }
-    else
-    {
-        switch (nIndex)
-        {
-            case GWL_EXSTYLE:
-                return Wnd->ExStyle;
-            case GWL_STYLE:
-                return Wnd->style;
-            case GWL_HINSTANCE:
-                return (LONG)Wnd->hModule;
-            case GWL_ID:
-                return Wnd->IDMenu;
-            case GWL_USERDATA:
-                return Wnd->dwUserData;
-
-            case GWL_HWNDPARENT:
-            {
-                HWND parent = GetAncestor( hWnd, GA_PARENT );
-                if (parent == GetDesktopWindow()) parent = GetWindow( hWnd, GW_OWNER );
-                return (LONG)parent;
-            }
-            case GWL_WNDPROC:
-                if (!TestWindowProcess(Wnd))
-                {
-                   SetLastError(ERROR_ACCESS_DENIED);
-                   return 0;
-                }
-                return IntGetWndProc(Wnd, TRUE);
 
-            default:
-                SetLastError(ERROR_INVALID_PARAMETER);
-                return 0;
-        }
+    switch(offset)
+    {
+    case GWLP_USERDATA:  retvalue = wndPtr->dwUserData; break;
+    case GWL_STYLE:      retvalue = wndPtr->style; break;
+    case GWL_EXSTYLE:    retvalue = wndPtr->ExStyle; break;
+    case GWLP_ID:        retvalue = wndPtr->IDMenu; break;
+    case GWLP_HINSTANCE: retvalue = (ULONG_PTR)wndPtr->hModule; break;
+    case GWLP_WNDPROC:
+       {
+               if (!TestWindowProcess(wndPtr))
+               {
+                       SetLastError(ERROR_ACCESS_DENIED);
+                       retvalue = 0;
+               }
+               retvalue = (ULONG_PTR)IntGetWndProc(wndPtr, unicode);
+        break;
+       }
+    default:
+        WARN("Unknown offset %d\n", offset );
+        SetLastError( ERROR_INVALID_INDEX );
+        break;
     }
-}
+    return retvalue;
 
+}
+/*
+ * @implemented
+ */
+LONG
+WINAPI
+GetWindowLongA ( HWND hWnd, int nIndex )
+{
+    return Internal_GetWindowLong( hWnd, nIndex, sizeof(LONG), FALSE );
+}
 
 /*
  * @implemented
@@ -724,55 +734,7 @@ LONG
 WINAPI
 GetWindowLongW(HWND hWnd, int nIndex)
 {
-    PWND Wnd;
-
-    Wnd = ValidateHwnd(hWnd);
-    if (Wnd == NULL)
-        return 0;
-
-    if (nIndex >= 0)
-    {
-        if ((DWORD)nIndex + sizeof(LONG) > Wnd->cbwndExtra)
-        {
-            SetLastError(ERROR_INVALID_PARAMETER);
-            return 0;
-        }
-        return *((LONG *)((PCHAR)(Wnd + 1) + nIndex));
-    }
-    else
-    {
-        switch (nIndex)
-        {
-            case GWL_EXSTYLE:
-                return Wnd->ExStyle;
-            case GWL_STYLE:
-                return Wnd->style;
-            case GWL_HINSTANCE:
-                return (LONG)Wnd->hModule;
-            case GWL_ID:
-                return Wnd->IDMenu;
-            case GWL_USERDATA:
-                return Wnd->dwUserData;
-
-            case GWL_HWNDPARENT:
-            {
-                HWND parent = GetAncestor( hWnd, GA_PARENT );
-                if (parent == GetDesktopWindow()) parent = GetWindow( hWnd, GW_OWNER );
-                return (LONG)parent;
-            }
-            case GWL_WNDPROC:
-                if (!TestWindowProcess(Wnd))
-                {
-                   SetLastError(ERROR_ACCESS_DENIED);
-                   return 0;
-                }
-                return IntGetWndProc(Wnd, FALSE);
-
-            default:
-                SetLastError(ERROR_INVALID_PARAMETER);
-                return 0;
-        }
-    }
+    return Internal_GetWindowLong( hWnd, nIndex, sizeof(LONG), TRUE );
 }
 
 #ifdef _WIN64
@@ -784,8 +746,7 @@ WINAPI
 GetWindowLongPtrA(HWND hWnd,
                   INT nIndex)
 {
-    UNIMPLEMENTED;
-    return 0;
+    return Internal_GetWindowLong( hWnd, nIndex, sizeof(LONG_PTR), FALSE );
 }
 
 /*
@@ -796,8 +757,8 @@ WINAPI
 GetWindowLongPtrW(HWND hWnd,
                   INT nIndex)
 {
-    UNIMPLEMENTED;
-    return 0;
+    return Internal_GetWindowLong( hWnd, nIndex, sizeof(LONG_PTR), TRUE );
+
 }
 #endif // _WIN64
 
@@ -808,7 +769,22 @@ WORD
 WINAPI
 GetWindowWord(HWND hWnd, int nIndex)
 {
-  return (WORD)GetWindowLongW(hWnd, nIndex);
+    switch(nIndex)
+    {
+    case GWLP_ID:
+    case GWLP_HINSTANCE:
+    case GWLP_HWNDPARENT:
+        break;
+    default:
+        if (nIndex < 0)
+        {
+            WARN("Invalid offset %d\n", nIndex );
+            SetLastError( ERROR_INVALID_INDEX );
+            return 0;
+        }
+        break;
+    }
+    return Internal_GetWindowLong( hWnd, nIndex, sizeof(WORD), FALSE );
 }
 
 /*