[ros-diffs] [weiden] 30521: Optimize GetWindow() for the case GW_OWNER to read from the desktop heap

weiden at svn.reactos.org weiden at svn.reactos.org
Sat Nov 17 08:19:49 CET 2007


Author: weiden
Date: Sat Nov 17 10:19:47 2007
New Revision: 30521

URL: http://svn.reactos.org/svn/reactos?rev=30521&view=rev
Log:
Optimize GetWindow() for the case GW_OWNER to read from the desktop heap

Modified:
    trunk/reactos/dll/win32/user32/windows/window.c

Modified: trunk/reactos/dll/win32/user32/windows/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/window.c?rev=30521&r1=30520&r2=30521&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/window.c (original)
+++ trunk/reactos/dll/win32/user32/windows/window.c Sat Nov 17 10:19:47 2007
@@ -992,7 +992,42 @@
 GetWindow(HWND hWnd,
 	  UINT uCmd)
 {
-  return NtUserGetWindow(hWnd, uCmd);
+    PWINDOW Wnd, FoundWnd;
+    HWND Ret = NULL;
+
+    Wnd = ValidateHwnd(hWnd);
+    if (!Wnd)
+        return NULL;
+
+    _SEH_TRY
+    {
+        FoundWnd = NULL;
+        switch (uCmd)
+        {
+            case GW_OWNER:
+                if (Wnd->Owner != NULL)
+                    FoundWnd = DesktopPtrToUser(Wnd->Owner);
+                break;
+
+            default:
+                /* FIXME: Optimize! Fall back to NtUserGetWindow for now... */
+                Wnd = NULL;
+                break;
+        }
+
+        if (FoundWnd != NULL)
+            Ret = UserHMGetHandle(FoundWnd);
+    }
+    _SEH_HANDLE
+    {
+        /* Do nothing */
+    }
+    _SEH_END;
+
+    if (!Wnd) /* Fall back to win32k... */
+        Ret = NtUserGetWindow(hWnd, uCmd);
+
+    return Ret;
 }
 
 




More information about the Ros-diffs mailing list