[ros-diffs] [tkreuzer] 46657: [WIN32K] Refactor NtUserClipCursor, don't acquire user lock in UserRedrawDesktop,

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Fri Apr 2 00:30:44 CEST 2010


Author: tkreuzer
Date: Fri Apr  2 00:30:44 2010
New Revision: 46657

URL: http://svn.reactos.org/svn/reactos?rev=46657&view=rev
Log:
[WIN32K]
Refactor NtUserClipCursor, don't acquire user lock in UserRedrawDesktop, 

Modified:
    branches/reactos-yarotows/subsystems/win32/win32k/ntuser/cursoricon.c
    branches/reactos-yarotows/subsystems/win32/win32k/ntuser/desktop.c

Modified: branches/reactos-yarotows/subsystems/win32/win32k/ntuser/cursoricon.c
URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win32/win32k/ntuser/cursoricon.c?rev=46657&r1=46656&r2=46657&view=diff
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] Fri Apr  2 00:30:44 2010
@@ -776,6 +776,39 @@
     END_CLEANUP;
 }
 
+BOOL
+APIENTRY
+UserClipCursor(
+    RECTL *prcl)
+{
+    /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */
+    PSYSTEM_CURSORINFO CurInfo;
+    PWINDOW_OBJECT DesktopWindow = NULL;
+
+    CurInfo = IntGetSysCursorInfo();
+
+    DesktopWindow = UserGetDesktopWindow();
+
+    if (prcl != NULL && 
+       (prcl->right > prcl->left) && 
+       (prcl->bottom > prcl->top) &&
+        DesktopWindow != NULL)
+    {
+        CurInfo->CursorClipInfo.IsClipped = TRUE;
+        CurInfo->CursorClipInfo.Left = max(prcl->left, DesktopWindow->Wnd->rcWindow.left);
+        CurInfo->CursorClipInfo.Top = max(prcl->top, DesktopWindow->Wnd->rcWindow.top);
+        CurInfo->CursorClipInfo.Right = min(prcl->right, DesktopWindow->Wnd->rcWindow.right);
+        CurInfo->CursorClipInfo.Bottom = min(prcl->bottom, DesktopWindow->Wnd->rcWindow.bottom);
+
+        UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y);
+    }
+    else
+    {
+        CurInfo->CursorClipInfo.IsClipped = FALSE;
+    }
+
+    return TRUE;
+}
 
 /*
  * @implemented
@@ -783,49 +816,38 @@
 BOOL
 APIENTRY
 NtUserClipCursor(
-    RECTL *UnsafeRect)
+    RECTL *prcl)
 {
     /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */
-    PSYSTEM_CURSORINFO CurInfo;
-    RECTL Rect;
-    PWINDOW_OBJECT DesktopWindow = NULL;
-    DECLARE_RETURN(BOOL);
-
-    DPRINT("Enter NtUserClipCursor\n");
+    RECTL rclLocal;
+    BOOL bResult;
+
+    if (prcl)
+    {
+        _SEH2_TRY
+        {
+            /* Probe and copy rect */
+            ProbeForRead(prcl, sizeof(RECTL), 1);
+            rclLocal = *prcl;
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            SetLastWin32Error(ERROR_INVALID_PARAMETER);
+            _SEH2_YIELD(return FALSE;)
+        }
+        _SEH2_END
+
+        prcl = &rclLocal;
+    }
+
     UserEnterExclusive();
 
-    if (NULL != UnsafeRect && ! NT_SUCCESS(MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT))))
-    {
-        SetLastWin32Error(ERROR_INVALID_PARAMETER);
-        RETURN(FALSE);
-    }
-
-    CurInfo = IntGetSysCursorInfo();
-
-    DesktopWindow = UserGetDesktopWindow();
-
-    if ((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
-            && DesktopWindow && UnsafeRect != NULL)
-    {
-
-        CurInfo->CursorClipInfo.IsClipped = TRUE;
-        CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->Wnd->rcWindow.left);
-        CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->Wnd->rcWindow.top);
-        CurInfo->CursorClipInfo.Right = min(Rect.right, DesktopWindow->Wnd->rcWindow.right);
-        CurInfo->CursorClipInfo.Bottom = min(Rect.bottom, DesktopWindow->Wnd->rcWindow.bottom);
-
-        UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y);
-
-        RETURN(TRUE);
-    }
-
-    CurInfo->CursorClipInfo.IsClipped = FALSE;
-    RETURN(TRUE);
-
-CLEANUP:
-    DPRINT("Leave NtUserClipCursor, ret=%i\n",_ret_);
+    /* Call the internal function */
+    bResult = UserClipCursor(prcl);
+
     UserLeave();
-    END_CLEANUP;
+
+    return bResult;
 }
 
 

Modified: branches/reactos-yarotows/subsystems/win32/win32k/ntuser/desktop.c
URL: http://svn.reactos.org/svn/reactos/branches/reactos-yarotows/subsystems/win32/win32k/ntuser/desktop.c?rev=46657&r1=46656&r2=46657&view=diff
==============================================================================
--- branches/reactos-yarotows/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original)
+++ branches/reactos-yarotows/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Fri Apr  2 00:30:44 2010
@@ -645,8 +645,6 @@
 {
     PWINDOW_OBJECT Window = NULL;
 
-    UserEnterExclusive();
-
     Window = UserGetDesktopWindow();
 
     IntInvalidateWindows( Window,
@@ -655,7 +653,6 @@
                        RDW_ERASE |
                   RDW_INVALIDATE |
                  RDW_ALLCHILDREN);
-    UserLeave();
 }
 
 




More information about the Ros-diffs mailing list