2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/io/wmidrv.c
5 * PURPOSE: I/O Windows Management Instrumentation (WMI) Support
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
9 /* INCLUDES *****************************************************************/
20 /* GLOBALS ******************************************************************/
22 POBJECT_TYPE WmipGuidObjectType
;
23 GENERIC_MAPPING WmipGenericMapping
;
26 /* FUNCTIONS *****************************************************************/
32 _In_ SECURITY_OPERATION_CODE OperationType
,
33 _In_ PSECURITY_INFORMATION SecurityInformation
,
34 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor
,
35 _Inout_ PULONG CapturedLength
,
36 _Inout_ PSECURITY_DESCRIPTOR
*ObjectSecurityDescriptor
,
37 _In_ POOL_TYPE PoolType
,
38 _In_ PGENERIC_MAPPING GenericMapping
)
40 UNIMPLEMENTED_DBGBREAK();
41 return STATUS_NOT_IMPLEMENTED
;
49 UNIMPLEMENTED_DBGBREAK();
55 _In_opt_ PEPROCESS Process
,
57 _In_ ACCESS_MASK GrantedAccess
,
58 _In_ ULONG ProcessHandleCount
,
59 _In_ ULONG SystemHandleCount
)
61 UNIMPLEMENTED_DBGBREAK();
66 WmipInitializeGuidObjectType(
69 static UNICODE_STRING GuidObjectName
= RTL_CONSTANT_STRING(L
"WmiGuid");
70 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer
;
73 /* Setup the object type initializer */
74 RtlZeroMemory(&ObjectTypeInitializer
, sizeof(ObjectTypeInitializer
));
75 ObjectTypeInitializer
.Length
= sizeof(ObjectTypeInitializer
);
76 ObjectTypeInitializer
.InvalidAttributes
= OBJ_OPENLINK
;
77 ObjectTypeInitializer
.GenericMapping
= WmipGenericMapping
;
78 ObjectTypeInitializer
.PoolType
= NonPagedPool
;
79 ObjectTypeInitializer
.MaintainHandleCount
= FALSE
;
80 ObjectTypeInitializer
.ValidAccessMask
= STANDARD_RIGHTS_ALL
| 0xFFF;
81 ObjectTypeInitializer
.SecurityRequired
= TRUE
;
82 ObjectTypeInitializer
.DefaultNonPagedPoolCharge
= sizeof(WMIP_GUID_OBJECT
);;
83 ObjectTypeInitializer
.SecurityProcedure
= WmipSecurityMethod
;
84 ObjectTypeInitializer
.DeleteProcedure
= WmipDeleteMethod
;
85 ObjectTypeInitializer
.CloseProcedure
= WmipCloseMethod
;
87 /* Create the object type */
88 Status
= ObCreateObjectType(&GuidObjectName
,
89 &ObjectTypeInitializer
,
92 if (!NT_SUCCESS(Status
))
94 DPRINT1("ObCreateObjectType failed: 0x%lx\n", Status
);
102 WmipCreateGuidObject(
103 _In_ PUNICODE_STRING GuidString
,
104 _Out_ PWMIP_GUID_OBJECT
*OutGuidObject
)
106 OBJECT_ATTRIBUTES ObjectAttributes
;
108 PWMIP_GUID_OBJECT GuidObject
;
111 /* Convert the string into a GUID structure */
112 Status
= RtlGUIDFromString(GuidString
, &Guid
);
113 if (!NT_SUCCESS(Status
))
115 DPRINT1("WMI: Invalid uuid format for guid '%wZ'\n", GuidString
);
119 /* Initialize object attributes for an unnamed object */
120 InitializeObjectAttributes(&ObjectAttributes
,
124 NULL
); // FIXME: security descriptor!
126 /* Create the GUID object */
127 Status
= ObCreateObject(KernelMode
,
132 sizeof(WMIP_GUID_OBJECT
),
135 (PVOID
*)&GuidObject
);
136 if (!NT_SUCCESS(Status
))
138 DPRINT1("WMI: failed to create GUID object: 0x%lx\n", Status
);
142 GuidObject
->Guid
= Guid
;
144 *OutGuidObject
= GuidObject
;
146 return STATUS_SUCCESS
;
152 POBJECT_ATTRIBUTES ObjectAttributes
,
153 ACCESS_MASK DesiredAccess
,
154 KPROCESSOR_MODE AccessMode
,
155 PHANDLE OutGuidObjectHandle
,
156 PVOID
*OutGuidObject
)
158 static UNICODE_STRING Prefix
= RTL_CONSTANT_STRING(L
"\\WmiGuid\\");
159 UNICODE_STRING GuidString
;
160 ULONG HandleAttributes
;
161 PWMIP_GUID_OBJECT GuidObject
;
165 /* Check if we have the expected prefix */
166 if (!RtlPrefixUnicodeString(ObjectAttributes
->ObjectName
, &Prefix
, FALSE
))
168 DPRINT1("WMI: Invalid prefix for guid object '%wZ'\n",
169 ObjectAttributes
->ObjectName
);
170 return STATUS_INVALID_PARAMETER
;
173 /* Extract the GUID string */
174 GuidString
= *ObjectAttributes
->ObjectName
;
175 GuidString
.Buffer
+= Prefix
.Length
/ sizeof(WCHAR
);
176 GuidString
.Length
-= Prefix
.Length
;
178 /* Create the GUID object */
179 Status
= WmipCreateGuidObject(&GuidString
, &GuidObject
);
180 if (!NT_SUCCESS(Status
))
182 DPRINT1("Failed to create GUID object: 0x%lx\n", Status
);
186 /* Set handle attributes */
187 HandleAttributes
= (AccessMode
== KernelMode
) ? OBJ_KERNEL_HANDLE
: 0;
189 /* Get a handle for the object */
190 Status
= ObOpenObjectByPointer(GuidObject
,
196 OutGuidObjectHandle
);
197 if (!NT_SUCCESS(Status
))
199 DPRINT1("ObOpenObjectByPointer failed: 0x%lx\n", Status
);
200 ObfDereferenceObject(GuidObject
);
203 *OutGuidObject
= GuidObject
;