Author: gadamopoulos Date: Sat Dec 19 17:23:05 2009 New Revision: 44655
URL: http://svn.reactos.org/svn/reactos?rev=44655&view=rev Log: [win32k] - Don't store SYSTEM_CURSORINFO inside WINSTATION_OBJECT. Use a global variable instead - Remove IntGetCursorLocation. Use directly gpsi->ptCursor
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h trunk/reactos/subsystems/win32/win32k/include/winsta.h trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c trunk/reactos/subsystems/win32/win32k/ntuser/input.c trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c trunk/reactos/subsystems/win32/win32k/ntuser/message.c trunk/reactos/subsystems/win32/win32k/ntuser/metric.c trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/cursoricon.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/cursoricon.h [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -69,21 +69,20 @@ BOOL ScreenSaverRunning; } SYSTEM_CURSORINFO, *PSYSTEM_CURSORINFO;
-HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange); -BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject); -PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject); +BOOL FASTCALL InitCursorImpl(); +PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(); VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process); - -BOOL FASTCALL IntGetCursorLocation(PWINSTATION_OBJECT WinStaObject, POINT *loc);
BOOL UserDrawIconEx(HDC hDc, INT xLeft, INT yTop, PCURICON_OBJECT pIcon, INT cxWidth, INT cyHeight, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon);
+BOOL FASTCALL UserSetCursorPos( INT x, INT y); + int APIENTRY UserShowCursor(BOOL bShow);
-#define IntGetSysCursorInfo(WinStaObj) \ - (PSYSTEM_CURSORINFO)((WinStaObj)->SystemCursor) +PSYSTEM_CURSORINFO FASTCALL +IntGetSysCursorInfo();
#define IntReleaseCurIconObject(CurIconObj) \ UserDereferenceObject(CurIconObj)
Modified: trunk/reactos/subsystems/win32/win32k/include/winsta.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -29,7 +29,6 @@ LIST_ENTRY DesktopListHead; PRTL_ATOM_TABLE AtomTable; HANDLE SystemMenuTemplate; - PVOID SystemCursor; UINT CaretBlinkRate; HANDLE ShellWindow; HANDLE ShellListView;
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -44,13 +44,36 @@ static PAGED_LOOKASIDE_LIST gProcessLookasideList; static LIST_ENTRY gCurIconList;
+SYSTEM_CURSORINFO gSysCursorInfo; + BOOL FASTCALL -IntGetCursorLocation(PWINSTATION_OBJECT WinSta, POINT *loc) -{ - loc->x = gpsi->ptCursor.x; - loc->y = gpsi->ptCursor.y; +InitCursorImpl() +{ + ExInitializePagedLookasideList(&gProcessLookasideList, + NULL, + NULL, + 0, + sizeof(CURICON_PROCESS), + TAG_DIB, + 128); + InitializeListHead(&gCurIconList); + + gSysCursorInfo.Enabled = FALSE; + gSysCursorInfo.ButtonsDown = 0; + gSysCursorInfo.CursorClipInfo.IsClipped = FALSE; + gSysCursorInfo.LastBtnDown = 0; + gSysCursorInfo.CurrentCursorObject = NULL; + gSysCursorInfo.ShowingCursor = 0; + gSysCursorInfo.ClickLockActive = FALSE; + gSysCursorInfo.ClickLockTime = 0;
return TRUE; +} + +PSYSTEM_CURSORINFO FASTCALL +IntGetSysCursorInfo() +{ + return &gSysCursorInfo; }
/* This function creates a reference for the object! */ @@ -78,8 +101,7 @@
HCURSOR FASTCALL -IntSetCursor( - PWINSTATION_OBJECT WinSta, +UserSetCursor( PCURICON_OBJECT NewCursor, BOOL ForceChange) { @@ -88,8 +110,9 @@ HCURSOR hOldCursor = (HCURSOR)0; HDC hdcScreen; BOOL bResult; - - CurInfo = IntGetSysCursorInfo(WinSta); + + CurInfo = IntGetSysCursorInfo(); + OldCursor = CurInfo->CurrentCursorObject; if (OldCursor) { @@ -152,22 +175,6 @@ return hOldCursor; }
- -BOOL FASTCALL -IntSetupCurIconHandles(PWINSTATION_OBJECT WinSta) -{ - ExInitializePagedLookasideList(&gProcessLookasideList, - NULL, - NULL, - 0, - sizeof(CURICON_PROCESS), - TAG_DIB, - 128); - InitializeListHead(&gCurIconList); - - return TRUE; -} - /* * We have to register that this object is in use by the current * process. The only way to do that seems to be to walk the list @@ -207,7 +214,7 @@ }
PCURICON_OBJECT FASTCALL -IntFindExistingCurIconObject(PWINSTATION_OBJECT WinSta, HMODULE hModule, +IntFindExistingCurIconObject(HMODULE hModule, HRSRC hRsrc, LONG cx, LONG cy) { PCURICON_OBJECT CurIcon; @@ -241,7 +248,7 @@ }
PCURICON_OBJECT FASTCALL -IntCreateCurIconHandle(PWINSTATION_OBJECT WinSta) +IntCreateCurIconHandle() { PCURICON_OBJECT CurIcon; HANDLE hCurIcon; @@ -271,7 +278,7 @@ }
BOOLEAN FASTCALL -IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL ProcessCleanup) +IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, BOOL ProcessCleanup) { PSYSTEM_CURSORINFO CurInfo; HBITMAP bmpMask, bmpColor; @@ -321,12 +328,12 @@ RemoveEntryList(&CurIcon->ListEntry); }
- CurInfo = IntGetSysCursorInfo(WinSta); + CurInfo = IntGetSysCursorInfo();
if (CurInfo->CurrentCursorObject == CurIcon) { /* Hide the cursor if we're destroying the current cursor */ - IntSetCursor(WinSta, NULL, TRUE); + UserSetCursor(NULL, TRUE); }
bmpMask = CurIcon->IconInfo.hbmMask; @@ -356,15 +363,8 @@ VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process) { - PWINSTATION_OBJECT WinSta; PCURICON_OBJECT CurIcon, tmp; PCURICON_PROCESS ProcessData; - - WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - return; - }
LIST_FOR_EACH_SAFE(CurIcon, tmp, &gCurIconList, CURICON_OBJECT, ListEntry) { @@ -376,7 +376,7 @@ if (Win32Process == ProcessData->Process) { RemoveEntryList(&CurIcon->ListEntry); - IntDestroyCurIconObject(WinSta, CurIcon, TRUE); + IntDestroyCurIconObject(CurIcon, TRUE); CurIcon = NULL; break; } @@ -391,7 +391,6 @@ } }
- ObDereferenceObject(WinSta); }
/* @@ -402,7 +401,6 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect) { PCURICON_OBJECT CurIcon; - PWINSTATION_OBJECT WinSta; PSURFACE psurfBmp; NTSTATUS Status; HANDLE Ret; @@ -411,16 +409,9 @@ DPRINT("Enter NtUserCreateCursorIconHandle\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN((HANDLE)0); - } - - if (!(CurIcon = IntCreateCurIconHandle(WinSta))) + if (!(CurIcon = IntCreateCurIconHandle())) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - ObDereferenceObject(WinSta); RETURN((HANDLE)0); }
@@ -473,7 +464,6 @@ }
UserDereferenceObject(CurIcon); - ObDereferenceObject(WinSta); RETURN(Ret);
CLEANUP: @@ -643,7 +633,6 @@ { CURSORINFO SafeCi; PSYSTEM_CURSORINFO CurInfo; - PWINSTATION_OBJECT WinSta; NTSTATUS Status = STATUS_SUCCESS; PCURICON_OBJECT CurIcon; BOOL Ret = FALSE; @@ -652,20 +641,14 @@ DPRINT("Enter NtUserGetCursorInfo\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - - CurInfo = IntGetSysCursorInfo(WinSta); + CurInfo = IntGetSysCursorInfo(); CurIcon = (PCURICON_OBJECT)CurInfo->CurrentCursorObject;
SafeCi.cbSize = sizeof(CURSORINFO); SafeCi.flags = ((CurInfo->ShowingCursor && CurIcon) ? CURSOR_SHOWING : 0); SafeCi.hCursor = (CurIcon ? (HCURSOR)CurIcon->Self : (HCURSOR)0);
- IntGetCursorLocation(WinSta, &SafeCi.ptScreenPos); + SafeCi.ptScreenPos = gpsi->ptCursor;
_SEH2_TRY { @@ -690,7 +673,6 @@ SetLastNtError(Status); }
- ObDereferenceObject(WinSta); RETURN(Ret);
CLEANUP: @@ -709,35 +691,23 @@ RECTL *UnsafeRect) { /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */ - - PWINSTATION_OBJECT WinSta; PSYSTEM_CURSORINFO CurInfo; RECTL Rect; PWINDOW_OBJECT DesktopWindow = NULL; - POINT MousePos = {0}; DECLARE_RETURN(BOOL);
DPRINT("Enter NtUserClipCursor\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - if (NULL != UnsafeRect && ! NT_SUCCESS(MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT)))) { - ObDereferenceObject(WinSta); SetLastWin32Error(ERROR_INVALID_PARAMETER); RETURN(FALSE); }
- CurInfo = IntGetSysCursorInfo(WinSta); - IntGetCursorLocation(WinSta, &MousePos); - - if (WinSta->ActiveDesktop) - DesktopWindow = UserGetWindowObject(WinSta->ActiveDesktop->DesktopWindow); + CurInfo = IntGetSysCursorInfo(); + + DesktopWindow = UserGetDesktopWindow();
if ((Rect.right > Rect.left) && (Rect.bottom > Rect.top) && DesktopWindow && UnsafeRect != NULL) @@ -750,8 +720,8 @@ CurInfo->CursorClipInfo.Right = min(Rect.right - 1, DesktopWindow->Wnd->rcWindow.right - 1); CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->Wnd->rcWindow.bottom - 1);
- mi.dx = MousePos.x; - mi.dy = MousePos.y; + mi.dx = gpsi->ptCursor.x; + mi.dy = gpsi->ptCursor.y; mi.mouseData = 0; mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; mi.time = 0; @@ -762,8 +732,6 @@ }
CurInfo->CursorClipInfo.IsClipped = FALSE; - ObDereferenceObject(WinSta); - RETURN(TRUE);
CLEANUP: @@ -782,7 +750,6 @@ HANDLE hCurIcon, DWORD Unknown) { - PWINSTATION_OBJECT WinSta; PCURICON_OBJECT CurIcon; BOOL ret; DECLARE_RETURN(BOOL); @@ -790,22 +757,14 @@ DPRINT("Enter NtUserDestroyCursorIcon\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) + if (!(CurIcon = UserGetCurIconObject(hCurIcon))) { RETURN(FALSE); }
- if (!(CurIcon = UserGetCurIconObject(hCurIcon))) - { - ObDereferenceObject(WinSta); - RETURN(FALSE); - } - - ret = IntDestroyCurIconObject(WinSta, CurIcon, FALSE); + ret = IntDestroyCurIconObject(CurIcon, FALSE); /* Note: IntDestroyCurIconObject will remove our reference for us! */
- ObDereferenceObject(WinSta); RETURN(ret);
CLEANUP: @@ -827,31 +786,22 @@ LONG cy) { PCURICON_OBJECT CurIcon; - PWINSTATION_OBJECT WinSta; HANDLE Ret = (HANDLE)0; DECLARE_RETURN(HICON);
DPRINT("Enter NtUserFindExistingCursorIcon\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { + CurIcon = IntFindExistingCurIconObject(hModule, hRsrc, cx, cy); + if (CurIcon) + { + Ret = CurIcon->Self; + +// IntReleaseCurIconObject(CurIcon);//faxme: is this correct? does IntFindExistingCurIconObject add a ref? RETURN(Ret); }
- CurIcon = IntFindExistingCurIconObject(WinSta, hModule, hRsrc, cx, cy); - if (CurIcon) - { - Ret = CurIcon->Self; - -// IntReleaseCurIconObject(CurIcon);//faxme: is this correct? does IntFindExistingCurIconObject add a ref? - ObDereferenceObject(WinSta); - RETURN(Ret); - } - SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE); - ObDereferenceObject(WinSta); RETURN((HANDLE)0);
CLEANUP: @@ -871,7 +821,6 @@ { /* FIXME - check if process has WINSTA_READATTRIBUTES */ PSYSTEM_CURSORINFO CurInfo; - PWINSTATION_OBJECT WinSta; RECTL Rect; NTSTATUS Status; DECLARE_RETURN(BOOL); @@ -882,13 +831,7 @@ if (!lpRect) RETURN(FALSE);
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - - CurInfo = IntGetSysCursorInfo(WinSta); + CurInfo = IntGetSysCursorInfo(); if (CurInfo->CursorClipInfo.IsClipped) { Rect.left = CurInfo->CursorClipInfo.Left; @@ -907,12 +850,9 @@ Status = MmCopyToCaller(lpRect, &Rect, sizeof(RECT)); if (!NT_SUCCESS(Status)) { - ObDereferenceObject(WinSta); SetLastNtError(Status); RETURN(FALSE); } - - ObDereferenceObject(WinSta);
RETURN(TRUE);
@@ -933,23 +873,15 @@ { PCURICON_OBJECT CurIcon; HICON OldCursor; - PWINSTATION_OBJECT WinSta; DECLARE_RETURN(HCURSOR);
DPRINT("Enter NtUserSetCursor\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(NULL); - } - if (hCursor) { if (!(CurIcon = UserGetCurIconObject(hCursor))) { - ObDereferenceObject(WinSta); RETURN(NULL); } } @@ -958,13 +890,12 @@ CurIcon = NULL; }
- OldCursor = IntSetCursor(WinSta, CurIcon, FALSE); + OldCursor = UserSetCursor(CurIcon, FALSE);
if (CurIcon) { UserDereferenceObject(CurIcon); } - ObDereferenceObject(WinSta);
RETURN(OldCursor);
@@ -987,7 +918,6 @@ PCURICON_OBJECT CurIcon; ICONINFO IconInfo; PSURFACE psurfBmp; - PWINSTATION_OBJECT WinSta; NTSTATUS Status; BOOL Ret = FALSE; DECLARE_RETURN(BOOL); @@ -995,15 +925,8 @@ DPRINT("Enter NtUserSetCursorContents\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - if (!(CurIcon = UserGetCurIconObject(hCurIcon))) { - ObDereferenceObject(WinSta); RETURN(FALSE); }
@@ -1057,7 +980,6 @@ { UserDereferenceObject(CurIcon); } - ObDereferenceObject(WinSta); RETURN(Ret);
CLEANUP: @@ -1080,7 +1002,6 @@ PICONINFO pIconInfo) { PCURICON_OBJECT CurIcon; - PWINSTATION_OBJECT WinSta; PSURFACE psurfBmp; NTSTATUS Status = STATUS_SUCCESS; BOOL Ret = FALSE; @@ -1089,15 +1010,8 @@ DPRINT("Enter NtUserSetCursorIconData\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - if (!(CurIcon = UserGetCurIconObject(Handle))) { - ObDereferenceObject(WinSta); RETURN(FALSE); }
@@ -1149,7 +1063,6 @@ Ret = TRUE;
UserDereferenceObject(CurIcon); - ObDereferenceObject(WinSta); RETURN(Ret);
CLEANUP: @@ -1169,7 +1082,6 @@ HRSRC hGroupRsrc) { PCURICON_OBJECT CurIcon; - PWINSTATION_OBJECT WinSta; NTSTATUS Status; POINT SafeHotspot; BOOL Ret = FALSE; @@ -1178,15 +1090,8 @@ DPRINT("Enter NtUserSetCursorIconData\n"); UserEnterExclusive();
- WinSta = IntGetWinStaObj(); - if (WinSta == NULL) - { - RETURN(FALSE); - } - if (!(CurIcon = UserGetCurIconObject(hCurIcon))) { - ObDereferenceObject(WinSta); RETURN(FALSE); }
@@ -1231,7 +1136,6 @@
done: UserDereferenceObject(CurIcon); - ObDereferenceObject(WinSta); RETURN(Ret);
@@ -1608,10 +1512,7 @@ APIENTRY UserShowCursor(BOOL bShow) { - PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PWINSTATION_OBJECT WinSta = pti->Desktop->WindowStation; PSYSTEM_CURSORINFO CurInfo; - HDC Screen; PDC dc; SURFOBJ *SurfObj; @@ -1619,6 +1520,8 @@ PDEVOBJ *ppdev; GDIPOINTER *pgp; int showpointer=0; + + CurInfo = IntGetSysCursorInfo();
if (!(Screen = IntGetScreenDC())) { @@ -1656,8 +1559,6 @@ }
pgp = &ppdev->Pointer; - - CurInfo = IntGetSysCursorInfo(WinSta);
if (bShow == FALSE) {
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -1684,18 +1684,23 @@ RETURN(FALSE); }
- /* FIXME: Fail if the desktop belong to an invisible window station */ + if(DesktopObject->WindowStation != InputWindowStation) + { + ObDereferenceObject(DesktopObject); + DPRINT1("Switching desktop 0x%x denied because desktop doesn't belong to the interactive winsta!\n", hDesktop); + RETURN(FALSE); + } + /* FIXME: Fail if the process is associated with a secured desktop such as Winlogon or Screen-Saver */ /* FIXME: Connect to input device */
/* Set the active desktop in the desktop's window station. */ - DesktopObject->WindowStation->ActiveDesktop = DesktopObject; + InputWindowStation->ActiveDesktop = DesktopObject;
/* Set the global state. */ InputDesktop = DesktopObject; InputDesktopHandle = hDesktop; - InputWindowStation = DesktopObject->WindowStation;
ObDereferenceObject(DesktopObject);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -1095,7 +1095,7 @@
ASSERT(WinSta);
- CurInfo = IntGetSysCursorInfo(WinSta); + CurInfo = IntGetSysCursorInfo();
if(!mi->time) { @@ -1107,9 +1107,7 @@ SwapButtons = gspv.bMouseBtnSwap; DoMove = FALSE;
- IntGetCursorLocation(WinSta, &MousePos); - OrgPos.x = MousePos.x; - OrgPos.y = MousePos.y; + OrgPos = MousePos = gpsi->ptCursor;
if(mi->dwFlags & MOUSEEVENTF_MOVE) { @@ -1410,8 +1408,7 @@
/* All messages have to contain the cursor point. */ pti = PsGetCurrentThreadWin32Thread(); - IntGetCursorLocation(pti->Desktop->WindowStation, - &Msg.pt); + Msg.pt = gpsi->ptCursor;
DPRINT1("Kbd Hook msg %d wParam %d lParam 0x%08x dropped by WH_KEYBOARD_LL hook\n", Msg.message, vk_hook, Msg.lParam); @@ -1464,8 +1461,8 @@
FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE;
- IntGetCursorLocation(FocusMessageQueue->Desktop->WindowStation, - &Msg.pt); + Msg.pt = gpsi->ptCursor; + MsqPostMessage(FocusMessageQueue, &Msg, FALSE, QS_KEY); } else
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -441,8 +441,7 @@ return FALSE;
/* All messages have to contain the cursor point. */ - IntGetCursorLocation(pti->Desktop->WindowStation, - &NewMsg.pt); + NewMsg.pt = gpsi->ptCursor;
switch (lpMsg->wParam) {
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -454,14 +454,9 @@ { WPARAM wParam; PSYSTEM_CURSORINFO CurInfo; - - if(!IntGetWindowStationObject(InputWindowStation)) - { - break; - } - CurInfo = IntGetSysCursorInfo(InputWindowStation); + CurInfo = IntGetSysCursorInfo(); + wParam = (WPARAM)(CurInfo->ButtonsDown); - ObDereferenceObject(InputWindowStation);
co_IntSendMessage(Msg->hwnd, WM_MOUSEMOVE, wParam, Msg->lParam); co_IntSendMessage(Msg->hwnd, WM_SETCURSOR, (WPARAM)Msg->hwnd, MAKELPARAM(HTCLIENT, Msg->message)); @@ -1094,7 +1089,8 @@ Message.message = Msg; Message.wParam = wParam; Message.lParam = lParam; - IntGetCursorLocation(pThread->Desktop->WindowStation, &Message.pt); + Message.pt = gpsi->ptCursor; + KeQueryTickCount(&LargeTickCount); pThread->timeLast = Message.time = MsqCalculateMessageTime(&LargeTickCount); MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); @@ -1180,7 +1176,7 @@ Message.message = Msg; Message.wParam = wParam; Message.lParam = lParam; - IntGetCursorLocation(pti->Desktop->WindowStation, &Message.pt); + Message.pt = gpsi->ptCursor; KeQueryTickCount(&LargeTickCount); pti->timeLast = Message.time = MsqCalculateMessageTime(&LargeTickCount); MsqPostMessage(Window->MessageQueue, &Message, FALSE, QS_POSTMESSAGE);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/metric.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/metric.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/metric.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -23,27 +23,10 @@ FASTCALL InitMetrics(VOID) { - NTSTATUS Status; - PWINSTATION_OBJECT WinStaObject; - ULONG Width = 640, Height = 480; - PSYSTEM_CURSORINFO CurInfo; INT *piSysMet;
- Width = pPrimarySurface->gdiinfo.ulHorzRes; - Height = pPrimarySurface->gdiinfo.ulVertRes; - - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObject); - if (NT_SUCCESS(Status)) - { - CurInfo = IntGetSysCursorInfo(WinStaObject); - } - else - { - CurInfo = NULL; - } + ULONG Width = pPrimarySurface->gdiinfo.ulHorzRes; + ULONG Height = pPrimarySurface->gdiinfo.ulVertRes;
piSysMet = gpsi->aiSysMet;
@@ -175,11 +158,6 @@ gpsi->dwSRVIFlags |= SRVINFO_METRICS; Setup = TRUE;
- if (NT_SUCCESS(Status)) - { - ObDereferenceObject(WinStaObject); - } - return TRUE; }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -236,7 +236,6 @@ MsqIsClkLck(LPMSG Msg, BOOL Remove) { PTHREADINFO pti; - PWINSTATION_OBJECT WinStaObject; PSYSTEM_CURSORINFO CurInfo; BOOL Res = FALSE;
@@ -246,9 +245,7 @@ return FALSE; }
- WinStaObject = pti->Desktop->WindowStation; - - CurInfo = IntGetSysCursorInfo(WinStaObject); + CurInfo = IntGetSysCursorInfo();
switch (Msg->message) { @@ -279,7 +276,6 @@ MsqIsDblClk(LPMSG Msg, BOOL Remove) { PTHREADINFO pti; - PWINSTATION_OBJECT WinStaObject; PSYSTEM_CURSORINFO CurInfo; LONG dX, dY; BOOL Res; @@ -290,9 +286,7 @@ return FALSE; }
- WinStaObject = pti->Desktop->WindowStation; - - CurInfo = IntGetSysCursorInfo(WinStaObject); + CurInfo = IntGetSysCursorInfo(); Res = (Msg->hwnd == (HWND)CurInfo->LastClkWnd) && ((Msg->time - CurInfo->LastBtnDown) < gspv.iDblClickTime); if(Res) @@ -841,8 +835,7 @@
FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE;
- IntGetCursorLocation(FocusMessageQueue->Desktop->WindowStation, - &Msg.pt); + Msg.pt = gpsi->ptCursor; MsqPostMessage(FocusMessageQueue, &Msg, FALSE, QS_KEY); } else @@ -859,7 +852,6 @@ { PWINDOW_OBJECT Window; PTHREADINFO Win32Thread; - PWINSTATION_OBJECT WinSta; MSG Mesg; LARGE_INTEGER LargeTickCount; NTSTATUS Status; @@ -878,7 +870,6 @@ return; }
- WinSta = Win32Thread->Desktop->WindowStation; Window = IntGetWindowObject(hWnd); if (!Window) { @@ -892,7 +883,7 @@ Mesg.lParam = lParam; KeQueryTickCount(&LargeTickCount); Mesg.time = MsqCalculateMessageTime(&LargeTickCount); - IntGetCursorLocation(WinSta, &Mesg.pt); + Mesg.pt = gpsi->ptCursor; MsqPostMessage(Window->MessageQueue, &Mesg, FALSE, QS_HOTKEY); UserDereferenceObject(Window); ObDereferenceObject (Thread); @@ -1876,7 +1867,6 @@ LARGE_INTEGER LargeTickCount; PLIST_ENTRY EnumEntry; BOOLEAN GotMessage; - PTHREADINFO pti;
DPRINT("MsqGetTimerMessage queue %p msg %p restart %s\n", MessageQueue, Msg, Restart ? "TRUE" : "FALSE"); @@ -1928,9 +1918,7 @@ Msg->lParam = (LPARAM) Timer->TimerFunc; KeQueryTickCount(&LargeTickCount); Msg->time = MsqCalculateMessageTime(&LargeTickCount); - pti = PsGetCurrentThreadWin32Thread(); - IntGetCursorLocation(pti->Desktop->WindowStation, - &Msg->pt); + Msg->pt = gpsi->ptCursor;
if (Restart) {
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -203,54 +203,34 @@ case ONEPARAM_ROUTINE_CREATECURICONHANDLE: { PCURICON_OBJECT CurIcon; - PWINSTATION_OBJECT WinSta; - - WinSta = IntGetWinStaObj(); - if(WinSta == NULL) - { + + if (!(CurIcon = IntCreateCurIconHandle())) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); RETURN(0); }
- if (!(CurIcon = IntCreateCurIconHandle(WinSta))) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - ObDereferenceObject(WinSta); - RETURN(0); - } - - ObDereferenceObject(WinSta); RETURN((DWORD)CurIcon->Self); }
case ONEPARAM_ROUTINE_GETCURSORPOSITION: { - PWINSTATION_OBJECT WinSta; - NTSTATUS Status; - POINT Pos; - - if(!Param) - RETURN( (DWORD)FALSE); - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinSta); - if (!NT_SUCCESS(Status)) - RETURN( (DWORD)FALSE); - - /* FIXME - check if process has WINSTA_READATTRIBUTES */ - IntGetCursorLocation(WinSta, &Pos); - - Status = MmCopyToCaller((PPOINT)Param, &Pos, sizeof(POINT)); - if(!NT_SUCCESS(Status)) - { - ObDereferenceObject(WinSta); - SetLastNtError(Status); - RETURN( FALSE); - } - - ObDereferenceObject(WinSta); - - RETURN( (DWORD)TRUE); + BOOL ret = TRUE; + + + _SEH2_TRY + { + ProbeForWrite((POINT*)Param,sizeof(POINT),1); + RtlCopyMemory((POINT*)Param,&gpsi->ptCursor,sizeof(POINT)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + ret = FALSE; + } + _SEH2_END; + + RETURN (ret); }
case ONEPARAM_ROUTINE_ISWINDOWINDESTROY:
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] Sat Dec 19 17:23:05 2009 @@ -395,7 +395,6 @@ DWORD Unknown5, DWORD Unknown6) { - PSYSTEM_CURSORINFO CurInfo; UNICODE_STRING WindowStationName; UNICODE_STRING FullWindowStationName; PWINSTATION_OBJECT WindowStationObject; @@ -522,61 +521,16 @@
WindowStationObject->FlatMenu = FALSE;
- if(!(CurInfo = ExAllocatePool(PagedPool, sizeof(SYSTEM_CURSORINFO)))) - { - ExFreePool(FullWindowStationName.Buffer); - /* FIXME - Delete window station object */ - ObDereferenceObject(WindowStationObject); - SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); - return 0; - } - - CurInfo->Enabled = FALSE; - CurInfo->ButtonsDown = 0; - CurInfo->CursorClipInfo.IsClipped = FALSE; - CurInfo->LastBtnDown = 0; - CurInfo->CurrentCursorObject = NULL; - CurInfo->ShowingCursor = 0; - CurInfo->ClickLockActive = FALSE; - CurInfo->ClickLockTime = 0; - -/* - // not used anymore - CurInfo->WheelScroLines = gspv.iWheelScrollLines; -#if (_WIN32_WINNT >= 0x0600) - CurInfo->WheelScroChars = gspv.iWheelScrollChars; -#endif - CurInfo->SwapButtons = gspv.bMouseBtnSwap; - CurInfo->DblClickSpeed = gspv.iDblClickTime; - CurInfo->DblClickWidth = gspv.iDblClickWidth; - CurInfo->DblClickHeight = gspv.iDblClickHeight; - - CurInfo->MouseSpeed = gspv.iMouseSpeed; - CurInfo->CursorAccelerationInfo.FirstThreshold = gspv.caiMouse.FirstThreshold; - CurInfo->CursorAccelerationInfo.SecondThreshold = gspv.caiMouse.SecondThreshold; - CurInfo->CursorAccelerationInfo.Acceleration = gspv.caiMouse.Acceleration; - - CurInfo->MouseHoverTime = gspv.iMouseHoverTime; - CurInfo->MouseHoverWidth = gspv.iMouseHoverWidth; - CurInfo->MouseHoverHeight = gspv.iMouseHoverHeight; -*/ - -// WindowStationObject->ScreenSaverActive = FALSE; -// WindowStationObject->ScreenSaverTimeOut = 10; - WindowStationObject->SystemCursor = CurInfo; - - /* END FIXME loading from register */ - if (!IntSetupClipboard(WindowStationObject)) { DPRINT1("WindowStation: Error Setting up the clipboard!!!\n"); }
- if (!IntSetupCurIconHandles(WindowStationObject)) - { - DPRINT1("Setting up the Cursor/Icon Handle table failed!\n"); - /* FIXME: Complain more loudly? */ - ExFreePool(FullWindowStationName.Buffer); + if (InputWindowStation == NULL) + { + InputWindowStation = WindowStationObject; + + InitCursorImpl(); }
DPRINT("Window station successfully created (%wZ)\n", &FullWindowStationName); @@ -708,12 +662,6 @@ DPRINT("Validation of window station handle (0x%X) failed\n", hWinSta); return FALSE; } - -#if 0 - /* FIXME - free the cursor information when actually deleting the object!! */ - ASSERT(Object->SystemCursor); - ExFreePool(Object->SystemCursor); -#endif
ObDereferenceObject(Object);