ReactOS 0.4.16-dev-306-g647d351
guidobj.c File Reference
#include <ntoskrnl.h>
#include <wmistr.h>
#include "wmip.h"
#include <debug.h>
Include dependency graph for guidobj.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

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)
 
VOID NTAPI WmipDeleteMethod (_In_ PVOID Object)
 
VOID NTAPI WmipCloseMethod (_In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ ACCESS_MASK GrantedAccess, _In_ ULONG ProcessHandleCount, _In_ ULONG SystemHandleCount)
 
NTSTATUS NTAPI WmipInitializeGuidObjectType (VOID)
 
static NTSTATUS WmipGUIDFromString (_In_ PUNICODE_STRING GuidString, _Out_ PGUID Guid)
 
static NTSTATUS WmipCreateGuidObject (_In_ const GUID *Guid, _Out_ PWMIP_GUID_OBJECT *OutGuidObject)
 
NTSTATUS NTAPI WmipOpenGuidObject (_In_ LPCGUID Guid, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode, _Out_ PHANDLE OutGuidObjectHandle, _Outptr_ PVOID *OutGuidObject)
 
NTSTATUS NTAPI WmipOpenGuidObjectByName (_In_ POBJECT_ATTRIBUTES ObjectAttributes, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode, _Out_ PHANDLE OutGuidObjectHandle, _Outptr_ PVOID *OutGuidObject)
 

Variables

POBJECT_TYPE WmipGuidObjectType
 
GENERIC_MAPPING WmipGenericMapping
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 15 of file guidobj.c.

Function Documentation

◆ WmipCloseMethod()

VOID NTAPI WmipCloseMethod ( _In_opt_ PEPROCESS  Process,
_In_ PVOID  Object,
_In_ ACCESS_MASK  GrantedAccess,
_In_ ULONG  ProcessHandleCount,
_In_ ULONG  SystemHandleCount 
)

Definition at line 101 of file guidobj.c.

107{
108 /* For now nothing */
109}

Referenced by WmipInitializeGuidObjectType().

◆ WmipCreateGuidObject()

static NTSTATUS WmipCreateGuidObject ( _In_ const GUID Guid,
_Out_ PWMIP_GUID_OBJECT OutGuidObject 
)
static

Definition at line 175 of file guidobj.c.

178{
180 PWMIP_GUID_OBJECT GuidObject;
182
183 /* Initialize object attributes for an unnamed object */
185 NULL,
186 0,
187 NULL,
188 NULL); // FIXME: security descriptor!
189
190 /* Create the GUID object */
195 NULL,
196 sizeof(WMIP_GUID_OBJECT),
197 0,
198 0,
199 (PVOID*)&GuidObject);
200 if (!NT_SUCCESS(Status))
201 {
202 DPRINT1("WMI: failed to create GUID object: 0x%lx\n", Status);
203 return Status;
204 }
205
206 RtlZeroMemory(GuidObject, sizeof(*GuidObject));
208 GuidObject->Guid = *Guid;
209
210 *OutGuidObject = GuidObject;
211
212 return STATUS_SUCCESS;
213}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
Status
Definition: gdiplustypes.h:25
POBJECT_TYPE WmipGuidObjectType
Definition: guidobj.c:21
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define KernelMode
Definition: asm.h:34
@ NotificationEvent
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:1039
#define STATUS_SUCCESS
Definition: shellext.h:65
KEVENT Event
Definition: wmip.h:15
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762

Referenced by WmipOpenGuidObject().

◆ WmipDeleteMethod()

VOID NTAPI WmipDeleteMethod ( _In_ PVOID  Object)

Definition at line 86 of file guidobj.c.

88{
89 PWMIP_GUID_OBJECT GuidObject = Object;
90
91 /* Check if the object is attached to an IRP */
92 if (GuidObject->Irp != NULL)
93 {
94 /* This is not supported yet */
96 }
97}
#define ASSERT(a)
Definition: mode.c:44
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object

Referenced by WmipInitializeGuidObjectType().

◆ WmipGUIDFromString()

static NTSTATUS WmipGUIDFromString ( _In_ PUNICODE_STRING  GuidString,
_Out_ PGUID  Guid 
)
static

Definition at line 149 of file guidobj.c.

152{
155
156 /* Validate string length */
157 if (GuidString->Length != GUID_STRING_LENGTH * sizeof(WCHAR))
158 {
160 }
161
162 /* Copy the string and wrap it in {} */
163 RtlCopyMemory(&Buffer[1], GuidString->Buffer, GuidString->Length);
164 Buffer[0] = L'{';
165 Buffer[GUID_STRING_LENGTH + 1] = L'}';
166
167 String.Buffer = Buffer;
168 String.Length = String.MaximumLength = sizeof(Buffer);
169
170 return RtlGUIDFromString(&String, Guid);
171}
Definition: bufpool.h:45
NTSYSAPI NTSTATUS WINAPI RtlGUIDFromString(PUNICODE_STRING, GUID *)
static PWSTR GuidString
Definition: apphelp.c:93
#define L(x)
Definition: ntvdm.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433
#define GUID_STRING_LENGTH
Definition: wmip.h:6
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by WmipOpenGuidObjectByName().

◆ WmipInitializeGuidObjectType()

NTSTATUS NTAPI WmipInitializeGuidObjectType ( VOID  )

Definition at line 113 of file guidobj.c.

115{
116 static UNICODE_STRING GuidObjectName = RTL_CONSTANT_STRING(L"WmiGuid");
117 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
119
120 /* Setup the object type initializer */
121 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
122 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
123 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
124 ObjectTypeInitializer.GenericMapping = WmipGenericMapping;
125 ObjectTypeInitializer.PoolType = NonPagedPool;
126 ObjectTypeInitializer.MaintainHandleCount = FALSE;
127 ObjectTypeInitializer.ValidAccessMask = STANDARD_RIGHTS_ALL | 0xFFF;
128 ObjectTypeInitializer.SecurityRequired = TRUE;
129 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(WMIP_GUID_OBJECT);
130 ObjectTypeInitializer.SecurityProcedure = WmipSecurityMethod;
131 ObjectTypeInitializer.DeleteProcedure = WmipDeleteMethod;
132 ObjectTypeInitializer.CloseProcedure = WmipCloseMethod;
133
134 /* Create the object type */
135 Status = ObCreateObjectType(&GuidObjectName,
136 &ObjectTypeInitializer,
137 0,
139 if (!NT_SUCCESS(Status))
140 {
141 DPRINT1("ObCreateObjectType failed: 0x%lx\n", Status);
142 }
143
144 return Status;
145}
#define TRUE
Definition: types.h:120
#define NonPagedPool
Definition: env_spec_w32.h:307
VOID NTAPI WmipDeleteMethod(_In_ PVOID Object)
Definition: guidobj.c:86
VOID NTAPI WmipCloseMethod(_In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ ACCESS_MASK GrantedAccess, _In_ ULONG ProcessHandleCount, _In_ ULONG SystemHandleCount)
Definition: guidobj.c:101
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)
Definition: guidobj.c:35
#define OBJ_OPENLINK
Definition: winternl.h:230
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1136
OB_CLOSE_METHOD CloseProcedure
Definition: obtypes.h:368
OB_SECURITY_METHOD SecurityProcedure
Definition: obtypes.h:371
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:358
OB_DELETE_METHOD DeleteProcedure
Definition: obtypes.h:369
BOOLEAN MaintainHandleCount
Definition: obtypes.h:361
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:365
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
struct _WMIP_GUID_OBJECT WMIP_GUID_OBJECT

Referenced by WmiInitialize().

◆ WmipOpenGuidObject()

NTSTATUS NTAPI WmipOpenGuidObject ( _In_ LPCGUID  Guid,
_In_ ACCESS_MASK  DesiredAccess,
_In_ KPROCESSOR_MODE  AccessMode,
_Out_ PHANDLE  OutGuidObjectHandle,
_Outptr_ PVOID OutGuidObject 
)

Definition at line 217 of file guidobj.c.

223{
224 PWMIP_GUID_OBJECT GuidObject;
227
228 /* Create the GUID object */
229 Status = WmipCreateGuidObject(Guid, &GuidObject);
230 if (!NT_SUCCESS(Status))
231 {
232 DPRINT1("Failed to create GUID object: 0x%lx\n", Status);
233 *OutGuidObject = NULL;
234 return Status;
235 }
236
237 /* Set handle attributes */
239
240 /* Get a handle for the object */
241 Status = ObOpenObjectByPointer(GuidObject,
243 0,
247 OutGuidObjectHandle);
248 if (!NT_SUCCESS(Status))
249 {
250 DPRINT1("ObOpenObjectByPointer failed: 0x%lx\n", Status);
251 ObDereferenceObject(GuidObject);
252 GuidObject = NULL;
253 }
254
255 *OutGuidObject = GuidObject;
256
257 return Status;
258}
static NTSTATUS WmipCreateGuidObject(_In_ const GUID *Guid, _Out_ PWMIP_GUID_OBJECT *OutGuidObject)
Definition: guidobj.c:175
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
_In_ HANDLE _In_opt_ HANDLE _Out_opt_ PHANDLE _In_ ACCESS_MASK _In_ ULONG HandleAttributes
Definition: obfuncs.h:433
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:2742
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2658
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by IoWMIOpenBlock(), and WmipOpenGuidObjectByName().

◆ WmipOpenGuidObjectByName()

NTSTATUS NTAPI WmipOpenGuidObjectByName ( _In_ POBJECT_ATTRIBUTES  ObjectAttributes,
_In_ ACCESS_MASK  DesiredAccess,
_In_ KPROCESSOR_MODE  AccessMode,
_Out_ PHANDLE  OutGuidObjectHandle,
_Outptr_ PVOID OutGuidObject 
)

Definition at line 262 of file guidobj.c.

268{
269 static UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\WmiGuid\\");
272 GUID Guid;
273 PAGED_CODE();
274
275 /* Check if we have the expected prefix */
277 {
278 DPRINT1("WMI: Invalid prefix for guid object '%wZ'\n",
279 ObjectAttributes->ObjectName);
281 }
282
283 /* Extract the GUID string */
284 GuidString = *ObjectAttributes->ObjectName;
285 GuidString.Buffer += Prefix.Length / sizeof(WCHAR);
286 GuidString.Length -= Prefix.Length;
287
288 /* Convert the string into a GUID structure */
290 if (!NT_SUCCESS(Status))
291 {
292 DPRINT1("WMI: Invalid uuid format for guid '%wZ'\n", &GuidString);
293 return Status;
294 }
295
296 return WmipOpenGuidObject(&Guid,
299 OutGuidObjectHandle,
300 OutGuidObject);
301}
#define PAGED_CODE()
NTSTATUS NTAPI WmipOpenGuidObject(_In_ LPCGUID Guid, _In_ ACCESS_MASK DesiredAccess, _In_ KPROCESSOR_MODE AccessMode, _Out_ PHANDLE OutGuidObjectHandle, _Outptr_ PVOID *OutGuidObject)
Definition: guidobj.c:217
static NTSTATUS WmipGUIDFromString(_In_ PUNICODE_STRING GuidString, _Out_ PGUID Guid)
Definition: guidobj.c:149
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
unsigned short Length
Definition: sprintf.c:451
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1647

Referenced by WmipOpenGuidForEvents(), and WmipRegisterGuids().

◆ WmipSecurityMethod()

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 
)

Definition at line 35 of file guidobj.c.

44{
45 PAGED_CODE();
46
48 ASSERT((OperationType == QuerySecurityDescriptor) ||
49 (OperationType == SetSecurityDescriptor) ||
50 (OperationType == AssignSecurityDescriptor) ||
51 (OperationType == DeleteSecurityDescriptor));
52
53 if (OperationType == QuerySecurityDescriptor)
54 {
58 CapturedLength,
59 ObjectSecurityDescriptor);
60 }
61 else if (OperationType == SetSecurityDescriptor)
62 {
66 ObjectSecurityDescriptor,
69 }
70 else if (OperationType == AssignSecurityDescriptor)
71 {
73 return STATUS_SUCCESS;
74 }
75 else if (OperationType == DeleteSecurityDescriptor)
76 {
77 return ObDeassignSecurity(ObjectSecurityDescriptor);
78 }
79
82}
static GENERIC_MAPPING GenericMapping
Definition: SeInheritance.c:11
#define PagedPool
Definition: env_spec_w32.h:308
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ SECURITY_INFORMATION SecurityInformation
Definition: fltkernel.h:1340
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
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_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

Referenced by WmipInitializeGuidObjectType().

Variable Documentation

◆ WmipGenericMapping

GENERIC_MAPPING WmipGenericMapping
Initial value:
=
{
}
#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

Definition at line 22 of file guidobj.c.

Referenced by WmipInitializeGuidObjectType().

◆ WmipGuidObjectType

POBJECT_TYPE WmipGuidObjectType