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 /* DATA **********************************************************************/
19 POBJECT_TYPE ExWindowStationObjectType
= NULL
;
20 POBJECT_TYPE ExDesktopObjectType
= NULL
;
22 GENERIC_MAPPING ExpWindowStationMapping
=
25 STANDARD_RIGHTS_WRITE
,
26 STANDARD_RIGHTS_EXECUTE
,
27 STANDARD_RIGHTS_REQUIRED
30 GENERIC_MAPPING ExpDesktopMapping
=
33 STANDARD_RIGHTS_WRITE
,
34 STANDARD_RIGHTS_EXECUTE
,
35 STANDARD_RIGHTS_REQUIRED
38 PKWIN32_PARSEMETHOD_CALLOUT ExpWindowStationObjectParse
= NULL
;
39 PKWIN32_DELETEMETHOD_CALLOUT ExpWindowStationObjectDelete
= NULL
;
40 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpWindowStationObjectOkToClose
= NULL
;
41 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpDesktopObjectOkToClose
= NULL
;
42 PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete
= NULL
;
43 PKWIN32_OPENMETHOD_CALLOUT ExpDesktopObjectOpen
= NULL
;
44 PKWIN32_CLOSEMETHOD_CALLOUT ExpDesktopObjectClose
= NULL
;
46 /* FUNCTIONS ****************************************************************/
50 ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL
,
53 IN KPROCESSOR_MODE AccessMode
)
55 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
57 Parameters
.Process
= Process
;
58 Parameters
.Object
= Object
;
59 Parameters
.Handle
= Handle
;
60 Parameters
.PreviousMode
= AccessMode
;
62 return NT_SUCCESS(ExpDesktopObjectOkToClose(&Parameters
));
67 ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL
,
70 IN KPROCESSOR_MODE AccessMode
)
72 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
74 Parameters
.Process
= Process
;
75 Parameters
.Object
= Object
;
76 Parameters
.Handle
= Handle
;
77 Parameters
.PreviousMode
= AccessMode
;
79 return NT_SUCCESS(ExpWindowStationObjectOkToClose(&Parameters
));
84 ExpWinStaObjectDelete(PVOID DeletedObject
)
86 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
88 /* Fill out the callback structure */
89 Parameters
.Object
= DeletedObject
;
91 /* Call the Registered Callback */
92 ExpWindowStationObjectDelete(&Parameters
);
97 ExpWinStaObjectParse(IN PVOID ParseObject
,
99 IN OUT PACCESS_STATE AccessState
,
100 IN KPROCESSOR_MODE AccessMode
,
102 IN OUT PUNICODE_STRING CompleteName
,
103 IN OUT PUNICODE_STRING RemainingName
,
104 IN OUT PVOID Context OPTIONAL
,
105 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
108 WIN32_PARSEMETHOD_PARAMETERS Parameters
;
110 /* Fill out the callback structure */
111 Parameters
.ParseObject
= ParseObject
;
112 Parameters
.ObjectType
= ObjectType
;
113 Parameters
.AccessState
= AccessState
;
114 Parameters
.AccessMode
= AccessMode
;
115 Parameters
.Attributes
= Attributes
;
116 Parameters
.CompleteName
= CompleteName
;
117 Parameters
.RemainingName
= RemainingName
;
118 Parameters
.Context
= Context
;
119 Parameters
.SecurityQos
= SecurityQos
;
120 Parameters
.Object
= Object
;
122 /* Call the Registered Callback */
123 return ExpWindowStationObjectParse(&Parameters
);
127 ExpDesktopDelete(PVOID DeletedObject
)
129 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
131 /* Fill out the callback structure */
132 Parameters
.Object
= DeletedObject
;
134 /* Call the Registered Callback */
135 ExpDesktopObjectDelete(&Parameters
);
140 ExpDesktopOpen(IN OB_OPEN_REASON Reason
,
141 IN PEPROCESS Process OPTIONAL
,
143 IN ACCESS_MASK GrantedAccess
,
144 IN ULONG HandleCount
)
146 WIN32_OPENMETHOD_PARAMETERS Parameters
;
148 Parameters
.OpenReason
= Reason
;
149 Parameters
.Process
= Process
;
150 Parameters
.Object
= ObjectBody
;
151 Parameters
.GrantedAccess
= GrantedAccess
;
152 Parameters
.HandleCount
= HandleCount
;
154 return ExpDesktopObjectOpen(&Parameters
);
159 ExpDesktopClose(IN PEPROCESS Process OPTIONAL
,
161 IN ACCESS_MASK GrantedAccess
,
162 IN ULONG ProcessHandleCount
,
163 IN ULONG SystemHandleCount
)
165 WIN32_CLOSEMETHOD_PARAMETERS Parameters
;
167 Parameters
.Process
= Process
;
168 Parameters
.Object
= Object
;
169 Parameters
.AccessMask
= GrantedAccess
;
170 Parameters
.ProcessHandleCount
= ProcessHandleCount
;
171 Parameters
.SystemHandleCount
= SystemHandleCount
;
173 ExpDesktopObjectClose(&Parameters
);
181 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
184 DPRINT("Creating Win32 Object Types\n");
186 /* Create the window station Object Type */
187 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
188 RtlInitUnicodeString(&Name
, L
"WindowStation");
189 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
190 ObjectTypeInitializer
.GenericMapping
= ExpWindowStationMapping
;
191 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
192 ObjectTypeInitializer
.DeleteProcedure
= ExpWinStaObjectDelete
;
193 ObjectTypeInitializer
.ParseProcedure
= ExpWinStaObjectParse
;
194 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpWindowStationOkToClose
;
195 ObjectTypeInitializer
.SecurityRequired
= TRUE
;
196 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
|
199 ObjectTypeInitializer
.ValidAccessMask
= STANDARD_RIGHTS_REQUIRED
;
200 Status
= ObCreateObjectType(&Name
,
201 &ObjectTypeInitializer
,
203 &ExWindowStationObjectType
);
204 if (!NT_SUCCESS(Status
)) return FALSE
;
206 /* Create desktop object type */
207 RtlInitUnicodeString(&Name
, L
"Desktop");
208 ObjectTypeInitializer
.GenericMapping
= ExpDesktopMapping
;
209 ObjectTypeInitializer
.DeleteProcedure
= ExpDesktopDelete
;
210 ObjectTypeInitializer
.ParseProcedure
= NULL
;
211 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpDesktopOkToClose
;
212 ObjectTypeInitializer
.OpenProcedure
= ExpDesktopOpen
;
213 ObjectTypeInitializer
.CloseProcedure
= ExpDesktopClose
;
214 ObCreateObjectType(&Name
,
215 &ObjectTypeInitializer
,
217 &ExDesktopObjectType
);
218 if (!NT_SUCCESS(Status
)) return FALSE
;