Merge r55012 adding Wine3D control panel as per Amine's request.
[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
44 /* FUNCTIONS ****************************************************************/
45
46 BOOLEAN
47 NTAPI
48 ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL,
49 IN PVOID Object,
50 IN HANDLE Handle,
51 IN KPROCESSOR_MODE AccessMode)
52 {
53 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters;
54
55 Parameters.Process = Process;
56 Parameters.Object = Object;
57 Parameters.Handle = Handle;
58 Parameters.PreviousMode = AccessMode;
59
60 return NT_SUCCESS(ExpDesktopObjectOkToClose(&Parameters));
61 }
62
63 BOOLEAN
64 NTAPI
65 ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL,
66 IN PVOID Object,
67 IN HANDLE Handle,
68 IN KPROCESSOR_MODE AccessMode)
69 {
70 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters;
71
72 Parameters.Process = Process;
73 Parameters.Object = Object;
74 Parameters.Handle = Handle;
75 Parameters.PreviousMode = AccessMode;
76
77 return NT_SUCCESS(ExpWindowStationObjectOkToClose(&Parameters));
78 }
79
80 VOID
81 NTAPI
82 ExpWinStaObjectDelete(PVOID DeletedObject)
83 {
84 WIN32_DELETEMETHOD_PARAMETERS Parameters;
85
86 /* Fill out the callback structure */
87 Parameters.Object = DeletedObject;
88
89 /* Call the Registered Callback */
90 ExpWindowStationObjectDelete(&Parameters);
91 }
92
93 NTSTATUS
94 NTAPI
95 ExpWinStaObjectParse(IN PVOID ParseObject,
96 IN PVOID ObjectType,
97 IN OUT PACCESS_STATE AccessState,
98 IN KPROCESSOR_MODE AccessMode,
99 IN ULONG Attributes,
100 IN OUT PUNICODE_STRING CompleteName,
101 IN OUT PUNICODE_STRING RemainingName,
102 IN OUT PVOID Context OPTIONAL,
103 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
104 OUT PVOID *Object)
105 {
106 WIN32_PARSEMETHOD_PARAMETERS Parameters;
107
108 /* Fill out the callback structure */
109 Parameters.ParseObject = ParseObject;
110 Parameters.ObjectType = ObjectType;
111 Parameters.AccessState = AccessState;
112 Parameters.AccessMode = AccessMode;
113 Parameters.Attributes = Attributes;
114 Parameters.CompleteName = CompleteName;
115 Parameters.RemainingName = RemainingName;
116 Parameters.Context = Context;
117 Parameters.SecurityQos = SecurityQos;
118 Parameters.Object = Object;
119
120 /* Call the Registered Callback */
121 return ExpWindowStationObjectParse(&Parameters);
122 }
123 VOID
124 NTAPI
125 ExpDesktopDelete(PVOID DeletedObject)
126 {
127 WIN32_DELETEMETHOD_PARAMETERS Parameters;
128
129 /* Fill out the callback structure */
130 Parameters.Object = DeletedObject;
131
132 /* Call the Registered Callback */
133 ExpDesktopObjectDelete(&Parameters);
134 }
135
136 VOID
137 INIT_FUNCTION
138 NTAPI
139 ExpWin32kInit(VOID)
140 {
141 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
142 UNICODE_STRING Name;
143 DPRINT("Creating Win32 Object Types\n");
144
145 /* Create the window station Object Type */
146 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
147 RtlInitUnicodeString(&Name, L"WindowStation");
148 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
149 ObjectTypeInitializer.GenericMapping = ExpWindowStationMapping;
150 ObjectTypeInitializer.PoolType = NonPagedPool;
151 ObjectTypeInitializer.DeleteProcedure = ExpWinStaObjectDelete;
152 ObjectTypeInitializer.ParseProcedure = ExpWinStaObjectParse;
153 ObjectTypeInitializer.OkayToCloseProcedure = ExpWindowStationOkToClose;
154 ObCreateObjectType(&Name,
155 &ObjectTypeInitializer,
156 NULL,
157 &ExWindowStationObjectType);
158
159 /* Create desktop object type */
160 RtlInitUnicodeString(&Name, L"Desktop");
161 ObjectTypeInitializer.GenericMapping = ExpDesktopMapping;
162 ObjectTypeInitializer.DeleteProcedure = ExpDesktopDelete;
163 ObjectTypeInitializer.ParseProcedure = NULL;
164 ObjectTypeInitializer.OkayToCloseProcedure = ExpDesktopOkToClose;
165 ObCreateObjectType(&Name,
166 &ObjectTypeInitializer,
167 NULL,
168 &ExDesktopObjectType);
169 }
170
171 /* EOF */