Synchronize with trunk r58606.
[reactos.git] / ntoskrnl / ex / win32k.c
1 /*
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)
7 */
8
9 #include <ntoskrnl.h>
10 #define NDEBUG
11 #include <debug.h>
12
13 #if defined (ALLOC_PRAGMA)
14 #pragma alloc_text(INIT, ExpWin32kInit)
15 #endif
16
17 /* DATA **********************************************************************/
18
19 POBJECT_TYPE ExWindowStationObjectType = NULL;
20 POBJECT_TYPE ExDesktopObjectType = NULL;
21
22 GENERIC_MAPPING ExpWindowStationMapping =
23 {
24 STANDARD_RIGHTS_READ,
25 STANDARD_RIGHTS_WRITE,
26 STANDARD_RIGHTS_EXECUTE,
27 STANDARD_RIGHTS_REQUIRED
28 };
29
30 GENERIC_MAPPING ExpDesktopMapping =
31 {
32 STANDARD_RIGHTS_READ,
33 STANDARD_RIGHTS_WRITE,
34 STANDARD_RIGHTS_EXECUTE,
35 STANDARD_RIGHTS_REQUIRED
36 };
37
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;
45
46 /* FUNCTIONS ****************************************************************/
47
48 BOOLEAN
49 NTAPI
50 ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL,
51 IN PVOID Object,
52 IN HANDLE Handle,
53 IN KPROCESSOR_MODE AccessMode)
54 {
55 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters;
56
57 Parameters.Process = Process;
58 Parameters.Object = Object;
59 Parameters.Handle = Handle;
60 Parameters.PreviousMode = AccessMode;
61
62 return NT_SUCCESS(ExpDesktopObjectOkToClose(&Parameters));
63 }
64
65 BOOLEAN
66 NTAPI
67 ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL,
68 IN PVOID Object,
69 IN HANDLE Handle,
70 IN KPROCESSOR_MODE AccessMode)
71 {
72 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters;
73
74 Parameters.Process = Process;
75 Parameters.Object = Object;
76 Parameters.Handle = Handle;
77 Parameters.PreviousMode = AccessMode;
78
79 return NT_SUCCESS(ExpWindowStationObjectOkToClose(&Parameters));
80 }
81
82 VOID
83 NTAPI
84 ExpWinStaObjectDelete(PVOID DeletedObject)
85 {
86 WIN32_DELETEMETHOD_PARAMETERS Parameters;
87
88 /* Fill out the callback structure */
89 Parameters.Object = DeletedObject;
90
91 /* Call the Registered Callback */
92 ExpWindowStationObjectDelete(&Parameters);
93 }
94
95 NTSTATUS
96 NTAPI
97 ExpWinStaObjectParse(IN PVOID ParseObject,
98 IN PVOID ObjectType,
99 IN OUT PACCESS_STATE AccessState,
100 IN KPROCESSOR_MODE AccessMode,
101 IN ULONG Attributes,
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,
106 OUT PVOID *Object)
107 {
108 WIN32_PARSEMETHOD_PARAMETERS Parameters;
109
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;
121
122 /* Call the Registered Callback */
123 return ExpWindowStationObjectParse(&Parameters);
124 }
125 VOID
126 NTAPI
127 ExpDesktopDelete(PVOID DeletedObject)
128 {
129 WIN32_DELETEMETHOD_PARAMETERS Parameters;
130
131 /* Fill out the callback structure */
132 Parameters.Object = DeletedObject;
133
134 /* Call the Registered Callback */
135 ExpDesktopObjectDelete(&Parameters);
136 }
137
138 NTSTATUS
139 NTAPI
140 ExpDesktopOpen(IN OB_OPEN_REASON Reason,
141 IN PEPROCESS Process OPTIONAL,
142 IN PVOID ObjectBody,
143 IN ACCESS_MASK GrantedAccess,
144 IN ULONG HandleCount)
145 {
146 WIN32_OPENMETHOD_PARAMETERS Parameters;
147
148 Parameters.OpenReason = Reason;
149 Parameters.Process = Process;
150 Parameters.Object = ObjectBody;
151 Parameters.GrantedAccess = GrantedAccess;
152 Parameters.HandleCount = HandleCount;
153
154 return ExpDesktopObjectOpen(&Parameters);
155 }
156
157 VOID
158 NTAPI
159 ExpDesktopClose(IN PEPROCESS Process OPTIONAL,
160 IN PVOID Object,
161 IN ACCESS_MASK GrantedAccess,
162 IN ULONG ProcessHandleCount,
163 IN ULONG SystemHandleCount)
164 {
165 WIN32_CLOSEMETHOD_PARAMETERS Parameters;
166
167 Parameters.Process = Process;
168 Parameters.Object = Object;
169 Parameters.AccessMask = GrantedAccess;
170 Parameters.ProcessHandleCount = ProcessHandleCount;
171 Parameters.SystemHandleCount = SystemHandleCount;
172
173 ExpDesktopObjectClose(&Parameters);
174 }
175
176 BOOLEAN
177 INIT_FUNCTION
178 NTAPI
179 ExpWin32kInit(VOID)
180 {
181 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
182 UNICODE_STRING Name;
183 NTSTATUS Status;
184 DPRINT("Creating Win32 Object Types\n");
185
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 |
197 OBJ_PERMANENT |
198 OBJ_EXCLUSIVE;
199 ObjectTypeInitializer.ValidAccessMask = STANDARD_RIGHTS_REQUIRED;
200 Status = ObCreateObjectType(&Name,
201 &ObjectTypeInitializer,
202 NULL,
203 &ExWindowStationObjectType);
204 if (!NT_SUCCESS(Status)) return FALSE;
205
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,
216 NULL,
217 &ExDesktopObjectType);
218 if (!NT_SUCCESS(Status)) return FALSE;
219
220 return TRUE;
221 }
222
223 /* EOF */