- Add object handle information and set station user support.

svn path=/trunk/; revision=66164
This commit is contained in:
James Tabor 2015-02-04 21:59:15 +00:00
parent 2ff70a1a12
commit 9491749bfd
7 changed files with 162 additions and 17 deletions

View file

@ -25,7 +25,7 @@ IntGetWinStaForCbAccess(VOID)
NTSTATUS Status; NTSTATUS Status;
hWinSta = UserGetProcessWindowStation(); hWinSta = UserGetProcessWindowStation();
Status = IntValidateWindowStationHandle(hWinSta, KernelMode, WINSTA_ACCESSCLIPBOARD, &pWinStaObj); Status = IntValidateWindowStationHandle(hWinSta, KernelMode, WINSTA_ACCESSCLIPBOARD, &pWinStaObj, 0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ERR("Cannot open winsta\n"); ERR("Cannot open winsta\n");

View file

@ -1516,7 +1516,8 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
Status = IntValidateWindowStationHandle( PsGetCurrentProcess()->Win32WindowStation, Status = IntValidateWindowStationHandle( PsGetCurrentProcess()->Win32WindowStation,
KernelMode, KernelMode,
0, 0,
&WinStaObj); &WinStaObj,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -1407,7 +1407,8 @@ HMENU FASTCALL UserCreateMenu(PDESKTOP Desktop, BOOL PopupMenu)
Status = IntValidateWindowStationHandle(CurrentProcess->Win32WindowStation, Status = IntValidateWindowStationHandle(CurrentProcess->Win32WindowStation,
KernelMode, KernelMode,
0, 0,
&WinStaObject); &WinStaObject,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -113,7 +113,6 @@ UserInitialize(VOID)
HBITMAP hPattern55AABitmap = NULL; HBITMAP hPattern55AABitmap = NULL;
NTSTATUS Status; NTSTATUS Status;
// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA)
// Create Event for Diconnect Desktop. // Create Event for Diconnect Desktop.
Status = UserCreateWinstaDirectory(); Status = UserCreateWinstaDirectory();

View file

@ -3399,7 +3399,8 @@ HWND FASTCALL UserGetShellWindow(VOID)
NTSTATUS Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, NTSTATUS Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
KernelMode, KernelMode,
0, 0,
&WinStaObject); &WinStaObject,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -3448,7 +3449,8 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView)
Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation,
KernelMode, KernelMode,
0, 0,
&WinStaObject); &WinStaObject,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -105,6 +105,8 @@ IntWinStaObjectDelete(
TRACE("Deleting window station (0x%p)\n", WinSta); TRACE("Deleting window station (0x%p)\n", WinSta);
WinSta->Flags |= WSS_DYING;
UserEmptyClipboardData(WinSta); UserEmptyClipboardData(WinSta);
RtlDestroyAtomTable(WinSta->AtomTable); RtlDestroyAtomTable(WinSta->AtomTable);
@ -214,7 +216,8 @@ IntValidateWindowStationHandle(
HWINSTA WindowStation, HWINSTA WindowStation,
KPROCESSOR_MODE AccessMode, KPROCESSOR_MODE AccessMode,
ACCESS_MASK DesiredAccess, ACCESS_MASK DesiredAccess,
PWINSTATION_OBJECT *Object) PWINSTATION_OBJECT *Object,
POBJECT_HANDLE_INFORMATION pObjectHandleInfo)
{ {
NTSTATUS Status; NTSTATUS Status;
@ -231,7 +234,7 @@ IntValidateWindowStationHandle(
ExWindowStationObjectType, ExWindowStationObjectType,
AccessMode, AccessMode,
(PVOID*)Object, (PVOID*)Object,
NULL); pObjectHandleInfo);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
SetLastNtError(Status); SetLastNtError(Status);
@ -291,6 +294,9 @@ co_IntInitializeDesktopGraphics(VOID)
/* Setup the cursor */ /* Setup the cursor */
co_IntLoadDefaultCursors(); co_IntLoadDefaultCursors();
/* Setup the icons */
//co_IntSetWndIcons();
/* Show the desktop */ /* Show the desktop */
pdesk = IntGetActiveDesktop(); pdesk = IntGetActiveDesktop();
ASSERT(pdesk); ASSERT(pdesk);
@ -318,6 +324,29 @@ IntGetScreenDC(VOID)
return ScreenDeviceContext; return ScreenDeviceContext;
} }
BOOL FASTCALL
CheckWinstaAttributeAccess(ACCESS_MASK DesiredAccess)
{
PPROCESSINFO ppi = PsGetCurrentProcessWin32Process();
if ( gpidLogon != PsGetCurrentProcessId() )
{
if (!(ppi->W32PF_flags & W32PF_IOWINSTA))
{
ERR("Requires Interactive Window Station\n");
EngSetLastError(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
return FALSE;
}
if (!RtlAreAllAccessesGranted(ppi->amwinsta, DesiredAccess))
{
ERR("Access Denied\n");
EngSetLastError(ERROR_ACCESS_DENIED);
return FALSE;
}
}
return TRUE;
}
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
/* /*
@ -458,11 +487,17 @@ NtUserCreateWindowStation(
if (InputWindowStation == NULL) if (InputWindowStation == NULL)
{ {
TRACE("Initializeing input window station\n"); ERR("Initializeing input window station\n");
InputWindowStation = WindowStationObject; InputWindowStation = WindowStationObject;
WindowStationObject->Flags &= ~WSS_NOIO;
InitCursorImpl(); InitCursorImpl();
} }
else
{
WindowStationObject->Flags |= WSS_NOIO;
}
TRACE("NtUserCreateWindowStation created object %p with name %wZ handle %p\n", TRACE("NtUserCreateWindowStation created object %p with name %wZ handle %p\n",
WindowStation, &WindowStationObject->Name, WindowStation); WindowStation, &WindowStationObject->Name, WindowStation);
@ -563,7 +598,8 @@ NtUserCloseWindowStation(
hWinSta, hWinSta,
KernelMode, KernelMode,
0, 0,
&Object); &Object,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -852,6 +888,7 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
PPROCESSINFO ppi; PPROCESSINFO ppi;
NTSTATUS Status; NTSTATUS Status;
HWINSTA hwinstaOld; HWINSTA hwinstaOld;
OBJECT_HANDLE_INFORMATION ObjectHandleInfo;
PWINSTATION_OBJECT NewWinSta = NULL, OldWinSta; PWINSTATION_OBJECT NewWinSta = NULL, OldWinSta;
ppi = PsGetCurrentProcessWin32Process(); ppi = PsGetCurrentProcessWin32Process();
@ -862,7 +899,8 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
Status = IntValidateWindowStationHandle( hWindowStation, Status = IntValidateWindowStationHandle( hWindowStation,
KernelMode, KernelMode,
0, 0,
&NewWinSta); &NewWinSta,
&ObjectHandleInfo);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
TRACE("Validation of window station handle (%p) failed\n", TRACE("Validation of window station handle (%p) failed\n",
@ -895,7 +933,26 @@ UserSetProcessWindowStation(HWINSTA hWindowStation)
ppi->prpwinsta = NewWinSta; ppi->prpwinsta = NewWinSta;
ppi->hwinsta = hWindowStation; ppi->hwinsta = hWindowStation;
ppi->amwinsta = ObjectHandleInfo.GrantedAccess;
ERR("WS : Granted Access %p\n",ppi->amwinsta);
if (RtlAreAllAccessesGranted(ppi->amwinsta, WINSTA_READSCREEN))
{
ppi->W32PF_flags |= W32PF_READSCREENACCESSGRANTED;
}
else
{
ppi->W32PF_flags &= ~W32PF_READSCREENACCESSGRANTED;
}
if (NewWinSta && !(NewWinSta->Flags & WSS_NOIO) )
{
ppi->W32PF_flags |= W32PF_IOWINSTA;
}
else // Might be closed if the handle is null.
{
ppi->W32PF_flags &= ~W32PF_IOWINSTA;
}
return TRUE; return TRUE;
} }
@ -958,7 +1015,8 @@ NtUserLockWindowStation(HWINSTA hWindowStation)
hWindowStation, hWindowStation,
KernelMode, KernelMode,
0, 0,
&Object); &Object,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
TRACE("Validation of window station handle (%p) failed\n", TRACE("Validation of window station handle (%p) failed\n",
@ -1003,7 +1061,8 @@ NtUserUnlockWindowStation(HWINSTA hWindowStation)
hWindowStation, hWindowStation,
KernelMode, KernelMode,
0, 0,
&Object); &Object,
0);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
TRACE("Validation of window station handle (%p) failed\n", TRACE("Validation of window station handle (%p) failed\n",
@ -1212,7 +1271,8 @@ BuildDesktopNameList(
Status = IntValidateWindowStationHandle(hWindowStation, Status = IntValidateWindowStationHandle(hWindowStation,
KernelMode, KernelMode,
0, 0,
&WindowStation); &WindowStation,
0);
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
return Status; return Status;
@ -1376,4 +1436,75 @@ NtUserLockWorkStation(VOID)
return ret; return ret;
} }
BOOL APIENTRY
NEW_NtUserSetWindowStationUser(
HWINSTA hWindowStation,
PLUID pluid,
PSID psid,
DWORD size)
{
NTSTATUS Status;
PWINSTATION_OBJECT WindowStation = NULL;
BOOL Ret = FALSE;
UserEnterExclusive();
if (gpidLogon != PsGetCurrentProcessId())
{
EngSetLastError(ERROR_ACCESS_DENIED);
goto Leave;
}
Status = IntValidateWindowStationHandle(hWindowStation,
KernelMode,
0,
&WindowStation,
0);
if (!NT_SUCCESS(Status))
{
goto Leave;
}
if (WindowStation->psidUser)
{
ExFreePoolWithTag(WindowStation->psidUser, USERTAG_SECURITY);
}
WindowStation->psidUser = ExAllocatePoolWithTag(PagedPool, size, USERTAG_SECURITY);
if (WindowStation->psidUser == NULL)
{
EngSetLastError(ERROR_OUTOFMEMORY);
goto Leave;
}
_SEH2_TRY
{
ProbeForRead( psid, size, 1);
ProbeForRead( pluid, sizeof(LUID), 1);
RtlCopyMemory(WindowStation->psidUser, psid, size);
WindowStation->luidUser = *pluid;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
ExFreePoolWithTag(WindowStation->psidUser, 0);
WindowStation->psidUser = 0;
goto Leave;
}
Ret = TRUE;
Leave:
if (WindowStation) ObDereferenceObject(WindowStation);
UserLeave();
return Ret;
}
/* EOF */ /* EOF */

View file

@ -6,6 +6,10 @@
/* Window Station Status Flags */ /* Window Station Status Flags */
#define WSS_LOCKED (1) #define WSS_LOCKED (1)
#define WSS_NOINTERACTIVE (2) #define WSS_NOINTERACTIVE (2)
#define WSS_NOIO (4)
#define WSS_SHUTDOWN (8)
#define WSS_DYING (16)
#define WSS_REALSHUTDOWN (32)
typedef struct _WINSTATION_OBJECT typedef struct _WINSTATION_OBJECT
{ {
@ -32,6 +36,11 @@ typedef struct _WINSTATION_OBJECT
INT fClipboardChanged : 1; INT fClipboardChanged : 1;
INT fInDelayedRendering : 1; INT fInDelayedRendering : 1;
PWND spwndClipboardListener;
LUID luidEndSession;
LUID luidUser;
PVOID psidUser;
} WINSTATION_OBJECT, *PWINSTATION_OBJECT; } WINSTATION_OBJECT, *PWINSTATION_OBJECT;
extern WINSTATION_OBJECT *InputWindowStation; extern WINSTATION_OBJECT *InputWindowStation;
@ -95,10 +104,12 @@ IntValidateWindowStationHandle(
HWINSTA WindowStation, HWINSTA WindowStation,
KPROCESSOR_MODE AccessMode, KPROCESSOR_MODE AccessMode,
ACCESS_MASK DesiredAccess, ACCESS_MASK DesiredAccess,
PWINSTATION_OBJECT *Object); PWINSTATION_OBJECT *Object,
POBJECT_HANDLE_INFORMATION pObjectHandleInfo);
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation); BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation);
BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID); BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID);
VOID FASTCALL IntEndDesktopGraphics(VOID); VOID FASTCALL IntEndDesktopGraphics(VOID);
BOOL FASTCALL CheckWinstaAttributeAccess(ACCESS_MASK);
/* EOF */ /* EOF */