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
;
44 /* FUNCTIONS ****************************************************************/
48 ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL
,
51 IN KPROCESSOR_MODE AccessMode
)
53 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
55 Parameters
.Process
= Process
;
56 Parameters
.Object
= Object
;
57 Parameters
.Handle
= Handle
;
58 Parameters
.PreviousMode
= AccessMode
;
60 return NT_SUCCESS(ExpDesktopObjectOkToClose(&Parameters
));
65 ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL
,
68 IN KPROCESSOR_MODE AccessMode
)
70 WIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
;
72 Parameters
.Process
= Process
;
73 Parameters
.Object
= Object
;
74 Parameters
.Handle
= Handle
;
75 Parameters
.PreviousMode
= AccessMode
;
77 return NT_SUCCESS(ExpWindowStationObjectOkToClose(&Parameters
));
82 ExpWinStaObjectDelete(PVOID DeletedObject
)
84 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
86 /* Fill out the callback structure */
87 Parameters
.Object
= DeletedObject
;
89 /* Call the Registered Callback */
90 ExpWindowStationObjectDelete(&Parameters
);
95 ExpWinStaObjectParse(IN PVOID ParseObject
,
97 IN OUT PACCESS_STATE AccessState
,
98 IN KPROCESSOR_MODE AccessMode
,
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
,
106 WIN32_PARSEMETHOD_PARAMETERS Parameters
;
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
;
120 /* Call the Registered Callback */
121 return ExpWindowStationObjectParse(&Parameters
);
125 ExpDesktopDelete(PVOID DeletedObject
)
127 WIN32_DELETEMETHOD_PARAMETERS Parameters
;
129 /* Fill out the callback structure */
130 Parameters
.Object
= DeletedObject
;
132 /* Call the Registered Callback */
133 ExpDesktopObjectDelete(&Parameters
);
141 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
144 DPRINT("Creating Win32 Object Types\n");
146 /* Create the window station Object Type */
147 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
148 RtlInitUnicodeString(&Name
, L
"WindowStation");
149 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
150 ObjectTypeInitializer
.GenericMapping
= ExpWindowStationMapping
;
151 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
152 ObjectTypeInitializer
.DeleteProcedure
= ExpWinStaObjectDelete
;
153 ObjectTypeInitializer
.ParseProcedure
= ExpWinStaObjectParse
;
154 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpWindowStationOkToClose
;
155 ObjectTypeInitializer
.SecurityRequired
= TRUE
;
156 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
|
159 ObjectTypeInitializer
.ValidAccessMask
= STANDARD_RIGHTS_REQUIRED
;
160 Status
= ObCreateObjectType(&Name
,
161 &ObjectTypeInitializer
,
163 &ExWindowStationObjectType
);
164 if (!NT_SUCCESS(Status
)) return FALSE
;
166 /* Create desktop object type */
167 RtlInitUnicodeString(&Name
, L
"Desktop");
168 ObjectTypeInitializer
.GenericMapping
= ExpDesktopMapping
;
169 ObjectTypeInitializer
.DeleteProcedure
= ExpDesktopDelete
;
170 ObjectTypeInitializer
.ParseProcedure
= NULL
;
171 ObjectTypeInitializer
.OkayToCloseProcedure
= ExpDesktopOkToClose
;
172 ObCreateObjectType(&Name
,
173 &ObjectTypeInitializer
,
175 &ExDesktopObjectType
);
176 if (!NT_SUCCESS(Status
)) return FALSE
;