ReactOS 0.4.17-dev-470-gf9e3448
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 381 of file winsta.c.

382{
385 {
386 if (!(ppi->W32PF_flags & W32PF_IOWINSTA))
387 {
388 ERR("Requires Interactive Window Station\n");
390 return FALSE;
391 }
393 {
394 ERR("Access Denied\n");
396 return FALSE;
397 }
398 }
399 return TRUE;
400}
#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 255 of file winsta.c.

256{
257 TEXTMETRICW tmw;
258 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
259 PDESKTOP pdesk;
260 LONG lRet;
261
263 if (lRet != DISP_CHANGE_SUCCESSFUL && !gbBaseVideo)
264 {
265 ERR("Failed to initialize graphics, switching to base video\n");
271 }
272 if (lRet != DISP_CHANGE_SUCCESSFUL)
273 {
274 ERR("PDEVOBJ_lChangeDisplaySettings() failed.\n");
275 return FALSE;
276 }
277
280 {
282 return FALSE;
283 }
285
287 {
288 return FALSE;
289 }
290
292
295
296 /* Update the system metrics */
297 InitMetrics();
298
299 /* Set new size of the monitor */
301
302 /* Update the SERVERINFO */
307 gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel;
310 {
311 gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY;
312 }
313 else
314 {
315 gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY;
316 }
317 // Font is realized and this dc was previously set to internal DC_ATTR.
318 gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar);
319 gpsi->tmSysFont = tmw;
320
321 /* Put the pointer in the center of the screen */
322 gpsi->ptCursor.x = gpsi->aiSysMet[SM_CXSCREEN] / 2;
323 gpsi->ptCursor.y = gpsi->aiSysMet[SM_CYSCREEN] / 2;
324
325 /* Attach monitor */
327
328 /* Setup the cursor */
330
331 /* Setup the icons */
333
334 /* Setup Menu */
335 MenuInit();
336
337 /* Show the desktop */
338 pdesk = IntGetActiveDesktop();
339 ASSERT(pdesk);
340 co_IntShowDesktop(pdesk, gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN], TRUE);
341
342 /* HACK: display wallpaper on all secondary displays */
343 {
344 PGRAPHICS_DEVICE pGraphicsDevice;
345 UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
346 UNICODE_STRING DisplayName;
347 HDC hdc;
348 ULONG iDevNum;
349
350 for (iDevNum = 1; (pGraphicsDevice = EngpFindGraphicsDevice(NULL, iDevNum)) != NULL; iDevNum++)
351 {
352 RtlInitUnicodeString(&DisplayName, pGraphicsDevice->szWinDeviceName);
353 hdc = IntGdiCreateDC(&DriverName, &DisplayName, NULL, NULL, FALSE);
355 }
356 }
357
358 return TRUE;
359}
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:1285
HDC ScreenDeviceContext
Definition: desktop.c:53
NTSTATUS FASTCALL co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL bRedraw)
Definition: desktop.c:1632
BOOL FASTCALL IntPaintDesktop(HDC hDC)
Definition: desktop.c:1852
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:358
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:365
OBJECT_TYPE_INITIALIZER TypeInfo
Definition: obtypes.h:390
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 450 of file winsta.c.

461{
463 HWINSTA hWinSta;
464 PWINSTATION_OBJECT WindowStation;
465
466 TRACE("IntCreateWindowStation called\n");
467
468 ASSERT(phWinSta);
469 *phWinSta = NULL;
470
474 NULL,
475 dwDesiredAccess,
476 NULL,
477 (PVOID*)&hWinSta);
478 if (NT_SUCCESS(Status))
479 {
480 TRACE("IntCreateWindowStation opened window station '%wZ'\n",
481 ObjectAttributes->ObjectName);
482 *phWinSta = hWinSta;
483 return Status;
484 }
485
486 /*
487 * No existing window station found, try to create a new one.
488 */
489
490 /* Create the window station object */
494 OwnerMode,
495 NULL,
496 sizeof(WINSTATION_OBJECT),
497 0,
498 0,
499 (PVOID*)&WindowStation);
500 if (!NT_SUCCESS(Status))
501 {
502 ERR("ObCreateObject failed for window station '%wZ', Status 0x%08lx\n",
503 ObjectAttributes->ObjectName, Status);
505 return Status;
506 }
507 RtlZeroMemory(WindowStation, sizeof(WINSTATION_OBJECT));
508
509 /* Assign the session ID to the window station */
510 WindowStation->dwSessionId = PsGetCurrentProcessSessionId(); // gSessionId
511
512 /* Initialize the window station */
513 InitializeListHead(&WindowStation->DesktopListHead);
514 Status = RtlCreateAtomTable(37, &WindowStation->AtomTable);
515 if (!NT_SUCCESS(Status))
516 {
517 ERR("RtlCreateAtomTable failed for window station '%wZ', Status 0x%08lx\n",
518 ObjectAttributes->ObjectName, Status);
519 ObDereferenceObject(WindowStation);
521 return Status;
522 }
523
524 Status = ObInsertObject(WindowStation,
525 NULL,
526 dwDesiredAccess,
527 0,
528 NULL,
529 (PVOID*)&hWinSta);
530 if (!NT_SUCCESS(Status))
531 {
532 ERR("ObInsertObject failed for window station, Status 0x%08lx\n", Status);
534 return Status;
535 }
536
537 // FIXME! TODO: Add this new window station to a linked list
538
540 {
541 ERR("Initializing input window station\n");
542
543 /* Only Winlogon can create the interactive window station */
545
546 InputWindowStation = WindowStation;
547 WindowStation->Flags &= ~WSS_NOIO;
548
550
553
554 /* Desktop functions require the desktop thread running so wait for it to initialize */
555 UserLeaveCo();
558 UserMode,
559 FALSE,
560 NULL);
561 UserEnterCo();
562 }
563 else
564 {
565 WindowStation->Flags |= WSS_NOIO;
566 }
567
568 TRACE("IntCreateWindowStation created window station '%wZ' object 0x%p handle 0x%p\n",
569 ObjectAttributes->ObjectName, WindowStation, hWinSta);
570
571 *phWinSta = hWinSta;
573
574 return STATUS_SUCCESS;
575}
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 ERROR_SUCCESS
Definition: deptool.c:10
#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
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:2938
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:2535
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:1039
#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:56
#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 362 of file winsta.c.

363{
365 { // No need to allocate a new dcattr.
369 }
372}
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1165
NTSTATUS FASTCALL IntHideDesktop(PDESKTOP Desktop)
Definition: desktop.c:1650

Referenced by RemoveGuiApp().

◆ IntGetProcessWindowStation()

PWINSTATION_OBJECT FASTCALL IntGetProcessWindowStation ( HWINSTA *phWinSta  OPTIONAL)

Definition at line 403 of file winsta.c.

404{
405 PWINSTATION_OBJECT pWinSta;
407 HWINSTA hWinSta = ppi->hwinsta;
408 if (phWinSta)
409 *phWinSta = hWinSta;
410 IntValidateWindowStationHandle(hWinSta, UserMode, 0, &pWinSta, 0);
411 return pWinSta;
412}
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:225
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 225 of file winsta.c.

231{
233
234 if (WindowStation == NULL)
235 {
236 ERR("Invalid window station handle\n");
239 }
240
241 Status = ObReferenceObjectByHandle(WindowStation,
245 (PVOID*)Object,
246 pObjectHandleInfo);
247
248 if (!NT_SUCCESS(Status))
250
251 return Status;
252}
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
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 if (WinSta == InputWindowStation)
108 {
109 ERR("WARNING: Deleting the interactive window station '%wZ'!\n",
111
112 /* Only Winlogon can close and delete the interactive window station */
114
116 }
117
118 WinSta->Flags |= WSS_DYING;
119
121
123
125
126 return STATUS_SUCCESS;
127}
LPWSTR Name
Definition: desk.c:124
#define OBJECT_HEADER_TO_NAME_INFO(h)
Definition: obtypes.h:114
#define OBJECT_TO_OBJECT_HEADER(o)
Definition: obtypes.h:111
NTSYSAPI NTSTATUS NTAPI RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable)
Definition: atom.c:204
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
PVOID FASTCALL UserAssignmentUnlock(PVOID *ppvObj)
Definition: object.c:857
struct _WINSTATION_OBJECT * PWINSTATION_OBJECT
#define WSS_DYING
Definition: winsta.h:11

Referenced by DriverEntry().

◆ IntWinStaObjectParse()

NTSTATUS NTAPI IntWinStaObjectParse ( _In_ PVOID  Parameters)

Definition at line 131 of file winsta.c.

133{
136
137 /* Assume we don't find anything */
138 *ParseParameters->Object = NULL;
139
140 /* Check for an empty name */
141 if (!RemainingName->Length)
142 {
143 /* Make sure this is a window station, can't parse a desktop now */
144 if (ParseParameters->ObjectType != ExWindowStationObjectType)
145 {
146 /* Fail */
148 }
149
150 /* Reference the window station and return */
151 ObReferenceObject(ParseParameters->ParseObject);
152 *ParseParameters->Object = ParseParameters->ParseObject;
153 return STATUS_SUCCESS;
154 }
155
156 /* Check for leading slash */
157 if (RemainingName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR)
158 {
159 /* Skip it */
160 RemainingName->Buffer++;
161 RemainingName->Length -= sizeof(WCHAR);
162 RemainingName->MaximumLength -= sizeof(WCHAR);
163 }
164
165 /* Check if there is still a slash */
167 {
168 /* In this case, fail */
170 }
171
172 /*
173 * Check if we are parsing a desktop.
174 */
175 if (ParseParameters->ObjectType == ExDesktopObjectType)
176 {
177 /* Then call the desktop parse routine */
178 return IntDesktopObjectParse(ParseParameters->ParseObject,
179 ParseParameters->ObjectType,
180 ParseParameters->AccessState,
181 ParseParameters->AccessMode,
182 ParseParameters->Attributes,
183 ParseParameters->CompleteName,
185 ParseParameters->Context,
186 ParseParameters->SecurityQos,
187 ParseParameters->Object);
188 }
189
190 /* Should hopefully never get here */
192}
#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:1761
_Out_ PUNICODE_STRING CompleteName
Definition: pstypes.h:1760
PSECURITY_QUALITY_OF_SERVICE SecurityQos
Definition: pstypes.h:1763
KPROCESSOR_MODE AccessMode
Definition: pstypes.h:1758
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:62
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by DriverEntry().

◆ IntWinStaOkToClose()

NTSTATUS NTAPI IntWinStaOkToClose ( _In_ PVOID  Parameters)

Definition at line 196 of file winsta.c.

198{
200 PPROCESSINFO ppi;
201
203
204 if (ppi && (OkToCloseParameters->Handle == ppi->hwinsta))
205 {
207 }
208
209 return STATUS_SUCCESS;
210}
#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 1386 of file winsta.c.

1387{
1389 PPROCESSINFO ppi;
1390 OBJECT_HANDLE_INFORMATION ObjectHandleInfo;
1391 PWINSTATION_OBJECT NewWinSta = NULL, OldWinSta;
1392 HWINSTA hCacheWinSta;
1393
1395
1396 /* Reference the new window station */
1397 if (hWindowStation != NULL)
1398 {
1399 Status = IntValidateWindowStationHandle(hWindowStation,
1400 UserMode,
1401 0,
1402 &NewWinSta,
1403 &ObjectHandleInfo);
1404 if (!NT_SUCCESS(Status))
1405 {
1406 TRACE("Validation of window station handle 0x%p failed\n", hWindowStation);
1408 return FALSE;
1409 }
1410 }
1411
1412 OldWinSta = ppi->prpwinsta;
1413 hCacheWinSta = PsGetProcessWin32WindowStation(ppi->peProcess);
1414
1415 /* Dereference the previous window station */
1416 if (OldWinSta != NULL)
1417 {
1418 ObDereferenceObject(OldWinSta);
1419 }
1420
1421 /*
1422 * FIXME: Don't allow changing the window station if there are threads that are attached to desktops and own GUI objects?
1423 */
1424
1425 /* Close the cached EPROCESS window station handle if needed */
1426 if (hCacheWinSta != NULL)
1427 {
1428 /* Reference the window station */
1429 Status = ObReferenceObjectByHandle(hCacheWinSta,
1430 0,
1432 UserMode,
1433 (PVOID*)&OldWinSta,
1434 NULL);
1435 if (!NT_SUCCESS(Status))
1436 {
1437 ERR("Failed to reference the inherited window station, Status 0x%08lx\n", Status);
1438 /* We failed, reset the cache */
1439 hCacheWinSta = NULL;
1440 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1441 }
1442 else
1443 {
1444 /*
1445 * Close the old handle and reset the cache only
1446 * if we are setting a different window station.
1447 */
1448 if (NewWinSta != OldWinSta)
1449 {
1450 ObCloseHandle(hCacheWinSta, UserMode);
1451 hCacheWinSta = NULL;
1452 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1453 }
1454
1455 /* Dereference the window station */
1456 ObDereferenceObject(OldWinSta);
1457 }
1458 }
1459
1460 /* Duplicate and save a new cached EPROCESS window station handle */
1461 if ((hCacheWinSta == NULL) && (hWindowStation != NULL))
1462 {
1463 Status = ZwDuplicateObject(ZwCurrentProcess(),
1464 hWindowStation,
1466 (PHANDLE)&hCacheWinSta,
1467 0,
1468 0,
1470 if (!NT_SUCCESS(Status))
1471 {
1472 ERR("UserSetProcessWindowStation: Failed to duplicate the window station handle, Status 0x%08lx\n", Status);
1473 }
1474 else
1475 {
1476 PsSetProcessWindowStation(ppi->peProcess, hCacheWinSta);
1477 }
1478 }
1479
1480 ppi->prpwinsta = NewWinSta;
1481 ppi->hwinsta = hWindowStation;
1482 ppi->amwinsta = hWindowStation != NULL ? ObjectHandleInfo.GrantedAccess : 0;
1483 TRACE("WS : Granted Access 0x%08lx\n",ppi->amwinsta);
1484
1486 {
1487 ppi->W32PF_flags |= W32PF_READSCREENACCESSGRANTED;
1488 }
1489 else
1490 {
1491 ppi->W32PF_flags &= ~W32PF_READSCREENACCESSGRANTED;
1492 }
1493
1494 if (NewWinSta && !(NewWinSta->Flags & WSS_NOIO))
1495 {
1496 ppi->W32PF_flags |= W32PF_IOWINSTA;
1497 }
1498 else /* Might be closed if the handle is NULL */
1499 {
1500 ppi->W32PF_flags &= ~W32PF_IOWINSTA;
1501 }
1502 return TRUE;
1503}
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
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3388
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