ReactOS 0.4.17-dev-573-g8315b8c
win32k.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for win32k.c:

Go to the source code of this file.

Classes

struct  _WIN32_KERNEL_OBJECT_HEADER
 

Macros

#define NDEBUG
 

Typedefs

typedef struct _WIN32_KERNEL_OBJECT_HEADER WIN32_KERNEL_OBJECT_HEADER
 
typedef struct _WIN32_KERNEL_OBJECT_HEADERPWIN32_KERNEL_OBJECT_HEADER
 

Functions

static NTSTATUS NTAPI ExpWin32SessionCallout (_In_ PVOID Object, _In_ PKWIN32_SESSION_CALLOUT CalloutProcedure, _Inout_opt_ PVOID Parameter)
 
static BOOLEAN NTAPI ExpDesktopOkToClose (IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
 
static BOOLEAN NTAPI ExpWindowStationOkToClose (IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
 
static VOID NTAPI ExpWinStaObjectDelete (PVOID DeletedObject)
 
static NTSTATUS NTAPI ExpWinStaObjectParse (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)
 
static VOID NTAPI ExpDesktopDelete (PVOID DeletedObject)
 
static NTSTATUS NTAPI ExpDesktopOpen (IN OB_OPEN_REASON Reason, IN KPROCESSOR_MODE AccessMode, IN PEPROCESS Process OPTIONAL, IN PVOID ObjectBody, IN PACCESS_MASK GrantedAccess, IN ULONG HandleCount)
 
static VOID NTAPI ExpDesktopClose (IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG_PTR ProcessHandleCount, IN ULONG_PTR SystemHandleCount)
 
BOOLEAN NTAPI ExpWin32kInit (VOID)
 

Variables

POBJECT_TYPE ExWindowStationObjectType = NULL
 
POBJECT_TYPE ExDesktopObjectType = NULL
 
GENERIC_MAPPING ExpWindowStationMapping
 
GENERIC_MAPPING ExpDesktopMapping
 
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectParse = NULL
 
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectDelete = NULL
 
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectOkToClose = NULL
 
PKWIN32_SESSION_CALLOUT ExpDesktopObjectOkToClose = NULL
 
PKWIN32_SESSION_CALLOUT ExpDesktopObjectDelete = NULL
 
PKWIN32_SESSION_CALLOUT ExpDesktopObjectOpen = NULL
 
PKWIN32_SESSION_CALLOUT ExpDesktopObjectClose = NULL
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file win32k.c.

Typedef Documentation

◆ PWIN32_KERNEL_OBJECT_HEADER

◆ WIN32_KERNEL_OBJECT_HEADER

Function Documentation

◆ ExpDesktopClose()

static VOID NTAPI ExpDesktopClose ( IN PEPROCESS Process  OPTIONAL,
IN PVOID  Object,
IN ACCESS_MASK  GrantedAccess,
IN ULONG_PTR  ProcessHandleCount,
IN ULONG_PTR  SystemHandleCount 
)
static

Definition at line 247 of file win32k.c.

252{
254
255 Parameters.Process = Process;
256 Parameters.Object = Object;
257 Parameters.AccessMask = GrantedAccess;
258 Parameters.ProcessHandleCount = ProcessHandleCount;
259 Parameters.SystemHandleCount = SystemHandleCount;
260
263 &Parameters);
264}
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
PKWIN32_SESSION_CALLOUT ExpDesktopObjectClose
Definition: win32k.c:46
static NTSTATUS NTAPI ExpWin32SessionCallout(_In_ PVOID Object, _In_ PKWIN32_SESSION_CALLOUT CalloutProcedure, _Inout_opt_ PVOID Parameter)
Definition: win32k.c:53
@ ProcessHandleCount
Definition: winternl.h:1902
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20

Referenced by ExpWin32kInit().

◆ ExpDesktopDelete()

static VOID NTAPI ExpDesktopDelete ( PVOID  DeletedObject)
static

Definition at line 209 of file win32k.c.

210{
212
213 /* Fill out the callback structure */
214 Parameters.Object = DeletedObject;
215
216 ExpWin32SessionCallout(DeletedObject,
218 &Parameters);
219}
PKWIN32_SESSION_CALLOUT ExpDesktopObjectDelete
Definition: win32k.c:44

Referenced by ExpWin32kInit().

◆ ExpDesktopOkToClose()

static BOOLEAN NTAPI ExpDesktopOkToClose ( IN PEPROCESS Process  OPTIONAL,
IN PVOID  Object,
IN HANDLE  Handle,
IN KPROCESSOR_MODE  AccessMode 
)
static

Definition at line 115 of file win32k.c.

119{
122
123 Parameters.Process = Process;
124 Parameters.Object = Object;
125 Parameters.Handle = Handle;
126 Parameters.PreviousMode = AccessMode;
127
130 &Parameters);
131
132 return NT_SUCCESS(Status);
133}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
PKWIN32_SESSION_CALLOUT ExpDesktopObjectOkToClose
Definition: win32k.c:43
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396

Referenced by ExpWin32kInit().

◆ ExpDesktopOpen()

static NTSTATUS NTAPI ExpDesktopOpen ( IN OB_OPEN_REASON  Reason,
IN KPROCESSOR_MODE  AccessMode,
IN PEPROCESS Process  OPTIONAL,
IN PVOID  ObjectBody,
IN PACCESS_MASK  GrantedAccess,
IN ULONG  HandleCount 
)
static

Definition at line 224 of file win32k.c.

230{
232
233 Parameters.OpenReason = Reason;
234 Parameters.Process = Process;
235 Parameters.Object = ObjectBody;
236 Parameters.GrantedAccess = *GrantedAccess;
237 Parameters.HandleCount = HandleCount;
238
239 return ExpWin32SessionCallout(ObjectBody,
241 &Parameters);
242}
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
static ULONG HandleCount
Definition: uefidisk.c:67
PKWIN32_SESSION_CALLOUT ExpDesktopObjectOpen
Definition: win32k.c:45

Referenced by ExpWin32kInit().

◆ ExpWin32kInit()

BOOLEAN NTAPI ExpWin32kInit ( VOID  )

Definition at line 269 of file win32k.c.

270{
271 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
274 DPRINT("Creating Win32 Object Types\n");
275
276 /* Create the window station Object Type */
277 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
278 RtlInitUnicodeString(&Name, L"WindowStation");
279 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
280 ObjectTypeInitializer.GenericMapping = ExpWindowStationMapping;
281 ObjectTypeInitializer.PoolType = NonPagedPool;
282 ObjectTypeInitializer.DeleteProcedure = ExpWinStaObjectDelete;
283 ObjectTypeInitializer.ParseProcedure = ExpWinStaObjectParse;
284 ObjectTypeInitializer.OkayToCloseProcedure = ExpWindowStationOkToClose;
285 ObjectTypeInitializer.SecurityRequired = TRUE;
286 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK |
289 ObjectTypeInitializer.ValidAccessMask = STANDARD_RIGHTS_REQUIRED;
291 &ObjectTypeInitializer,
292 NULL,
294 if (!NT_SUCCESS(Status)) return FALSE;
295
296 /* Create desktop object type */
297 RtlInitUnicodeString(&Name, L"Desktop");
298 ObjectTypeInitializer.GenericMapping = ExpDesktopMapping;
299 ObjectTypeInitializer.DeleteProcedure = ExpDesktopDelete;
300 ObjectTypeInitializer.ParseProcedure = NULL;
301 ObjectTypeInitializer.OkayToCloseProcedure = ExpDesktopOkToClose;
302 ObjectTypeInitializer.OpenProcedure = ExpDesktopOpen;
303 ObjectTypeInitializer.CloseProcedure = ExpDesktopClose;
305 &ObjectTypeInitializer,
306 NULL,
308 if (!NT_SUCCESS(Status)) return FALSE;
309
310 return TRUE;
311}
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define L(x)
Definition: resources.c:13
#define NonPagedPool
Definition: env_spec_w32.h:307
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STANDARD_RIGHTS_REQUIRED
Definition: nt_native.h:63
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1137
#define OBJ_OPENLINK
Definition: winternl.h:230
#define OBJ_EXCLUSIVE
Definition: winternl.h:227
#define OBJ_PERMANENT
Definition: winternl.h:226
#define DPRINT
Definition: sndvol32.h:73
OB_CLOSE_METHOD CloseProcedure
Definition: obtypes.h:370
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:360
OB_DELETE_METHOD DeleteProcedure
Definition: obtypes.h:371
OB_OPEN_METHOD OpenProcedure
Definition: obtypes.h:369
OB_PARSE_METHOD ParseProcedure
Definition: obtypes.h:372
OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure
Definition: obtypes.h:375
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
GENERIC_MAPPING ExpWindowStationMapping
Definition: win32k.c:24
GENERIC_MAPPING ExpDesktopMapping
Definition: win32k.c:32
POBJECT_TYPE ExDesktopObjectType
Definition: win32k.c:22
static VOID NTAPI ExpDesktopClose(IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG_PTR ProcessHandleCount, IN ULONG_PTR SystemHandleCount)
Definition: win32k.c:247
static BOOLEAN NTAPI ExpWindowStationOkToClose(IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: win32k.c:138
static BOOLEAN NTAPI ExpDesktopOkToClose(IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: win32k.c:115
static VOID NTAPI ExpWinStaObjectDelete(PVOID DeletedObject)
Definition: win32k.c:161
static VOID NTAPI ExpDesktopDelete(PVOID DeletedObject)
Definition: win32k.c:209
static NTSTATUS NTAPI ExpWinStaObjectParse(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: win32k.c:176
static NTSTATUS NTAPI ExpDesktopOpen(IN OB_OPEN_REASON Reason, IN KPROCESSOR_MODE AccessMode, IN PEPROCESS Process OPTIONAL, IN PVOID ObjectBody, IN PACCESS_MASK GrantedAccess, IN ULONG HandleCount)
Definition: win32k.c:224
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:21

Referenced by ExpInitSystemPhase1().

◆ ExpWin32SessionCallout()

static NTSTATUS NTAPI ExpWin32SessionCallout ( _In_ PVOID  Object,
_In_ PKWIN32_SESSION_CALLOUT  CalloutProcedure,
_Inout_opt_ PVOID  Parameter 
)
static

Definition at line 53 of file win32k.c.

57{
58 PWIN32_KERNEL_OBJECT_HEADER Win32ObjectHeader;
59 PVOID SessionEntry = NULL;
62
63 /* The objects have a common header. And the kernel accesses it!
64 Thanks MS for this kind of retarded "design"! */
65 Win32ObjectHeader = Object;
66
67 /* Check if we are not already in the correct session */
68 if (!PsGetCurrentProcess()->ProcessInSession ||
69 (PsGetCurrentProcessSessionId() != Win32ObjectHeader->SessionId))
70 {
71 /* Get the session from the objects session Id */
72 DPRINT("SessionId == %d\n", Win32ObjectHeader->SessionId);
73 SessionEntry = MmGetSessionById(Win32ObjectHeader->SessionId);
74 if (SessionEntry == NULL)
75 {
76 /* The requested session does not even exist! */
78 return STATUS_NOT_FOUND;
79 }
80
81 /* Attach to the session */
82 Status = MmAttachSession(SessionEntry, &ApcState);
83 if (!NT_SUCCESS(Status))
84 {
85 DPRINT1("Could not attach to 0x%p, object %p, callout 0x%p\n",
86 SessionEntry,
87 Win32ObjectHeader,
88 CalloutProcedure);
89
90 /* Cleanup and return */
91 MmQuitNextSession(SessionEntry);
93 return Status;
94 }
95 }
96
97 /* Call the callout routine */
98 Status = CalloutProcedure(Parameter);
99
100 /* Check if we have a session */
101 if (SessionEntry != NULL)
102 {
103 /* Detach from the session and quit using it */
104 MmDetachSession(SessionEntry, &ApcState);
105 MmQuitNextSession(SessionEntry);
106 }
107
108 /* Return the callback status */
109 return Status;
110}
#define DPRINT1
Definition: precomp.h:8
#define ASSERT(a)
Definition: mode.c:44
VOID NTAPI MmQuitNextSession(_Inout_ PVOID SessionEntry)
Definition: session.c:1030
PVOID NTAPI MmGetSessionById(_In_ ULONG SessionId)
Definition: session.c:1050
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1769
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
#define STATUS_NOT_FOUND
Definition: shellext.h:72
KAPC_STATE
Definition: ketypes.h:1727
#define PsGetCurrentProcess
Definition: psfuncs.h:17
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336

Referenced by ExpDesktopClose(), ExpDesktopDelete(), ExpDesktopOkToClose(), ExpDesktopOpen(), ExpWindowStationOkToClose(), ExpWinStaObjectDelete(), and ExpWinStaObjectParse().

◆ ExpWindowStationOkToClose()

static BOOLEAN NTAPI ExpWindowStationOkToClose ( IN PEPROCESS Process  OPTIONAL,
IN PVOID  Object,
IN HANDLE  Handle,
IN KPROCESSOR_MODE  AccessMode 
)
static

Definition at line 138 of file win32k.c.

142{
145
146 Parameters.Process = Process;
147 Parameters.Object = Object;
148 Parameters.Handle = Handle;
149 Parameters.PreviousMode = AccessMode;
150
153 &Parameters);
154
155 return NT_SUCCESS(Status);
156}
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectOkToClose
Definition: win32k.c:42

Referenced by ExpWin32kInit().

◆ ExpWinStaObjectDelete()

static VOID NTAPI ExpWinStaObjectDelete ( PVOID  DeletedObject)
static

Definition at line 161 of file win32k.c.

162{
164
165 /* Fill out the callback structure */
166 Parameters.Object = DeletedObject;
167
168 ExpWin32SessionCallout(DeletedObject,
170 &Parameters);
171}
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectDelete
Definition: win32k.c:41

Referenced by ExpWin32kInit().

◆ ExpWinStaObjectParse()

static NTSTATUS NTAPI ExpWinStaObjectParse ( 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 
)
static

Definition at line 176 of file win32k.c.

186{
188
189 /* Fill out the callback structure */
190 Parameters.ParseObject = ParseObject;
191 Parameters.ObjectType = ObjectType;
192 Parameters.AccessState = AccessState;
193 Parameters.AccessMode = AccessMode;
194 Parameters.Attributes = Attributes;
195 Parameters.CompleteName = CompleteName;
196 Parameters.RemainingName = RemainingName;
197 Parameters.Context = Context;
198 Parameters.SecurityQos = SecurityQos;
199 Parameters.Object = Object;
200
201 return ExpWin32SessionCallout(ParseObject,
203 &Parameters);
204}
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
ObjectType
Definition: metafile.c:88
_In_ PVOID Context
Definition: storport.h:2269
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
PKWIN32_SESSION_CALLOUT ExpWindowStationObjectParse
Definition: win32k.c:40
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417

Referenced by ExpWin32kInit().

Variable Documentation

◆ ExDesktopObjectType

◆ ExpDesktopMapping

GENERIC_MAPPING ExpDesktopMapping
Initial value:
=
{
}
#define STANDARD_RIGHTS_READ
Definition: nt_native.h:65
#define STANDARD_RIGHTS_WRITE
Definition: nt_native.h:66
#define STANDARD_RIGHTS_EXECUTE
Definition: nt_native.h:67

Definition at line 32 of file win32k.c.

Referenced by ExpWin32kInit().

◆ ExpDesktopObjectClose

PKWIN32_SESSION_CALLOUT ExpDesktopObjectClose = NULL

Definition at line 46 of file win32k.c.

Referenced by ExpDesktopClose(), and PsEstablishWin32Callouts().

◆ ExpDesktopObjectDelete

PKWIN32_SESSION_CALLOUT ExpDesktopObjectDelete = NULL

Definition at line 44 of file win32k.c.

Referenced by ExpDesktopDelete(), and PsEstablishWin32Callouts().

◆ ExpDesktopObjectOkToClose

PKWIN32_SESSION_CALLOUT ExpDesktopObjectOkToClose = NULL

Definition at line 43 of file win32k.c.

Referenced by ExpDesktopOkToClose(), and PsEstablishWin32Callouts().

◆ ExpDesktopObjectOpen

PKWIN32_SESSION_CALLOUT ExpDesktopObjectOpen = NULL

Definition at line 45 of file win32k.c.

Referenced by ExpDesktopOpen(), and PsEstablishWin32Callouts().

◆ ExpWindowStationMapping

GENERIC_MAPPING ExpWindowStationMapping

◆ ExpWindowStationObjectDelete

PKWIN32_SESSION_CALLOUT ExpWindowStationObjectDelete = NULL

Definition at line 41 of file win32k.c.

Referenced by ExpWinStaObjectDelete(), and PsEstablishWin32Callouts().

◆ ExpWindowStationObjectOkToClose

PKWIN32_SESSION_CALLOUT ExpWindowStationObjectOkToClose = NULL

Definition at line 42 of file win32k.c.

Referenced by ExpWindowStationOkToClose(), and PsEstablishWin32Callouts().

◆ ExpWindowStationObjectParse

PKWIN32_SESSION_CALLOUT ExpWindowStationObjectParse = NULL

Definition at line 40 of file win32k.c.

Referenced by ExpWinStaObjectParse(), and PsEstablishWin32Callouts().

◆ ExWindowStationObjectType