ReactOS 0.4.17-dev-573-g8315b8c
guidobj.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/wmi/guidobj.c
5 * PURPOSE: I/O Windows Management Instrumentation (WMI) Support
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9/* INCLUDES *****************************************************************/
10
11#include <ntoskrnl.h>
12#include <wmistr.h>
13#include "wmip.h"
14
15#define NDEBUG
16#include <debug.h>
17
18
19/* GLOBALS ******************************************************************/
20
23{
28};
29
30
31/* FUNCTIONS *****************************************************************/
32
37 _In_ SECURITY_OPERATION_CODE OperationType,
40 _Inout_ PULONG CapturedLength,
41 _Inout_ PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
45{
46 PAGED_CODE();
47
49 ASSERT((OperationType == QuerySecurityDescriptor) ||
50 (OperationType == SetSecurityDescriptor) ||
51 (OperationType == AssignSecurityDescriptor) ||
52 (OperationType == DeleteSecurityDescriptor));
53
54 if (OperationType == QuerySecurityDescriptor)
55 {
59 CapturedLength,
60 ObjectSecurityDescriptor);
61 }
62 else if (OperationType == SetSecurityDescriptor)
63 {
67 ObjectSecurityDescriptor,
70 }
71 else if (OperationType == AssignSecurityDescriptor)
72 {
74 return STATUS_SUCCESS;
75 }
76 else if (OperationType == DeleteSecurityDescriptor)
77 {
78 return ObDeassignSecurity(ObjectSecurityDescriptor);
79 }
80
83}
84
85VOID
89{
90 PWMIP_GUID_OBJECT GuidObject = Object;
91
92 /* Check if the object is attached to an IRP */
93 if (GuidObject->Irp != NULL)
94 {
95 /* This is not supported yet */
97 }
98}
99
100VOID
101NTAPI
107 _In_ ULONG_PTR SystemHandleCount)
108{
109 /* For now nothing */
110}
111
113NTAPI
115 VOID)
116{
117 static UNICODE_STRING GuidObjectName = RTL_CONSTANT_STRING(L"WmiGuid");
118 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
120
121 /* Setup the object type initializer */
122 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
123 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
124 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
125 ObjectTypeInitializer.GenericMapping = WmipGenericMapping;
126 ObjectTypeInitializer.PoolType = NonPagedPool;
127 ObjectTypeInitializer.MaintainHandleCount = FALSE;
128 ObjectTypeInitializer.ValidAccessMask = STANDARD_RIGHTS_ALL | 0xFFF;
129 ObjectTypeInitializer.SecurityRequired = TRUE;
130 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(WMIP_GUID_OBJECT);
131 ObjectTypeInitializer.SecurityProcedure = WmipSecurityMethod;
132 ObjectTypeInitializer.DeleteProcedure = WmipDeleteMethod;
133 ObjectTypeInitializer.CloseProcedure = WmipCloseMethod;
134
135 /* Create the object type */
136 Status = ObCreateObjectType(&GuidObjectName,
137 &ObjectTypeInitializer,
138 0,
140 if (!NT_SUCCESS(Status))
141 {
142 DPRINT1("ObCreateObjectType failed: 0x%lx\n", Status);
143 }
144
145 return Status;
146}
147
148static
153{
156
157 /* Validate string length */
158 if (GuidString->Length != GUID_STRING_LENGTH * sizeof(WCHAR))
159 {
161 }
162
163 /* Copy the string and wrap it in {} */
164 RtlCopyMemory(&Buffer[1], GuidString->Buffer, GuidString->Length);
165 Buffer[0] = L'{';
166 Buffer[GUID_STRING_LENGTH + 1] = L'}';
167
168 String.Buffer = Buffer;
169 String.Length = String.MaximumLength = sizeof(Buffer);
170
171 return RtlGUIDFromString(&String, Guid);
172}
173
174static
177 _In_ const GUID *Guid,
178 _Out_ PWMIP_GUID_OBJECT *OutGuidObject)
179{
181 PWMIP_GUID_OBJECT GuidObject;
183
184 /* Initialize object attributes for an unnamed object */
186 NULL,
187 0,
188 NULL,
189 NULL); // FIXME: security descriptor!
190
191 /* Create the GUID object */
196 NULL,
197 sizeof(WMIP_GUID_OBJECT),
198 0,
199 0,
200 (PVOID*)&GuidObject);
201 if (!NT_SUCCESS(Status))
202 {
203 DPRINT1("WMI: failed to create GUID object: 0x%lx\n", Status);
204 return Status;
205 }
206
207 RtlZeroMemory(GuidObject, sizeof(*GuidObject));
209 GuidObject->Guid = *Guid;
210
211 *OutGuidObject = GuidObject;
212
213 return STATUS_SUCCESS;
214}
215
217NTAPI
222 _Out_ PHANDLE OutGuidObjectHandle,
223 _Outptr_ PVOID *OutGuidObject)
224{
225 PWMIP_GUID_OBJECT GuidObject;
228
229 /* Create the GUID object */
230 Status = WmipCreateGuidObject(Guid, &GuidObject);
231 if (!NT_SUCCESS(Status))
232 {
233 DPRINT1("Failed to create GUID object: 0x%lx\n", Status);
234 *OutGuidObject = NULL;
235 return Status;
236 }
237
238 /* Set handle attributes */
240
241 /* Get a handle for the object */
242 Status = ObOpenObjectByPointer(GuidObject,
244 0,
248 OutGuidObjectHandle);
249 if (!NT_SUCCESS(Status))
250 {
251 DPRINT1("ObOpenObjectByPointer failed: 0x%lx\n", Status);
252 ObDereferenceObject(GuidObject);
253 GuidObject = NULL;
254 }
255
256 *OutGuidObject = GuidObject;
257
258 return Status;
259}
260
262NTAPI
267 _Out_ PHANDLE OutGuidObjectHandle,
268 _Outptr_ PVOID *OutGuidObject)
269{
270 static UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\WmiGuid\\");
273 GUID Guid;
274 PAGED_CODE();
275
276 /* Check if we have the expected prefix */
278 {
279 DPRINT1("WMI: Invalid prefix for guid object '%wZ'\n",
280 ObjectAttributes->ObjectName);
282 }
283
284 /* Extract the GUID string */
285 GuidString = *ObjectAttributes->ObjectName;
286 GuidString.Buffer += Prefix.Length / sizeof(WCHAR);
287 GuidString.Length -= Prefix.Length;
288
289 /* Convert the string into a GUID structure */
291 if (!NT_SUCCESS(Status))
292 {
293 DPRINT1("WMI: Invalid uuid format for guid '%wZ'\n", &GuidString);
294 return Status;
295 }
296
297 return WmipOpenGuidObject(&Guid,
300 OutGuidObjectHandle,
301 OutGuidObject);
302}
303
#define PAGED_CODE()
static GENERIC_MAPPING GenericMapping
Definition: SeInheritance.c:11
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define L(x)
Definition: resources.c:13
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION SecurityInformation
Definition: fltkernel.h:1340
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI WmipInitializeGuidObjectType(VOID)
Definition: guidobj.c:114
VOID NTAPI WmipDeleteMethod(_In_ PVOID Object)
Definition: guidobj.c:87
NTSTATUS NTAPI WmipOpenGuidObjectByName(_In_ POBJECT_ATTRIBUTES ObjectAttributes, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode, _Out_ PHANDLE OutGuidObjectHandle, _Outptr_ PVOID *OutGuidObject)
Definition: guidobj.c:263
VOID NTAPI WmipCloseMethod(_In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ ACCESS_MASK GrantedAccess, _In_ ULONG_PTR ProcessHandleCount, _In_ ULONG_PTR SystemHandleCount)
Definition: guidobj.c:102
POBJECT_TYPE WmipGuidObjectType
Definition: guidobj.c:21
NTSTATUS NTAPI WmipOpenGuidObject(_In_ LPCGUID Guid, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode, _Out_ PHANDLE OutGuidObjectHandle, _Outptr_ PVOID *OutGuidObject)
Definition: guidobj.c:218
static NTSTATUS WmipCreateGuidObject(_In_ const GUID *Guid, _Out_ PWMIP_GUID_OBJECT *OutGuidObject)
Definition: guidobj.c:176
static NTSTATUS WmipGUIDFromString(_In_ PUNICODE_STRING GuidString, _Out_ PGUID Guid)
Definition: guidobj.c:150
GENERIC_MAPPING WmipGenericMapping
Definition: guidobj.c:22
NTSTATUS NTAPI WmipSecurityMethod(_In_ PVOID Object, _In_ SECURITY_OPERATION_CODE OperationType, _In_ PSECURITY_INFORMATION SecurityInformation, _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PULONG CapturedLength, _Inout_ PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor, _In_ POOL_TYPE PoolType, _In_ PGENERIC_MAPPING GenericMapping, _In_ KPROCESSOR_MODE AccessMode)
Definition: guidobj.c:35
#define ASSERT(a)
Definition: mode.c:44
static PWSTR GuidString
Definition: apphelp.c:93
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
DWORD * PSECURITY_INFORMATION
Definition: ms-dtyp.idl:311
#define KernelMode
Definition: asm.h:38
_In_ HANDLE _In_opt_ HANDLE _Out_opt_ PHANDLE _In_ ACCESS_MASK _In_ ULONG HandleAttributes
Definition: obfuncs.h:442
#define _Inout_
Definition: no_sal2.h:162
#define _Outptr_
Definition: no_sal2.h:262
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
@ NotificationEvent
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
NTSTATUS NTAPI ObDeassignSecurity(IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor)
Definition: obsecure.c:60
NTSTATUS NTAPI ObAssignObjectSecurityDescriptor(IN PVOID Object, IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, IN POOL_TYPE PoolType)
Definition: obsecure.c:20
NTSTATUS NTAPI ObSetSecurityDescriptorInfo(IN PVOID Object, IN PSECURITY_INFORMATION SecurityInformation, IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping)
Definition: obsecure.c:117
NTSTATUS NTAPI ObQuerySecurityDescriptorInfo(IN PVOID Object, IN PSECURITY_INFORMATION SecurityInformation, OUT PSECURITY_DESCRIPTOR SecurityDescriptor, IN OUT PULONG Length, IN PSECURITY_DESCRIPTOR *OutputSecurityDescriptor)
Definition: obsecure.c:85
NTSTATUS NTAPI ObOpenObjectByPointer(IN PVOID Object, IN ULONG HandleAttributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PHANDLE Handle)
Definition: obhandle.c:2754
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1040
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1137
short WCHAR
Definition: pedump.c:58
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_OPENLINK
Definition: winternl.h:230
#define STATUS_SUCCESS
Definition: shellext.h:65
OB_CLOSE_METHOD CloseProcedure
Definition: obtypes.h:370
OB_SECURITY_METHOD SecurityProcedure
Definition: obtypes.h:373
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:360
OB_DELETE_METHOD DeleteProcedure
Definition: obtypes.h:371
BOOLEAN MaintainHandleCount
Definition: obtypes.h:363
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:367
unsigned short Length
Definition: sprintf.c:451
KEVENT Event
Definition: wmip.h:15
uint32_t * PULONG
Definition: typedefs.h:59
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3821
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
@ ProcessHandleCount
Definition: winternl.h:1902
#define GUID_STRING_LENGTH
Definition: wmip.h:6
struct _WMIP_GUID_OBJECT WMIP_GUID_OBJECT
#define WMIGUID_EXECUTE
Definition: wmistr.h:163
#define WMIGUID_ALL_ACCESS
Definition: wmistr.h:173
#define WMIGUID_QUERY
Definition: wmistr.h:159
#define WMIGUID_SET
Definition: wmistr.h:160
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
#define ObDereferenceObject
Definition: obfuncs.h:203
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1647
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20
SECURITY_OPERATION_CODE
Definition: setypes.h:170