mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 08:00:24 +00:00
[win32k]
- Don't store SYSTEM_CURSORINFO inside WINSTATION_OBJECT. Use a global variable instead - Remove IntGetCursorLocation. Use directly gpsi->ptCursor svn path=/trunk/; revision=44655
This commit is contained in:
parent
3fc3ac5c8c
commit
5416a90f26
11 changed files with 95 additions and 305 deletions
|
@ -69,21 +69,20 @@ typedef struct _SYSTEM_CURSORINFO
|
|||
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)
|
||||
|
|
|
@ -29,7 +29,6 @@ typedef struct _WINSTATION_OBJECT
|
|||
LIST_ENTRY DesktopListHead;
|
||||
PRTL_ATOM_TABLE AtomTable;
|
||||
HANDLE SystemMenuTemplate;
|
||||
PVOID SystemCursor;
|
||||
UINT CaretBlinkRate;
|
||||
HANDLE ShellWindow;
|
||||
HANDLE ShellListView;
|
||||
|
|
|
@ -44,15 +44,38 @@
|
|||
static PAGED_LOOKASIDE_LIST gProcessLookasideList;
|
||||
static LIST_ENTRY gCurIconList;
|
||||
|
||||
SYSTEM_CURSORINFO gSysCursorInfo;
|
||||
|
||||
BOOL FASTCALL
|
||||
IntGetCursorLocation(PWINSTATION_OBJECT WinSta, POINT *loc)
|
||||
InitCursorImpl()
|
||||
{
|
||||
loc->x = gpsi->ptCursor.x;
|
||||
loc->y = gpsi->ptCursor.y;
|
||||
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! */
|
||||
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
|
||||
{
|
||||
|
@ -78,8 +101,7 @@ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
|
|||
|
||||
HCURSOR
|
||||
FASTCALL
|
||||
IntSetCursor(
|
||||
PWINSTATION_OBJECT WinSta,
|
||||
UserSetCursor(
|
||||
PCURICON_OBJECT NewCursor,
|
||||
BOOL ForceChange)
|
||||
{
|
||||
|
@ -88,8 +110,9 @@ IntSetCursor(
|
|||
HCURSOR hOldCursor = (HCURSOR)0;
|
||||
HDC hdcScreen;
|
||||
BOOL bResult;
|
||||
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
CurInfo = IntGetSysCursorInfo(WinSta);
|
||||
OldCursor = CurInfo->CurrentCursorObject;
|
||||
if (OldCursor)
|
||||
{
|
||||
|
@ -152,22 +175,6 @@ IntSetCursor(
|
|||
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 @@ ReferenceCurIconByProcess(PCURICON_OBJECT CurIcon)
|
|||
}
|
||||
|
||||
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 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinSta, HMODULE hModule,
|
|||
}
|
||||
|
||||
PCURICON_OBJECT FASTCALL
|
||||
IntCreateCurIconHandle(PWINSTATION_OBJECT WinSta)
|
||||
IntCreateCurIconHandle()
|
||||
{
|
||||
PCURICON_OBJECT CurIcon;
|
||||
HANDLE hCurIcon;
|
||||
|
@ -271,7 +278,7 @@ IntCreateCurIconHandle(PWINSTATION_OBJECT WinSta)
|
|||
}
|
||||
|
||||
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 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL
|
|||
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,16 +363,9 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL
|
|||
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)
|
||||
{
|
||||
UserReferenceObject(CurIcon);
|
||||
|
@ -376,7 +376,7 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process)
|
|||
if (Win32Process == ProcessData->Process)
|
||||
{
|
||||
RemoveEntryList(&CurIcon->ListEntry);
|
||||
IntDestroyCurIconObject(WinSta, CurIcon, TRUE);
|
||||
IntDestroyCurIconObject(CurIcon, TRUE);
|
||||
CurIcon = NULL;
|
||||
break;
|
||||
}
|
||||
|
@ -391,7 +391,6 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process)
|
|||
}
|
||||
}
|
||||
|
||||
ObDereferenceObject(WinSta);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -402,7 +401,6 @@ APIENTRY
|
|||
NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect)
|
||||
{
|
||||
PCURICON_OBJECT CurIcon;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
PSURFACE psurfBmp;
|
||||
NTSTATUS Status;
|
||||
HANDLE Ret;
|
||||
|
@ -411,16 +409,9 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect)
|
|||
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 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect)
|
|||
}
|
||||
|
||||
UserDereferenceObject(CurIcon);
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(Ret);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -643,7 +633,6 @@ NtUserGetCursorInfo(
|
|||
{
|
||||
CURSORINFO SafeCi;
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PCURICON_OBJECT CurIcon;
|
||||
BOOL Ret = FALSE;
|
||||
|
@ -652,20 +641,14 @@ NtUserGetCursorInfo(
|
|||
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 @@ NtUserGetCursorInfo(
|
|||
SetLastNtError(Status);
|
||||
}
|
||||
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(Ret);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -709,35 +691,23 @@ NtUserClipCursor(
|
|||
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);
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
if (WinSta->ActiveDesktop)
|
||||
DesktopWindow = UserGetWindowObject(WinSta->ActiveDesktop->DesktopWindow);
|
||||
DesktopWindow = UserGetDesktopWindow();
|
||||
|
||||
if ((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
|
||||
&& DesktopWindow && UnsafeRect != NULL)
|
||||
|
@ -750,8 +720,8 @@ NtUserClipCursor(
|
|||
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 @@ NtUserClipCursor(
|
|||
}
|
||||
|
||||
CurInfo->CursorClipInfo.IsClipped = FALSE;
|
||||
ObDereferenceObject(WinSta);
|
||||
|
||||
RETURN(TRUE);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -782,7 +750,6 @@ NtUserDestroyCursor(
|
|||
HANDLE hCurIcon,
|
||||
DWORD Unknown)
|
||||
{
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
PCURICON_OBJECT CurIcon;
|
||||
BOOL ret;
|
||||
DECLARE_RETURN(BOOL);
|
||||
|
@ -790,22 +757,14 @@ NtUserDestroyCursor(
|
|||
DPRINT("Enter NtUserDestroyCursorIcon\n");
|
||||
UserEnterExclusive();
|
||||
|
||||
WinSta = IntGetWinStaObj();
|
||||
if (WinSta == NULL)
|
||||
{
|
||||
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 @@ NtUserFindExistingCursorIcon(
|
|||
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)
|
||||
{
|
||||
RETURN(Ret);
|
||||
}
|
||||
|
||||
CurIcon = IntFindExistingCurIconObject(WinSta, hModule, hRsrc, cx, cy);
|
||||
CurIcon = IntFindExistingCurIconObject(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 @@ NtUserGetClipCursor(
|
|||
{
|
||||
/* FIXME - check if process has WINSTA_READATTRIBUTES */
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
RECTL Rect;
|
||||
NTSTATUS Status;
|
||||
DECLARE_RETURN(BOOL);
|
||||
|
@ -882,13 +831,7 @@ NtUserGetClipCursor(
|
|||
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,13 +850,10 @@ NtUserGetClipCursor(
|
|||
Status = MmCopyToCaller(lpRect, &Rect, sizeof(RECT));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ObDereferenceObject(WinSta);
|
||||
SetLastNtError(Status);
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
ObDereferenceObject(WinSta);
|
||||
|
||||
RETURN(TRUE);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -933,23 +873,15 @@ NtUserSetCursor(
|
|||
{
|
||||
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 @@ NtUserSetCursor(
|
|||
CurIcon = NULL;
|
||||
}
|
||||
|
||||
OldCursor = IntSetCursor(WinSta, CurIcon, FALSE);
|
||||
OldCursor = UserSetCursor(CurIcon, FALSE);
|
||||
|
||||
if (CurIcon)
|
||||
{
|
||||
UserDereferenceObject(CurIcon);
|
||||
}
|
||||
ObDereferenceObject(WinSta);
|
||||
|
||||
RETURN(OldCursor);
|
||||
|
||||
|
@ -987,7 +918,6 @@ NtUserSetCursorContents(
|
|||
PCURICON_OBJECT CurIcon;
|
||||
ICONINFO IconInfo;
|
||||
PSURFACE psurfBmp;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
NTSTATUS Status;
|
||||
BOOL Ret = FALSE;
|
||||
DECLARE_RETURN(BOOL);
|
||||
|
@ -995,15 +925,8 @@ NtUserSetCursorContents(
|
|||
DPRINT("Enter NtUserSetCursorContents\n");
|
||||
UserEnterExclusive();
|
||||
|
||||
WinSta = IntGetWinStaObj();
|
||||
if (WinSta == NULL)
|
||||
{
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
if (!(CurIcon = UserGetCurIconObject(hCurIcon)))
|
||||
{
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
@ -1057,7 +980,6 @@ done:
|
|||
{
|
||||
UserDereferenceObject(CurIcon);
|
||||
}
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(Ret);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -1080,7 +1002,6 @@ NtUserSetCursorIconData(
|
|||
PICONINFO pIconInfo)
|
||||
{
|
||||
PCURICON_OBJECT CurIcon;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
PSURFACE psurfBmp;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
BOOL Ret = FALSE;
|
||||
|
@ -1089,15 +1010,8 @@ NtUserSetCursorIconData(
|
|||
DPRINT("Enter NtUserSetCursorIconData\n");
|
||||
UserEnterExclusive();
|
||||
|
||||
WinSta = IntGetWinStaObj();
|
||||
if (WinSta == NULL)
|
||||
{
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
if (!(CurIcon = UserGetCurIconObject(Handle)))
|
||||
{
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
@ -1149,7 +1063,6 @@ NtUserSetCursorIconData(
|
|||
Ret = TRUE;
|
||||
|
||||
UserDereferenceObject(CurIcon);
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(Ret);
|
||||
|
||||
CLEANUP:
|
||||
|
@ -1169,7 +1082,6 @@ NtUserSetCursorIconData(
|
|||
HRSRC hGroupRsrc)
|
||||
{
|
||||
PCURICON_OBJECT CurIcon;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
NTSTATUS Status;
|
||||
POINT SafeHotspot;
|
||||
BOOL Ret = FALSE;
|
||||
|
@ -1178,15 +1090,8 @@ NtUserSetCursorIconData(
|
|||
DPRINT("Enter NtUserSetCursorIconData\n");
|
||||
UserEnterExclusive();
|
||||
|
||||
WinSta = IntGetWinStaObj();
|
||||
if (WinSta == NULL)
|
||||
{
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
if (!(CurIcon = UserGetCurIconObject(hCurIcon)))
|
||||
{
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
@ -1231,7 +1136,6 @@ NtUserSetCursorIconData(
|
|||
|
||||
done:
|
||||
UserDereferenceObject(CurIcon);
|
||||
ObDereferenceObject(WinSta);
|
||||
RETURN(Ret);
|
||||
|
||||
|
||||
|
@ -1608,10 +1512,7 @@ int
|
|||
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 @@ UserShowCursor(BOOL bShow)
|
|||
PDEVOBJ *ppdev;
|
||||
GDIPOINTER *pgp;
|
||||
int showpointer=0;
|
||||
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
if (!(Screen = IntGetScreenDC()))
|
||||
{
|
||||
|
@ -1657,8 +1560,6 @@ UserShowCursor(BOOL bShow)
|
|||
|
||||
pgp = &ppdev->Pointer;
|
||||
|
||||
CurInfo = IntGetSysCursorInfo(WinSta);
|
||||
|
||||
if (bShow == FALSE)
|
||||
{
|
||||
pgp->ShowPointer--;
|
||||
|
|
|
@ -1684,18 +1684,23 @@ NtUserSwitchDesktop(HDESK hDesktop)
|
|||
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);
|
||||
|
||||
|
|
|
@ -1095,7 +1095,7 @@ IntMouseInput(MOUSEINPUT *mi)
|
|||
|
||||
ASSERT(WinSta);
|
||||
|
||||
CurInfo = IntGetSysCursorInfo(WinSta);
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
if(!mi->time)
|
||||
{
|
||||
|
@ -1107,9 +1107,7 @@ IntMouseInput(MOUSEINPUT *mi)
|
|||
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 @@ IntKeyboardInput(KEYBDINPUT *ki)
|
|||
|
||||
/* 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 @@ IntKeyboardInput(KEYBDINPUT *ki)
|
|||
|
||||
FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE;
|
||||
|
||||
IntGetCursorLocation(FocusMessageQueue->Desktop->WindowStation,
|
||||
&Msg.pt);
|
||||
Msg.pt = gpsi->ptCursor;
|
||||
|
||||
MsqPostMessage(FocusMessageQueue, &Msg, FALSE, QS_KEY);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -441,8 +441,7 @@ IntTranslateKbdMessage(LPMSG lpMsg,
|
|||
return FALSE;
|
||||
|
||||
/* All messages have to contain the cursor point. */
|
||||
IntGetCursorLocation(pti->Desktop->WindowStation,
|
||||
&NewMsg.pt);
|
||||
NewMsg.pt = gpsi->ptCursor;
|
||||
|
||||
switch (lpMsg->wParam)
|
||||
{
|
||||
|
|
|
@ -454,14 +454,9 @@ co_IntSendHitTestMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg)
|
|||
{
|
||||
WPARAM wParam;
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
if(!IntGetWindowStationObject(InputWindowStation))
|
||||
{
|
||||
break;
|
||||
}
|
||||
CurInfo = IntGetSysCursorInfo(InputWindowStation);
|
||||
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 @@ UserPostThreadMessage( DWORD idThread,
|
|||
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 @@ UserPostMessage( HWND Wnd,
|
|||
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);
|
||||
|
|
|
@ -23,27 +23,10 @@ BOOL
|
|||
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 @@ InitMetrics(VOID)
|
|||
gpsi->dwSRVIFlags |= SRVINFO_METRICS;
|
||||
Setup = TRUE;
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
ObDereferenceObject(WinStaObject);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -236,7 +236,6 @@ BOOL FASTCALL
|
|||
MsqIsClkLck(LPMSG Msg, BOOL Remove)
|
||||
{
|
||||
PTHREADINFO pti;
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
BOOL Res = FALSE;
|
||||
|
||||
|
@ -246,9 +245,7 @@ MsqIsClkLck(LPMSG Msg, BOOL Remove)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
WinStaObject = pti->Desktop->WindowStation;
|
||||
|
||||
CurInfo = IntGetSysCursorInfo(WinStaObject);
|
||||
CurInfo = IntGetSysCursorInfo();
|
||||
|
||||
switch (Msg->message)
|
||||
{
|
||||
|
@ -279,7 +276,6 @@ BOOL FASTCALL
|
|||
MsqIsDblClk(LPMSG Msg, BOOL Remove)
|
||||
{
|
||||
PTHREADINFO pti;
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
LONG dX, dY;
|
||||
BOOL Res;
|
||||
|
@ -290,9 +286,7 @@ MsqIsDblClk(LPMSG Msg, BOOL Remove)
|
|||
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 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
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 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
PWINDOW_OBJECT Window;
|
||||
PTHREADINFO Win32Thread;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
MSG Mesg;
|
||||
LARGE_INTEGER LargeTickCount;
|
||||
NTSTATUS Status;
|
||||
|
@ -878,7 +870,6 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
return;
|
||||
}
|
||||
|
||||
WinSta = Win32Thread->Desktop->WindowStation;
|
||||
Window = IntGetWindowObject(hWnd);
|
||||
if (!Window)
|
||||
{
|
||||
|
@ -892,7 +883,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
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 @@ MsqGetTimerMessage(PUSER_MESSAGE_QUEUE MessageQueue,
|
|||
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 @@ MsqGetTimerMessage(PUSER_MESSAGE_QUEUE MessageQueue,
|
|||
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)
|
||||
{
|
||||
|
|
|
@ -203,54 +203,34 @@ NtUserCallOneParam(
|
|||
case ONEPARAM_ROUTINE_CREATECURICONHANDLE:
|
||||
{
|
||||
PCURICON_OBJECT CurIcon;
|
||||
PWINSTATION_OBJECT WinSta;
|
||||
|
||||
WinSta = IntGetWinStaObj();
|
||||
if(WinSta == NULL)
|
||||
{
|
||||
RETURN(0);
|
||||
}
|
||||
|
||||
if (!(CurIcon = IntCreateCurIconHandle(WinSta)))
|
||||
if (!(CurIcon = IntCreateCurIconHandle()))
|
||||
{
|
||||
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;
|
||||
BOOL ret = TRUE;
|
||||
|
||||
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))
|
||||
_SEH2_TRY
|
||||
{
|
||||
ObDereferenceObject(WinSta);
|
||||
SetLastNtError(Status);
|
||||
RETURN( FALSE);
|
||||
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;
|
||||
|
||||
ObDereferenceObject(WinSta);
|
||||
|
||||
RETURN( (DWORD)TRUE);
|
||||
RETURN (ret);
|
||||
}
|
||||
|
||||
case ONEPARAM_ROUTINE_ISWINDOWINDESTROY:
|
||||
|
|
|
@ -395,7 +395,6 @@ NtUserCreateWindowStation(
|
|||
DWORD Unknown5,
|
||||
DWORD Unknown6)
|
||||
{
|
||||
PSYSTEM_CURSORINFO CurInfo;
|
||||
UNICODE_STRING WindowStationName;
|
||||
UNICODE_STRING FullWindowStationName;
|
||||
PWINSTATION_OBJECT WindowStationObject;
|
||||
|
@ -522,61 +521,16 @@ NtUserCreateWindowStation(
|
|||
|
||||
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))
|
||||
if (InputWindowStation == NULL)
|
||||
{
|
||||
DPRINT1("Setting up the Cursor/Icon Handle table failed!\n");
|
||||
/* FIXME: Complain more loudly? */
|
||||
ExFreePool(FullWindowStationName.Buffer);
|
||||
InputWindowStation = WindowStationObject;
|
||||
|
||||
InitCursorImpl();
|
||||
}
|
||||
|
||||
DPRINT("Window station successfully created (%wZ)\n", &FullWindowStationName);
|
||||
|
@ -709,12 +663,6 @@ NtUserCloseWindowStation(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* FIXME - free the cursor information when actually deleting the object!! */
|
||||
ASSERT(Object->SystemCursor);
|
||||
ExFreePool(Object->SystemCursor);
|
||||
#endif
|
||||
|
||||
ObDereferenceObject(Object);
|
||||
|
||||
DPRINT("Closing window station handle (0x%X)\n", hWinSta);
|
||||
|
|
Loading…
Reference in a new issue