2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: ntoskrnl/ex/win32k.c
5 * PURPOSE: Executive Win32 Object Support (Desktop/WinStation)
6 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
13 #if defined (ALLOC_PRAGMA)
14 #pragma alloc_text(INIT, ExpWin32kInit)
17 typedef struct _WIN32_KERNEL_OBJECT_HEADER
20 } WIN32_KERNEL_OBJECT_HEADER
, *PWIN32_KERNEL_OBJECT_HEADER
;
23 /* DATA **********************************************************************/
25 POBJECT_TYPE ExWindowStationObjectType
= NULL
;
26 POBJECT_TYPE ExDesktopObjectType
= NULL
;
28 GENERIC_MAPPING ExpWindowStationMapping
=
31 STANDARD_RIGHTS_WRITE
,
32 STANDARD_RIGHTS_EXECUTE
,
33 STANDARD_RIGHTS_REQUIRED
36 GENERIC_MAPPING ExpDesktopMapping
=
39 STANDARD_RIGHTS_WRITE
,
40 STANDARD_RIGHTS_EXECUTE
,
41 STANDARD_RIGHTS_REQUIRED
44 PKWIN32_SESSION_CALLOUT ExpWindowStationObjectParse
= NULL
;
45 PKWIN32_SESSION_CALLOUT ExpWindowStationObjectDelete
= NULL
;
46 PKWIN32_SESSION_CALLOUT ExpWindowStationObjectOkToClose
= NULL
;
47 PKWIN32_SESSION_CALLOUT ExpDesktopObjectOkToClose
= NULL
;
48 PKWIN32_SESSION_CALLOUT ExpDesktopObjectDelete
= NULL
;
49 PKWIN32_SESSION_CALLOUT ExpDesktopObjectOpen
= NULL
;
50 PKWIN32_SESSION_CALLOUT ExpDesktopObjectClose
= NULL
;
52 /* FUNCTIONS ****************************************************************/
56 ExpWin32SessionCallout(
58 _In_ PKWIN32_SESSION_CALLOUT CalloutProcedure
,
59 _Inout_opt_ PVOID Parameter
)
61 PWIN32_KERNEL_OBJECT_HEADER Win32ObjectHeader
;
62 PVOID SessionEntry
= NULL
;
66 /* The objects have a common header. And the kernel accesses it!
67 Thanks MS for this kind of retarded "design"! */
68 Win32ObjectHeader
= Object
;
70 /* Check if we are not already in the correct session */
71 if (!PsGetCurrentProcess()->ProcessInSession
||
72 (PsGetCurrentProcessSessionId() != Win32ObjectHeader
->SessionId
))
74 /* Get the session from the objects session Id */
75 DPRINT("SessionId == %d\n", Win32ObjectHeader
->SessionId
);
76 SessionEntry
= MmGetSessionById(Win32ObjectHeader
->SessionId
);
77 if (SessionEntry
== NULL
)
79 /* The requested session does not even exist! */
81 return STATUS_NOT_FOUND
;
84 /* Attach to the session */
85 Status
= MmAttachSession(SessionEntry
, &ApcState
);
86 if (!NT_SUCCESS(Status
))
88 DPRINT1("Could not attach to 0x%p, object %p, callout 0x%p\n",
93 /* Cleanup and return */
94 MmQuitNextSession(SessionEntry
);
100 /* Call the callout routine */
101 Status
= CalloutProcedure(Parameter
);
103 /* Check if we have a session */
104 if (SessionEntry
!= NULL
)
106 /* Detach from the session and quit using it */
107 MmDetachSession(SessionEntry
, &ApcState
);
108 MmQuitNextSession(SessionEntry
);
111 /* Return the callback status */
117 ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL
,
120 IN KPROCESSOR_MODE AccessMode
)
122 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
125 Parameters
.Process
= Process
;
126 Parameters
.Object
= Object
;
127 Parameters
.Handle
= Handle
;
128 Parameters
.PreviousMode
= AccessMode
;
130 Status
= ExpWin32SessionCallout(Object
,
131 ExpDesktopObjectOkToClose
,
134 return NT_SUCCESS(Status
);
139 ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL
,
142 IN KPROCESSOR_MODE AccessMode
)
144 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
147 Parameters
.Process
= Process
;
148 Parameters
.Object
= Object
;
149 Parameters
.Handle
= Handle
;
150 Parameters
.PreviousMode
= AccessMode
;
152 Status
= ExpWin32SessionCallout(Object
,
153 ExpWindowStationObjectOkToClose
,
156 return NT_SUCCESS(Status
);
161 ExpWinStaObjectDelete(PVOID DeletedObject
)
163 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
165 /* Fill out the callback structure */
166 Parameters
.Object
= DeletedObject
;
168 ExpWin32SessionCallout(DeletedObject
,
169 ExpWindowStationObjectDelete
,
175 ExpWinStaObjectParse(IN PVOID ParseObject
,
177 IN OUT PACCESS_STATE AccessState
,
178 IN KPROCESSOR_MODE AccessMode
,
180 IN OUT PUNICODE_STRING CompleteName
,
181 IN OUT PUNICODE_STRING RemainingName
,
182 IN OUT PVOID Context OPTIONAL
,
183 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
186 WIN32_PARSEMETHOD_PARAMETERS Parameters
;
188 /* Fill out the callback structure */
189 Parameters
.ParseObject
= ParseObject
;
190 Parameters
.ObjectType
= ObjectType
;
191 Parameters
.AccessState
= AccessState
;
192 Parameters
.AccessMode
= AccessMode
;
193 Parameters
.Attributes
= Attributes
;
194 Parameters
.CompleteName
= CompleteName
;
195 Parameters
.RemainingName
= RemainingName
;
196 Parameters
.Context
= Context
;
197 Parameters
.SecurityQos
= SecurityQos
;
198 Parameters
.Object
= Object
;
200 return ExpWin32SessionCallout(ParseObject
,
201 ExpWindowStationObjectParse
,
206 ExpDesktopDelete(PVOID DeletedObject
)
208 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
210 /* Fill out the callback structure */
211 Parameters
.Object
= DeletedObject
;
213 ExpWin32SessionCallout(DeletedObject
,
214 ExpDesktopObjectDelete
,
220 ExpDesktopOpen(IN OB_OPEN_REASON Reason
,
221 IN PEPROCESS Process OPTIONAL
,
223 IN ACCESS_MASK GrantedAccess
,
224 IN ULONG HandleCount
)
226 WIN32_OPENMETHOD_PARAMETERS Parameters
;
228 Parameters
.OpenReason
= Reason
;
229 Parameters
.Process
= Process
;
230 Parameters
.Object
= ObjectBody
;
231 Parameters
.GrantedAccess
= GrantedAccess
;
232 Parameters
.HandleCount
= HandleCount
;
234 return ExpWin32SessionCallout(ObjectBody
,
235 ExpDesktopObjectOpen
,
241 ExpDesktopClose(IN PEPROCESS Process OPTIONAL
,
243 IN ACCESS_MASK GrantedAccess
,
244 IN ULONG ProcessHandleCount
,
245 IN ULONG SystemHandleCount
)
247 WIN32_CLOSEMETHOD_PARAMETERS Parameters
;
249 Parameters
.Process
= Process
;
250 Parameters
.Object
= Object
;
251 Parameters
.AccessMask
= GrantedAccess
;
252 Parameters
.ProcessHandleCount
= ProcessHandleCount
;
253 Parameters
.SystemHandleCount
= SystemHandleCount
;
255 ExpWin32SessionCallout(Object
,
256 ExpDesktopObjectClose
,
265 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
268 DPRINT("Creating Win32 Object Types\n");
270 /* Create the window station Object Type */
271 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
272 RtlInitUnicodeString(&Name
, L
"WindowStation");
273 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
274 ObjectTypeInitializer
.GenericMapping
= ExpWindowStationMapping
;
275 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
276 ObjectTypeInitializer
.DeleteProcedure
= ExpWinStaObjectDelete
;
277 ObjectTypeInitializer
.ParseProcedure
= ExpWinStaObjectParse
;
278 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpWindowStationOkToClose
;
279 ObjectTypeInitializer
.SecurityRequired
= TRUE
;
280 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
|
283 ObjectTypeInitializer
.ValidAccessMask
= STANDARD_RIGHTS_REQUIRED
;
284 Status
= ObCreateObjectType(&Name
,
285 &ObjectTypeInitializer
,
287 &ExWindowStationObjectType
);
288 if (!NT_SUCCESS(Status
)) return FALSE
;
290 /* Create desktop object type */
291 RtlInitUnicodeString(&Name
, L
"Desktop");
292 ObjectTypeInitializer
.GenericMapping
= ExpDesktopMapping
;
293 ObjectTypeInitializer
.DeleteProcedure
= ExpDesktopDelete
;
294 ObjectTypeInitializer
.ParseProcedure
= NULL
;
295 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpDesktopOkToClose
;
296 ObjectTypeInitializer
.OpenProcedure
= ExpDesktopOpen
;
297 ObjectTypeInitializer
.CloseProcedure
= ExpDesktopClose
;
298 Status
= ObCreateObjectType(&Name
,
299 &ObjectTypeInitializer
,
301 &ExDesktopObjectType
);
302 if (!NT_SUCCESS(Status
)) return FALSE
;