ReactOS 0.4.17-dev-683-g0dafdc5
winsta.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _WINSTATION_OBJECT
 

Macros

#define WINSTA_OBJ_DIR   L"\\Windows\\WindowStations"
 
#define SESSION_DIR   L"\\Sessions"
 
#define WSS_LOCKED   (1)
 
#define WSS_NOINTERACTIVE   (2)
 
#define WSS_NOIO   (4)
 
#define WSS_SHUTDOWN   (8)
 
#define WSS_DYING   (16)
 
#define WSS_REALSHUTDOWN   (32)
 

Typedefs

typedef struct _WINSTATION_OBJECT WINSTATION_OBJECT
 
typedef struct _WINSTATION_OBJECTPWINSTATION_OBJECT
 

Functions

 C_ASSERT (offsetof(WINSTATION_OBJECT, Flags)==0x10)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, spklList)==0x14)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, ptiClipLock)==0x18)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, ptiDrawingClipboard)==0x1c)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, spwndClipOpen)==0x20)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, spwndClipViewer)==0x24)
 
 C_ASSERT (offsetof(WINSTATION_OBJECT, spwndClipOwner)==0x28)
 
NTSTATUS NTAPI InitWindowStationImpl (VOID)
 
NTSTATUS NTAPI UserCreateWinstaDirectory (VOID)
 
NTSTATUS NTAPI IntWinStaObjectDelete (_In_ PVOID Parameters)
 
NTSTATUS NTAPI IntWinStaObjectParse (_In_ PVOID Parameters)
 
NTSTATUS NTAPI IntWinStaOkToClose (_In_ PVOID Parameters)
 
NTSTATUS FASTCALL IntValidateWindowStationHandle (HWINSTA WindowStation, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PWINSTATION_OBJECT *Object, POBJECT_HANDLE_INFORMATION pObjectHandleInfo)
 
NTSTATUS FASTCALL IntCreateWindowStation (OUT HWINSTA *phWinSta, IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN KPROCESSOR_MODE OwnerMode, IN ACCESS_MASK dwDesiredAccess, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4, DWORD Unknown5, DWORD Unknown6)
 
PWINSTATION_OBJECT FASTCALL IntGetProcessWindowStation (HWINSTA *phWinSta OPTIONAL)
 
BOOL FASTCALL UserSetProcessWindowStation (HWINSTA hWindowStation)
 
BOOL FASTCALL co_IntInitializeDesktopGraphics (VOID)
 
VOID FASTCALL IntEndDesktopGraphics (VOID)
 
BOOL FASTCALL CheckWinstaAttributeAccess (ACCESS_MASK)
 

Variables

WINSTATION_OBJECTInputWindowStation
 
HANDLE gpidLogon
 
HWND hwndSAS
 
UNICODE_STRING gustrWindowStationsDir
 

Macro Definition Documentation

◆ SESSION_DIR

#define SESSION_DIR   L"\\Sessions"

Definition at line 4 of file winsta.h.

◆ WINSTA_OBJ_DIR

#define WINSTA_OBJ_DIR   L"\\Windows\\WindowStations"

Definition at line 3 of file winsta.h.

◆ WSS_DYING

#define WSS_DYING   (16)

Definition at line 11 of file winsta.h.

◆ WSS_LOCKED

#define WSS_LOCKED   (1)

Definition at line 7 of file winsta.h.

◆ WSS_NOINTERACTIVE

#define WSS_NOINTERACTIVE   (2)

Definition at line 8 of file winsta.h.

◆ WSS_NOIO

#define WSS_NOIO   (4)

Definition at line 9 of file winsta.h.

◆ WSS_REALSHUTDOWN

#define WSS_REALSHUTDOWN   (32)

Definition at line 12 of file winsta.h.

◆ WSS_SHUTDOWN

#define WSS_SHUTDOWN   (8)

Definition at line 10 of file winsta.h.

Typedef Documentation

◆ PWINSTATION_OBJECT

◆ WINSTATION_OBJECT

Function Documentation

◆ C_ASSERT() [1/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, Flags = =0x10)

◆ C_ASSERT() [2/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, ptiClipLock)  = =0x18)

◆ C_ASSERT() [3/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, ptiDrawingClipboard)  = =0x1c)

◆ C_ASSERT() [4/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, spklList)  = =0x14)

◆ C_ASSERT() [5/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, spwndClipOpen)  = =0x20)

◆ C_ASSERT() [6/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, spwndClipOwner)  = =0x28)

◆ C_ASSERT() [7/7]

C_ASSERT ( offsetof(WINSTATION_OBJECT, spwndClipViewer)  = =0x24)

◆ CheckWinstaAttributeAccess()

BOOL FASTCALL CheckWinstaAttributeAccess ( ACCESS_MASK  DesiredAccess)

Definition at line 400 of file winsta.c.

401{
404 {
405 if (!(ppi->W32PF_flags & W32PF_IOWINSTA))
406 {
407 ERR("Requires Interactive Window Station\n");
409 return FALSE;
410 }
412 {
413 ERR("Access Denied\n");
415 return FALSE;
416 }
417 }
418 return TRUE;
419}
#define ERR(fmt,...)
Definition: precomp.h:57
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
NTSYSAPI BOOLEAN NTAPI RtlAreAllAccessesGranted(ACCESS_MASK GrantedAccess, ACCESS_MASK DesiredAccess)
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
HANDLE gpidLogon
Definition: simplecall.c:15
ACCESS_MASK amwinsta
Definition: win32.h:269
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
#define W32PF_IOWINSTA
Definition: win32.h:23
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION
Definition: winerror.h:1285

Referenced by NtUserGetClipCursor(), NtUserSetSystemCursor(), and UserClipCursor().

◆ co_IntInitializeDesktopGraphics()

BOOL FASTCALL co_IntInitializeDesktopGraphics ( VOID  )

Definition at line 274 of file winsta.c.

275{
276 TEXTMETRICW tmw;
277 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
278 PDESKTOP pdesk;
279 LONG lRet;
280
282 if (lRet != DISP_CHANGE_SUCCESSFUL && !gbBaseVideo)
283 {
284 ERR("Failed to initialize graphics, switching to base video\n");
290 }
291 if (lRet != DISP_CHANGE_SUCCESSFUL)
292 {
293 ERR("PDEVOBJ_lChangeDisplaySettings() failed.\n");
294 return FALSE;
295 }
296
299 {
301 return FALSE;
302 }
304
306 {
307 return FALSE;
308 }
309
311
314
315 /* Update the system metrics */
316 InitMetrics();
317
318 /* Set new size of the monitor */
320
321 /* Update the SERVERINFO */
326 gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel;
329 {
330 gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY;
331 }
332 else
333 {
334 gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY;
335 }
336 // Font is realized and this dc was previously set to internal DC_ATTR.
337 gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar);
338 gpsi->tmSysFont = tmw;
339
340 /* Put the pointer in the center of the screen */
341 gpsi->ptCursor.x = gpsi->aiSysMet[SM_CXSCREEN] / 2;
342 gpsi->ptCursor.y = gpsi->aiSysMet[SM_CYSCREEN] / 2;
343
344 /* Attach monitor */
346
347 /* Setup the cursor */
349
350 /* Setup the icons */
352
353 /* Setup Menu */
354 MenuInit();
355
356 /* Show the desktop */
357 pdesk = IntGetActiveDesktop();
358 ASSERT(pdesk);
359 co_IntShowDesktop(pdesk, gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN], TRUE);
360
361 /* HACK: display wallpaper on all secondary displays */
362 {
363 PGRAPHICS_DEVICE pGraphicsDevice;
364 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
365 UNICODE_STRING DisplayName;
366 HDC hdc;
367 ULONG iDevNum;
368
369 for (iDevNum = 1; (pGraphicsDevice = EngpFindGraphicsDevice(NULL, iDevNum)) != NULL; iDevNum++)
370 {
371 RtlInitUnicodeString(&DisplayName, pGraphicsDevice->szWinDeviceName);
372 hdc = IntGdiCreateDC(&DriverName, &DisplayName, NULL, NULL, FALSE);
374 }
375 }
376
377 return TRUE;
378}
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner)
Definition: dclife.c:455
HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING pustrDevice, PVOID pUMdhpdev, CONST PDEVMODEW pdmInit, BOOL CreateAsIC)
Definition: dclife.c:1040
#define NULL
Definition: types.h:112
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
PSERVERINFO gpsi
Definition: imm.c:18
#define PUSIF_PALETTEDISPLAY
Definition: ntuser.h:993
HDC hSystemBM
Definition: stockobj.c:52
PMDEVOBJ gpmdev
Definition: mdevobj.c:14
#define ASSERT(a)
Definition: mode.c:44
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
LONG PDEVOBJ_lChangeDisplaySettings(_In_opt_ PUNICODE_STRING pustrDeviceName, _In_opt_ PDEVMODEW RequestedMode, _In_opt_ PMDEVOBJ pmdevOld, _Out_ PMDEVOBJ *ppmdevNew, _In_ BOOL bSearchClosestMode)
Definition: pdevobj.c:849
long LONG
Definition: pedump.c:60
__kernel_entry W32KAPI HDC APIENTRY NtGdiCreateCompatibleDC(_In_opt_ HDC hdc)
__kernel_entry W32KAPI INT APIENTRY NtGdiGetDeviceCaps(_In_ HDC hdc, _In_ INT i)
__kernel_entry W32KAPI HANDLE APIENTRY NtGdiGetStockObject(_In_ INT iObject)
__kernel_entry W32KAPI HFONT APIENTRY NtGdiSelectFont(_In_ HDC hdc, _In_ HFONT hf)
Definition: dcobjs.c:597
ULONG ulVertRes
Definition: winddi.h:883
ULONG ulHorzRes
Definition: winddi.h:882
WCHAR szWinDeviceName[CCHDEVICENAME/2]
Definition: pdevobj.h:60
PPDEVOBJ ppdevGlobal
Definition: mdevobj.h:16
GDIINFO gdiinfo
Definition: pdevobj.h:123
uint32_t ULONG
Definition: typedefs.h:59
PGRAPHICS_DEVICE NTAPI EngpFindGraphicsDevice(_In_opt_ PUNICODE_STRING pustrDevice, _In_ ULONG iDevNum)
Definition: device.c:795
NTSTATUS EngpUpdateGraphicsDeviceList(VOID)
Definition: device.c:182
BOOL FASTCALL IntCreatePrimarySurface(VOID)
Definition: device.c:17
VOID FASTCALL IntDestroyPrimarySurface(VOID)
Definition: device.c:32
DWORD FASTCALL IntGetCharDimensions(_In_ HDC hdc, _Out_opt_ PTEXTMETRICW ptm, _Out_opt_ PDWORD height)
Definition: font.c:337
BOOL APIENTRY co_IntLoadDefaultCursors(VOID)
Definition: callback.c:471
BOOL FASTCALL co_IntSetWndIcons(VOID)
Definition: callback.c:1101
PDESKTOP FASTCALL IntGetActiveDesktop(VOID)
Definition: desktop.c:1286
HDC ScreenDeviceContext
Definition: desktop.c:52
NTSTATUS FASTCALL co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL bRedraw)
Definition: desktop.c:1633
BOOL FASTCALL IntPaintDesktop(HDC hDC)
Definition: desktop.c:1853
BOOL gbBaseVideo
Definition: display.c:12
BOOL MenuInit(VOID)
Definition: menu.c:359
BOOL NTAPI InitMetrics(VOID)
Definition: metric.c:40
NTSTATUS NTAPI UserAttachMonitor(IN HDEV hDev)
Definition: monitor.c:129
NTSTATUS NTAPI UserUpdateMonitorSize(IN HDEV hDev)
Definition: monitor.c:225
#define RASTERCAPS
Definition: wingdi.h:745
#define LOGPIXELSY
Definition: wingdi.h:719
#define PLANES
Definition: wingdi.h:721
#define SYSTEM_FONT
Definition: wingdi.h:911
#define BITSPIXEL
Definition: wingdi.h:720
#define RC_PALETTE
Definition: wingdi.h:790
#define SM_CYSCREEN
Definition: winuser.h:971
#define DISP_CHANGE_SUCCESSFUL
Definition: winuser.h:190
#define SM_CXSCREEN
Definition: winuser.h:970

Referenced by co_AddGuiApp().

◆ InitWindowStationImpl()

NTSTATUS NTAPI InitWindowStationImpl ( VOID  )

Definition at line 35 of file winsta.c.

36{
37 GENERIC_MAPPING IntWindowStationMapping = { WINSTA_READ,
41
42 /* Set Winsta Object Attributes */
44 ExWindowStationObjectType->TypeInfo.GenericMapping = IntWindowStationMapping;
46
47 return STATUS_SUCCESS;
48}
#define STATUS_SUCCESS
Definition: shellext.h:65
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:379
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:386
OBJECT_TYPE_INITIALIZER TypeInfo
Definition: obtypes.h:411
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:21
#define WINSTA_WRITE
Definition: security.h:48
#define WINSTA_READ
Definition: security.h:42
#define WINSTA_ACCESS_ALL
Definition: security.h:57
#define WINSTA_EXECUTE
Definition: security.h:53
struct _WINSTATION_OBJECT WINSTATION_OBJECT

Referenced by DriverEntry().

◆ IntCreateWindowStation()

NTSTATUS FASTCALL IntCreateWindowStation ( OUT HWINSTA *  phWinSta,
IN POBJECT_ATTRIBUTES  ObjectAttributes,
IN KPROCESSOR_MODE  AccessMode,
IN KPROCESSOR_MODE  OwnerMode,
IN ACCESS_MASK  dwDesiredAccess,
DWORD  Unknown2,
DWORD  Unknown3,
DWORD  Unknown4,
DWORD  Unknown5,
DWORD  Unknown6 
)

Definition at line 665 of file winsta.c.

676{
678 HWINSTA hWinSta;
679 PWINSTATION_OBJECT WindowStation;
680
681 TRACE("IntCreateWindowStation called\n");
682
683 ASSERT(phWinSta);
684 *phWinSta = NULL;
685
689 NULL,
690 dwDesiredAccess,
691 NULL,
692 (PVOID*)&hWinSta);
693 if (NT_SUCCESS(Status))
694 {
695 TRACE("IntCreateWindowStation opened window station '%wZ'\n",
696 ObjectAttributes->ObjectName);
697 *phWinSta = hWinSta;
698 return Status;
699 }
700
701 /*
702 * No existing window station found, try to create a new one.
703 */
704
705 /* Create the window station object */
709 OwnerMode,
710 NULL,
711 sizeof(WINSTATION_OBJECT),
712 0,
713 0,
714 (PVOID*)&WindowStation);
715 if (!NT_SUCCESS(Status))
716 {
717 ERR("ObCreateObject failed for window station '%wZ', Status 0x%08lx\n",
718 ObjectAttributes->ObjectName, Status);
720 return Status;
721 }
722 RtlZeroMemory(WindowStation, sizeof(WINSTATION_OBJECT));
723
724 /* Assign the session ID to the window station */
725 WindowStation->dwSessionId = PsGetCurrentProcessSessionId(); // gSessionId
726
727 /* Initialize the window station */
728 InitializeListHead(&WindowStation->DesktopListHead);
729 Status = RtlCreateAtomTable(37, &WindowStation->AtomTable);
730 if (!NT_SUCCESS(Status))
731 {
732 ERR("RtlCreateAtomTable failed for window station '%wZ', Status 0x%08lx\n",
733 ObjectAttributes->ObjectName, Status);
734 ObDereferenceObject(WindowStation);
736 return Status;
737 }
738
740 {
741 ERR("Initializing input window station\n");
742
743 /* Only Winlogon can create the interactive window station */
745
746 InputWindowStation = WindowStation;
747 WindowStation->Flags &= ~WSS_NOIO;
748 }
749 else
750 {
751 WindowStation->Flags |= WSS_NOIO;
752 }
753
754 /* Create the global WinSta0_DesktopSwitch event
755 * only when creating the interactive WinSta0 */
756 if (InputWindowStation == WindowStation)
757 {
759 if (!NT_SUCCESS(Status))
760 {
761 ObDereferenceObject(WindowStation);
763 return Status;
764 }
765 }
766
767 Status = ObInsertObject(WindowStation,
768 NULL,
769 dwDesiredAccess,
770 0,
771 NULL,
772 (PVOID*)&hWinSta);
773 if (!NT_SUCCESS(Status))
774 {
775 ERR("ObInsertObject failed for window station, Status 0x%08lx\n", Status);
776 /* WindowStation is dereferenced on ObInsertObject() failure */
778 return Status;
779 }
780
781 // FIXME! TODO: Add this new window station to a linked list
782
783 if (InputWindowStation == WindowStation)
784 {
785 ERR("Initializing input window station\n");
786
788
791
792 /* Desktop functions require the desktop thread running so wait for it to initialize */
793 UserLeaveCo();
796 UserMode,
797 FALSE,
798 NULL);
799 UserEnterCo();
800 }
801
802 TRACE("IntCreateWindowStation created window station '%wZ' object 0x%p handle 0x%p\n",
803 ObjectAttributes->ObjectName, WindowStation, hWinSta);
804
805 *phWinSta = hWinSta;
807 return STATUS_SUCCESS;
808}
LONG NTSTATUS
Definition: precomp.h:26
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
BOOL UserCreateSystemThread(DWORD Type)
Definition: csr.c:247
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
Status
Definition: gdiplustypes.h:24
#define UserMode
Definition: asm.h:39
NTSYSAPI NTSTATUS NTAPI RtlCreateAtomTable(_In_ ULONG TableSize, _Inout_ PRTL_ATOM_TABLE *AtomTable)
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
static NTSTATUS IntCreateDesktopSwitchEvent(VOID)
Creates the global per-session \BaseNamedObjects\WinSta0_DesktopSwitch event.
Definition: winsta.c:440
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
Definition: obhandle.c:2957
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
Definition: obhandle.c:2554
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1040
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwSessionId
Definition: winsta.h:17
PRTL_ATOM_TABLE AtomTable
Definition: winsta.h:20
LIST_ENTRY DesktopListHead
Definition: winsta.h:19
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define UserEnterCo
Definition: ntuser.h:3
#define UserLeaveCo
Definition: ntuser.h:4
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:30
#define ST_DESKTOP_THREAD
Definition: csr.h:36
#define ST_RIT
Definition: csr.h:35
BOOL InitCursorImpl(VOID)
Definition: cursoricon.c:64
PKEVENT gpDesktopThreadStartedEvent
Definition: desktop.c:55
#define WSS_NOIO
Definition: winsta.h:9
@ UserRequest
Definition: ketypes.h:473
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by IntResolveDesktop(), and NtUserCreateWindowStation().

◆ IntEndDesktopGraphics()

VOID FASTCALL IntEndDesktopGraphics ( VOID  )

Definition at line 381 of file winsta.c.

382{
384 { // No need to allocate a new dcattr.
388 }
391}
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
NTSTATUS FASTCALL IntHideDesktop(PDESKTOP Desktop)
Definition: desktop.c:1651

Referenced by RemoveGuiApp().

◆ IntGetProcessWindowStation()

PWINSTATION_OBJECT FASTCALL IntGetProcessWindowStation ( HWINSTA *phWinSta  OPTIONAL)

Definition at line 422 of file winsta.c.

423{
424 PWINSTATION_OBJECT pWinSta;
426 HWINSTA hWinSta = ppi->hwinsta;
427 if (phWinSta)
428 *phWinSta = hWinSta;
429 IntValidateWindowStationHandle(hWinSta, UserMode, 0, &pWinSta, 0);
430 return pWinSta;
431}
struct _PROCESSINFO * GetW32ProcessInfo(VOID)
Definition: misc.c:800
NTSTATUS FASTCALL IntValidateWindowStationHandle(HWINSTA WindowStation, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PWINSTATION_OBJECT *Object, POBJECT_HANDLE_INFORMATION pObjectHandleInfo)
Definition: winsta.c:244
HWINSTA hwinsta
Definition: win32.h:268

Referenced by NtUserActivateKeyboardLayout(), NtUserGetImeInfoEx(), NtUserGetKeyboardLayoutList(), NtUserLoadKeyboardLayoutEx(), NtUserSetImeInfoEx(), NtUserUnloadKeyboardLayout(), and UserSetDefaultInputLang().

◆ IntValidateWindowStationHandle()

NTSTATUS FASTCALL IntValidateWindowStationHandle ( HWINSTA  WindowStation,
KPROCESSOR_MODE  AccessMode,
ACCESS_MASK  DesiredAccess,
PWINSTATION_OBJECT Object,
POBJECT_HANDLE_INFORMATION  pObjectHandleInfo 
)

Definition at line 244 of file winsta.c.

250{
252
253 if (WindowStation == NULL)
254 {
255 ERR("Invalid window station handle\n");
258 }
259
260 Status = ObReferenceObjectByHandle(WindowStation,
264 (PVOID*)Object,
265 pObjectHandleInfo);
266
267 if (!NT_SUCCESS(Status))
269
270 return Status;
271}
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:493
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object

Referenced by BuildDesktopNameList(), IntGetProcessWindowStation(), IntGetWinStaForCbAccess(), NtUserCloseWindowStation(), NtUserLockWindowStation(), NtUserSetShellWindowEx(), NtUserSetWindowsHookEx(), NtUserSetWindowStationUser(), NtUserUnlockWindowStation(), UserCreateMenu(), UserGetShellWindow(), and UserSetProcessWindowStation().

◆ IntWinStaObjectDelete()

NTSTATUS NTAPI IntWinStaObjectDelete ( _In_ PVOID  Parameters)

Definition at line 99 of file winsta.c.

101{
103 PWINSTATION_OBJECT WinSta = (PWINSTATION_OBJECT)DeleteParameters->Object;
104
105 TRACE("Deleting window station 0x%p\n", WinSta);
106
107 WinSta->Flags |= WSS_DYING;
108
109 if (WinSta == InputWindowStation)
110 {
111 ERR("WARNING: Deleting the interactive window station '%wZ'!\n",
113
114 /* The window station must NOT be tagged as non-interactive */
115 ASSERT(!(WinSta->Flags & WSS_NOIO));
116
117 /* Only Winlogon can close and delete the interactive window station */
119
121
122 /* Signal and cleanup the global desktop-switch event */
124 {
126
130
131 /* Close the handle in the CSRSS process */
137 }
138 }
139
141
143
145
146 return STATUS_SUCCESS;
147}
PEPROCESS gpepCSRSS
Definition: csr.c:15
LPWSTR Name
Definition: desk.c:124
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define OBJECT_HEADER_TO_NAME_INFO(h)
Definition: obtypes.h:100
#define OBJECT_TO_OBJECT_HEADER(o)
Definition: obtypes.h:97
NTSYSAPI NTSTATUS NTAPI RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable)
Definition: atom.c:204
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1769
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3406
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
Definition: procobj.c:704
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
Definition: procobj.c:756
KPROCESS Pcb
Definition: pstypes.h:1369
struct tagKL * spklList
Definition: winsta.h:23
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
VOID NTAPI UserEmptyClipboardData(PWINSTATION_OBJECT pWinSta)
Definition: clipboard.c:354
PKEVENT gpDesktopSwitchEvent
WinSta0_DesktopSwitch legacy (NT 3.5+) event.
Definition: desktop.c:56
HANDLE ghDesktopSwitchEvent
WinSta0_DesktopSwitch handle in the CSRSS process.
Definition: desktop.c:57
PVOID FASTCALL UserAssignmentUnlock(PVOID *ppvObj)
Definition: object.c:857
struct _WINSTATION_OBJECT * PWINSTATION_OBJECT
#define WSS_DYING
Definition: winsta.h:11
#define EVENT_INCREMENT
Definition: iotypes.h:597
KAPC_STATE
Definition: ketypes.h:1727

Referenced by DriverEntry().

◆ IntWinStaObjectParse()

NTSTATUS NTAPI IntWinStaObjectParse ( _In_ PVOID  Parameters)

Definition at line 151 of file winsta.c.

153{
156
157 /* Assume we don't find anything */
158 *ParseParameters->Object = NULL;
159
160 /* Check for an empty name */
161 if (!RemainingName->Length)
162 {
163 /* Make sure this is a window station, can't parse a desktop now */
164 if (ParseParameters->ObjectType != ExWindowStationObjectType)
165 {
166 /* Fail */
168 }
169
170 /* Reference the window station and return */
171 ObReferenceObject(ParseParameters->ParseObject);
172 *ParseParameters->Object = ParseParameters->ParseObject;
173 return STATUS_SUCCESS;
174 }
175
176 /* Check for leading slash */
177 if (RemainingName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR)
178 {
179 /* Skip it */
180 RemainingName->Buffer++;
181 RemainingName->Length -= sizeof(WCHAR);
182 RemainingName->MaximumLength -= sizeof(WCHAR);
183 }
184
185 /* Check if there is still a slash */
187 {
188 /* In this case, fail */
190 }
191
192 /*
193 * Check if we are parsing a desktop.
194 */
195 if (ParseParameters->ObjectType == ExDesktopObjectType)
196 {
197 /* Then call the desktop parse routine */
198 return IntDesktopObjectParse(ParseParameters->ParseObject,
199 ParseParameters->ObjectType,
200 ParseParameters->AccessState,
201 ParseParameters->AccessMode,
202 ParseParameters->Attributes,
203 ParseParameters->CompleteName,
205 ParseParameters->Context,
206 ParseParameters->SecurityQos,
207 ParseParameters->Object);
208 }
209
210 /* Should hopefully never get here */
212}
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
#define STATUS_OBJECT_TYPE_MISMATCH
Definition: d3dkmdt.h:46
#define wcschr
Definition: compat.h:17
#define STATUS_OBJECT_PATH_INVALID
Definition: ntstatus.h:387
short WCHAR
Definition: pedump.c:58
PUNICODE_STRING RemainingName
Definition: pstypes.h:1784
_Out_ PUNICODE_STRING CompleteName
Definition: pstypes.h:1783
PSECURITY_QUALITY_OF_SERVICE SecurityQos
Definition: pstypes.h:1786
KPROCESSOR_MODE AccessMode
Definition: pstypes.h:1781
POBJECT_TYPE ExDesktopObjectType
Definition: win32k.c:22
NTSTATUS APIENTRY IntDesktopObjectParse(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
Definition: desktop.c:63
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by DriverEntry().

◆ IntWinStaOkToClose()

NTSTATUS NTAPI IntWinStaOkToClose ( _In_ PVOID  Parameters)

Definition at line 216 of file winsta.c.

218{
220 PPROCESSINFO ppi;
221
223
224 if (ppi && (OkToCloseParameters->Handle == ppi->hwinsta))
225 {
227 }
228
229 return STATUS_SUCCESS;
230}
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145

Referenced by DriverEntry().

◆ UserCreateWinstaDirectory()

NTSTATUS NTAPI UserCreateWinstaDirectory ( VOID  )

Definition at line 52 of file winsta.c.

53{
57 WCHAR wstrWindowStationsDir[MAX_PATH];
58
59 /* Create the WindowStations directory and cache its path for later use */
61 if (SessionId == 0)
62 {
65 }
66 else
67 {
68 Status = RtlStringCbPrintfW(wstrWindowStationsDir,
69 sizeof(wstrWindowStationsDir),
70 L"%ws\\%lu%ws",
74 if (!NT_SUCCESS(Status))
75 return Status;
76
77 if (!RtlCreateUnicodeString(&gustrWindowStationsDir, wstrWindowStationsDir))
79 }
80
84 NULL,
85 NULL);
87 if (!NT_SUCCESS(Status))
88 ERR("Could not create %wZ directory (Status 0x%X)\n", &gustrWindowStationsDir, Status);
89 else
90 TRACE("Created directory %wZ for session %lu\n", &gustrWindowStationsDir, SessionId);
91
92 return Status;
93}
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define MAX_PATH
Definition: compat.h:34
ULONG SessionId
Definition: dllmain.c:28
#define SESSION_DIR
Definition: dllmain.c:38
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define DIRECTORY_CREATE_OBJECT
Definition: nt_native.h:1259
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
UNICODE_STRING gustrWindowStationsDir
Definition: winsta.c:27
HANDLE ghWinStaDir
Definition: winsta.c:28
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define WINSTA_OBJ_DIR
Definition: winsta.h:3

Referenced by UserInitialize().

◆ UserSetProcessWindowStation()

BOOL FASTCALL UserSetProcessWindowStation ( HWINSTA  hWindowStation)

Definition at line 1614 of file winsta.c.

1615{
1617 PPROCESSINFO ppi;
1618 OBJECT_HANDLE_INFORMATION ObjectHandleInfo;
1619 PWINSTATION_OBJECT NewWinSta = NULL, OldWinSta;
1620 HWINSTA hCacheWinSta;
1621
1623
1624 /* Reference the new window station */
1625 if (hWindowStation != NULL)
1626 {
1627 Status = IntValidateWindowStationHandle(hWindowStation,
1628 UserMode,
1629 0,
1630 &NewWinSta,
1631 &ObjectHandleInfo);
1632 if (!NT_SUCCESS(Status))
1633 {
1634 TRACE("Validation of window station handle 0x%p failed\n", hWindowStation);
1636 return FALSE;
1637 }
1638 }
1639
1640 OldWinSta = ppi->prpwinsta;
1641 hCacheWinSta = PsGetProcessWin32WindowStation(ppi->peProcess);
1642
1643 /* Dereference the previous window station */
1644 if (OldWinSta != NULL)
1645 {
1646 ObDereferenceObject(OldWinSta);
1647 }
1648
1649 /*
1650 * FIXME: Don't allow changing the window station if there are threads that are attached to desktops and own GUI objects?
1651 */
1652
1653 /* Close the cached EPROCESS window station handle if needed */
1654 if (hCacheWinSta != NULL)
1655 {
1656 /* Reference the window station */
1657 Status = ObReferenceObjectByHandle(hCacheWinSta,
1658 0,
1660 UserMode,
1661 (PVOID*)&OldWinSta,
1662 NULL);
1663 if (!NT_SUCCESS(Status))
1664 {
1665 ERR("Failed to reference the inherited window station, Status 0x%08lx\n", Status);
1666 /* We failed, reset the cache */
1667 hCacheWinSta = NULL;
1668 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1669 }
1670 else
1671 {
1672 /*
1673 * Close the old handle and reset the cache only
1674 * if we are setting a different window station.
1675 */
1676 if (NewWinSta != OldWinSta)
1677 {
1678 ObCloseHandle(hCacheWinSta, UserMode);
1679 hCacheWinSta = NULL;
1680 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1681 }
1682
1683 /* Dereference the window station */
1684 ObDereferenceObject(OldWinSta);
1685 }
1686 }
1687
1688 /* Duplicate and save a new cached EPROCESS window station handle */
1689 if ((hCacheWinSta == NULL) && (hWindowStation != NULL))
1690 {
1691 Status = ZwDuplicateObject(ZwCurrentProcess(),
1692 hWindowStation,
1694 (PHANDLE)&hCacheWinSta,
1695 0,
1696 0,
1698 if (!NT_SUCCESS(Status))
1699 {
1700 ERR("UserSetProcessWindowStation: Failed to duplicate the window station handle, Status 0x%08lx\n", Status);
1701 }
1702 else
1703 {
1704 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1705 }
1706 }
1707
1708 ppi->prpwinsta = NewWinSta;
1709 ppi->hwinsta = hWindowStation;
1710 ppi->amwinsta = hWindowStation != NULL ? ObjectHandleInfo.GrantedAccess : 0;
1711 TRACE("WS : Granted Access 0x%08lx\n",ppi->amwinsta);
1712
1714 {
1715 ppi->W32PF_flags |= W32PF_READSCREENACCESSGRANTED;
1716 }
1717 else
1718 {
1719 ppi->W32PF_flags &= ~W32PF_READSCREENACCESSGRANTED;
1720 }
1721
1722 if (NewWinSta && !(NewWinSta->Flags & WSS_NOIO))
1723 {
1724 ppi->W32PF_flags |= W32PF_IOWINSTA;
1725 }
1726 else /* Might be closed if the handle is NULL */
1727 {
1728 ppi->W32PF_flags &= ~W32PF_IOWINSTA;
1729 }
1730 return TRUE;
1731}
VOID NTAPI PsSetProcessWindowStation(PEPROCESS Process, PVOID WindowStation)
Definition: process.c:1314
PVOID NTAPI PsGetProcessWin32WindowStation(PEPROCESS Process)
Definition: process.c:1203
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
ACCESS_MASK GrantedAccess
Definition: iotypes.h:181
struct _WINSTATION_OBJECT * prpwinsta
Definition: win32.h:267
#define W32PF_READSCREENACCESSGRANTED
Definition: win32.h:8
#define WINSTA_READSCREEN
Definition: winuser.h:415
#define DUPLICATE_SAME_ACCESS
#define ZwCurrentProcess()

Referenced by InitThreadCallback(), NtUserSetProcessWindowStation(), RawInputThreadMain(), and UserProcessDestroy().

Variable Documentation

◆ gpidLogon

◆ gustrWindowStationsDir

UNICODE_STRING gustrWindowStationsDir
extern

◆ hwndSAS

◆ InputWindowStation