1 /*++
2
3 Copyright (c) Microsoft Corporation. All rights reserved.
4
5 _WdfVersionBuild_
6
7 Module Name:
8
9 WdfWMI.h
10
11 Abstract:
12
13 This is the C interface for WMI support
14
15 Environment:
16
17 kernel mode only
18
19 Revision History:
20
21 --*/
22
23 //
24 // NOTE: This header is generated by stubwork. Please make any
25 // modifications to the corresponding template files
26 // (.x or .y) and use stubwork to regenerate the header
27 //
28
29 #ifndef _WDFWMI_H_
30 #define _WDFWMI_H_
31
32 #ifndef WDF_EXTERN_C
33 #ifdef __cplusplus
34 #define WDF_EXTERN_C extern "C"
35 #define WDF_EXTERN_C_START extern "C" {
36 #define WDF_EXTERN_C_END }
37 #else
38 #define WDF_EXTERN_C
39 #define WDF_EXTERN_C_START
40 #define WDF_EXTERN_C_END
41 #endif
42 #endif
43
44 WDF_EXTERN_C_START
45
46
47
48 #if (NTDDI_VERSION >= NTDDI_WIN2K)
49
50 typedef enum _WDF_WMI_PROVIDER_CONTROL {
51 WdfWmiControlInvalid = 0,
52 WdfWmiEventControl,
53 WdfWmiInstanceControl,
54 } WDF_WMI_PROVIDER_CONTROL;
55
56 //
57 // WdfWmiProviderExpensive:
58 // The provider's operations are expensive in terms of resources
59 //
60 // WdfWmiProviderReadOnly:
61 // The provider is read only. No set or set data item callbacks will be
62 // made on all instances of this provider.
63 //
64 // WdfWmiProviderEventOnly:
65 // Data item is being used to fire events only. It will not receive any
66 // callbacks on it to get / set / execute buffers.
67 //
68 typedef enum _WDF_WMI_PROVIDER_FLAGS {
69 WdfWmiProviderEventOnly = 0x0001,
70 WdfWmiProviderExpensive = 0x0002,
71 WdfWmiProviderTracing = 0x0004,
72 WdfWmiProviderValidFlags = WdfWmiProviderEventOnly | WdfWmiProviderExpensive | WdfWmiProviderTracing,
73 } WDF_WMI_PROVIDER_FLAGS;
74
75
76
77 typedef
78 _Function_class_(EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE)
79 _IRQL_requires_same_
80 _IRQL_requires_max_(PASSIVE_LEVEL)
81 NTSTATUS
82 STDCALL
83 EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE(
84 _In_
85 WDFWMIINSTANCE WmiInstance,
86 _In_
87 ULONG OutBufferSize,
88 _Out_writes_bytes_to_(OutBufferSize, *BufferUsed)
89 PVOID OutBuffer,
90 _Out_
91 PULONG BufferUsed
92 );
93
94 typedef EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE *PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE;
95
96 typedef
97 _Function_class_(EVT_WDF_WMI_INSTANCE_SET_INSTANCE)
98 _IRQL_requires_same_
99 _IRQL_requires_max_(PASSIVE_LEVEL)
100 NTSTATUS
101 STDCALL
102 EVT_WDF_WMI_INSTANCE_SET_INSTANCE(
103 _In_
104 WDFWMIINSTANCE WmiInstance,
105 _In_
106 ULONG InBufferSize,
107 _In_reads_bytes_(InBufferSize)
108 PVOID InBuffer
109 );
110
111 typedef EVT_WDF_WMI_INSTANCE_SET_INSTANCE *PFN_WDF_WMI_INSTANCE_SET_INSTANCE;
112
113 typedef
114 _Function_class_(EVT_WDF_WMI_INSTANCE_SET_ITEM)
115 _IRQL_requires_same_
116 _IRQL_requires_max_(PASSIVE_LEVEL)
117 NTSTATUS
118 STDCALL
119 EVT_WDF_WMI_INSTANCE_SET_ITEM(
120 _In_
121 WDFWMIINSTANCE WmiInstance,
122 _In_
123 ULONG DataItemId,
124 _In_
125 ULONG InBufferSize,
126 _In_reads_bytes_(InBufferSize)
127 PVOID InBuffer
128 );
129
130 typedef EVT_WDF_WMI_INSTANCE_SET_ITEM *PFN_WDF_WMI_INSTANCE_SET_ITEM;
131
132 typedef
133 _Function_class_(EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD)
134 _IRQL_requires_same_
135 _IRQL_requires_max_(PASSIVE_LEVEL)
136 NTSTATUS
137 STDCALL
138 EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD(
139 _In_
140 WDFWMIINSTANCE WmiInstance,
141 _In_
142 ULONG MethodId,
143 _In_
144 ULONG InBufferSize,
145 _In_
146 ULONG OutBufferSize,
147 _When_(InBufferSize >= OutBufferSize, _Inout_updates_bytes_(InBufferSize))
148 _When_(InBufferSize < OutBufferSize, _Inout_updates_bytes_(OutBufferSize))
149 PVOID Buffer,
150 _Out_
151 PULONG BufferUsed
152 );
153
154 typedef EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD *PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD;
155
156 typedef
157 _Function_class_(EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL)
158 _IRQL_requires_same_
159 _IRQL_requires_max_(PASSIVE_LEVEL)
160 NTSTATUS
161 STDCALL
162 EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL(
163 _In_
164 WDFWMIPROVIDER WmiProvider,
165 _In_
166 WDF_WMI_PROVIDER_CONTROL Control,
167 _In_
168 BOOLEAN Enable
169 );
170
171 typedef EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL *PFN_WDF_WMI_PROVIDER_FUNCTION_CONTROL;
172
173 typedef struct _WDF_WMI_PROVIDER_CONFIG {
174 //
175 // Size of this structure in bytes
176 //
177 ULONG Size;
178
179 //
180 // The GUID being registered
181 //
182 GUID Guid;
183
184 //
185 // Combination of values from the enum WDF_WMI_PROVIDER_FLAGS
186 //
187 ULONG Flags;
188
189 //
190 // Minimum expected buffer size for query and set instance requests.
191 // Ignored if WdfWmiProviderEventOnly is set in Flags.
192 //
193 ULONG MinInstanceBufferSize;
194
195 //
196 // Callback when caller is opening a provider which ha been marked as
197 // expensive or when a caller is interested in events.
198 //
199 PFN_WDF_WMI_PROVIDER_FUNCTION_CONTROL EvtWmiProviderFunctionControl;
200
201 } WDF_WMI_PROVIDER_CONFIG, *PWDF_WMI_PROVIDER_CONFIG;
202
203 FORCEINLINE
204 VOID
WDF_WMI_PROVIDER_CONFIG_INIT(_Out_ PWDF_WMI_PROVIDER_CONFIG Config,_In_ CONST GUID * Guid)205 WDF_WMI_PROVIDER_CONFIG_INIT(
206 _Out_ PWDF_WMI_PROVIDER_CONFIG Config,
207 _In_ CONST GUID* Guid
208 )
209 {
210 RtlZeroMemory(Config, sizeof(WDF_WMI_PROVIDER_CONFIG));
211
212 Config->Size = sizeof(WDF_WMI_PROVIDER_CONFIG);
213 RtlCopyMemory(&Config->Guid, Guid, sizeof(GUID));
214 }
215
216 typedef struct _WDF_WMI_INSTANCE_CONFIG {
217 //
218 // Size of the structure in bytes
219 //
220 ULONG Size;
221
222 //
223 // Optional parameter. If NULL, ProviderConfig must be set to a valid pointer
224 // value. If specified, indicates the provider to create an instance for.
225 //
226 WDFWMIPROVIDER Provider;
227
228 //
229 // Optional parameter. If NULL, Provider must be set to a valid handle
230 // value. If specifeid, indicates the configuration for a provider to be
231 // created and for this instance to be associated with.
232 //
233 PWDF_WMI_PROVIDER_CONFIG ProviderConfig;
234
235 //
236 // If the Provider is configured as read only and this field is set to TRUE,
237 // the EvtWmiInstanceQueryInstance is ignored and WDF will blindly copy the
238 // context associated with this instance (using RtlCopyMemory, with no locks
239 // held) into the query buffer.
240 //
241 BOOLEAN UseContextForQuery;
242
243 //
244 // If TRUE, the instance will be registered as well as created.
245 //
246 BOOLEAN Register;
247
248 //
249 // Callback when caller wants to query the entire data item's buffer.
250 //
251 PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE EvtWmiInstanceQueryInstance;
252
253 //
254 // Callback when caller wants to set the entire data item's buffer.
255 //
256 PFN_WDF_WMI_INSTANCE_SET_INSTANCE EvtWmiInstanceSetInstance;
257
258 //
259 // Callback when caller wants to set a single field in the data item's buffer
260 //
261 PFN_WDF_WMI_INSTANCE_SET_ITEM EvtWmiInstanceSetItem;
262
263 //
264 // Callback when caller wants to execute a method on the data item.
265 //
266 PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD EvtWmiInstanceExecuteMethod;
267
268 } WDF_WMI_INSTANCE_CONFIG, *PWDF_WMI_INSTANCE_CONFIG;
269
270
271 FORCEINLINE
272 VOID
WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER(_Out_ PWDF_WMI_INSTANCE_CONFIG Config,_In_ WDFWMIPROVIDER Provider)273 WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER(
274 _Out_ PWDF_WMI_INSTANCE_CONFIG Config,
275 _In_ WDFWMIPROVIDER Provider
276 )
277 {
278 RtlZeroMemory(Config, sizeof(WDF_WMI_INSTANCE_CONFIG));
279 Config->Size = sizeof(WDF_WMI_INSTANCE_CONFIG);
280
281 Config->Provider = Provider;
282 }
283
284 FORCEINLINE
285 VOID
WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(_Out_ PWDF_WMI_INSTANCE_CONFIG Config,_In_ PWDF_WMI_PROVIDER_CONFIG ProviderConfig)286 WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(
287 _Out_ PWDF_WMI_INSTANCE_CONFIG Config,
288 _In_ PWDF_WMI_PROVIDER_CONFIG ProviderConfig
289 )
290 {
291 RtlZeroMemory(Config, sizeof(WDF_WMI_INSTANCE_CONFIG));
292 Config->Size = sizeof(WDF_WMI_INSTANCE_CONFIG);
293
294 Config->ProviderConfig = ProviderConfig;
295 }
296
297 FORCEINLINE
298 NTSTATUS
WDF_WMI_BUFFER_APPEND_STRING(_Out_writes_bytes_ (BufferLength)PVOID Buffer,_In_ ULONG BufferLength,_In_ PCUNICODE_STRING String,_Out_ PULONG RequiredSize)299 WDF_WMI_BUFFER_APPEND_STRING(
300 _Out_writes_bytes_(BufferLength) PVOID Buffer,
301 _In_ ULONG BufferLength,
302 _In_ PCUNICODE_STRING String,
303 _Out_ PULONG RequiredSize
304 )
305 {
306 //
307 // Compute the length of buffer we need to use. Upon error the caller can
308 // use this length to report the required length. On success, the caller
309 // can use this length to know how many bytes were written.
310 //
311 *RequiredSize = String->Length + sizeof(USHORT);
312
313 //
314 // UNICODE_STRING.Length is the length of the string in bytes, not characters
315 //
316
317 // First check to see if there is enough space
318 // 1) to store the length of the string
319 // 2) to store the string itself
320 //
321 if (BufferLength < (String->Length + sizeof(USHORT))) {
322 //
323 // Not enough room in the string, report back how big a buffer is
324 // required.
325 //
326 return STATUS_BUFFER_TOO_SMALL;
327 }
328
329 //
330 // Store the length of the string
331 //
332 *(USHORT *) Buffer = String->Length;
333
334 //
335 // Copy the string to the buffer
336 //
337 RtlCopyMemory(WDF_PTR_ADD_OFFSET(Buffer, sizeof(USHORT)),
338 String->Buffer,
339 String->Length);
340
341 return STATUS_SUCCESS;
342 }
343
344 //
345 // WDF Function: WdfWmiProviderCreate
346 //
347 typedef
348 _Must_inspect_result_
349 _IRQL_requires_max_(DISPATCH_LEVEL)
350 WDFAPI
351 NTSTATUS
352 (STDCALL *PFN_WDFWMIPROVIDERCREATE)(
353 _In_
354 PWDF_DRIVER_GLOBALS DriverGlobals,
355 _In_
356 WDFDEVICE Device,
357 _In_
358 PWDF_WMI_PROVIDER_CONFIG WmiProviderConfig,
359 _In_opt_
360 PWDF_OBJECT_ATTRIBUTES ProviderAttributes,
361 _Out_
362 WDFWMIPROVIDER* WmiProvider
363 );
364
365 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)366 _IRQL_requires_max_(DISPATCH_LEVEL)
367 FORCEINLINE
368 NTSTATUS
369 WdfWmiProviderCreate(
370 _In_
371 WDFDEVICE Device,
372 _In_
373 PWDF_WMI_PROVIDER_CONFIG WmiProviderConfig,
374 _In_opt_
375 PWDF_OBJECT_ATTRIBUTES ProviderAttributes,
376 _Out_
377 WDFWMIPROVIDER* WmiProvider
378 )
379 {
380 return ((PFN_WDFWMIPROVIDERCREATE) WdfFunctions[WdfWmiProviderCreateTableIndex])(WdfDriverGlobals, Device, WmiProviderConfig, ProviderAttributes, WmiProvider);
381 }
382
383 //
384 // WDF Function: WdfWmiProviderGetDevice
385 //
386 typedef
387 _IRQL_requires_max_(DISPATCH_LEVEL)
388 WDFAPI
389 WDFDEVICE
390 (STDCALL *PFN_WDFWMIPROVIDERGETDEVICE)(
391 _In_
392 PWDF_DRIVER_GLOBALS DriverGlobals,
393 _In_
394 WDFWMIPROVIDER WmiProvider
395 );
396
_IRQL_requires_max_(DISPATCH_LEVEL)397 _IRQL_requires_max_(DISPATCH_LEVEL)
398 FORCEINLINE
399 WDFDEVICE
400 WdfWmiProviderGetDevice(
401 _In_
402 WDFWMIPROVIDER WmiProvider
403 )
404 {
405 return ((PFN_WDFWMIPROVIDERGETDEVICE) WdfFunctions[WdfWmiProviderGetDeviceTableIndex])(WdfDriverGlobals, WmiProvider);
406 }
407
408 //
409 // WDF Function: WdfWmiProviderIsEnabled
410 //
411 typedef
412 _IRQL_requires_max_(DISPATCH_LEVEL)
413 WDFAPI
414 BOOLEAN
415 (STDCALL *PFN_WDFWMIPROVIDERISENABLED)(
416 _In_
417 PWDF_DRIVER_GLOBALS DriverGlobals,
418 _In_
419 WDFWMIPROVIDER WmiProvider,
420 _In_
421 WDF_WMI_PROVIDER_CONTROL ProviderControl
422 );
423
_IRQL_requires_max_(DISPATCH_LEVEL)424 _IRQL_requires_max_(DISPATCH_LEVEL)
425 FORCEINLINE
426 BOOLEAN
427 WdfWmiProviderIsEnabled(
428 _In_
429 WDFWMIPROVIDER WmiProvider,
430 _In_
431 WDF_WMI_PROVIDER_CONTROL ProviderControl
432 )
433 {
434 return ((PFN_WDFWMIPROVIDERISENABLED) WdfFunctions[WdfWmiProviderIsEnabledTableIndex])(WdfDriverGlobals, WmiProvider, ProviderControl);
435 }
436
437 //
438 // WDF Function: WdfWmiProviderGetTracingHandle
439 //
440 typedef
441 _IRQL_requires_max_(DISPATCH_LEVEL)
442 WDFAPI
443 ULONGLONG
444 (STDCALL *PFN_WDFWMIPROVIDERGETTRACINGHANDLE)(
445 _In_
446 PWDF_DRIVER_GLOBALS DriverGlobals,
447 _In_
448 WDFWMIPROVIDER WmiProvider
449 );
450
_IRQL_requires_max_(DISPATCH_LEVEL)451 _IRQL_requires_max_(DISPATCH_LEVEL)
452 FORCEINLINE
453 ULONGLONG
454 WdfWmiProviderGetTracingHandle(
455 _In_
456 WDFWMIPROVIDER WmiProvider
457 )
458 {
459 return ((PFN_WDFWMIPROVIDERGETTRACINGHANDLE) WdfFunctions[WdfWmiProviderGetTracingHandleTableIndex])(WdfDriverGlobals, WmiProvider);
460 }
461
462 //
463 // WDF Function: WdfWmiInstanceCreate
464 //
465 typedef
466 _Must_inspect_result_
467 _IRQL_requires_max_(DISPATCH_LEVEL)
468 WDFAPI
469 NTSTATUS
470 (STDCALL *PFN_WDFWMIINSTANCECREATE)(
471 _In_
472 PWDF_DRIVER_GLOBALS DriverGlobals,
473 _In_
474 WDFDEVICE Device,
475 _In_
476 PWDF_WMI_INSTANCE_CONFIG InstanceConfig,
477 _In_opt_
478 PWDF_OBJECT_ATTRIBUTES InstanceAttributes,
479 _Out_opt_
480 WDFWMIINSTANCE* Instance
481 );
482
483 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)484 _IRQL_requires_max_(DISPATCH_LEVEL)
485 FORCEINLINE
486 NTSTATUS
487 WdfWmiInstanceCreate(
488 _In_
489 WDFDEVICE Device,
490 _In_
491 PWDF_WMI_INSTANCE_CONFIG InstanceConfig,
492 _In_opt_
493 PWDF_OBJECT_ATTRIBUTES InstanceAttributes,
494 _Out_opt_
495 WDFWMIINSTANCE* Instance
496 )
497 {
498 return ((PFN_WDFWMIINSTANCECREATE) WdfFunctions[WdfWmiInstanceCreateTableIndex])(WdfDriverGlobals, Device, InstanceConfig, InstanceAttributes, Instance);
499 }
500
501 //
502 // WDF Function: WdfWmiInstanceRegister
503 //
504 typedef
505 _Must_inspect_result_
506 _IRQL_requires_max_(PASSIVE_LEVEL)
507 WDFAPI
508 NTSTATUS
509 (STDCALL *PFN_WDFWMIINSTANCEREGISTER)(
510 _In_
511 PWDF_DRIVER_GLOBALS DriverGlobals,
512 _In_
513 WDFWMIINSTANCE WmiInstance
514 );
515
516 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)517 _IRQL_requires_max_(PASSIVE_LEVEL)
518 FORCEINLINE
519 NTSTATUS
520 WdfWmiInstanceRegister(
521 _In_
522 WDFWMIINSTANCE WmiInstance
523 )
524 {
525 return ((PFN_WDFWMIINSTANCEREGISTER) WdfFunctions[WdfWmiInstanceRegisterTableIndex])(WdfDriverGlobals, WmiInstance);
526 }
527
528 //
529 // WDF Function: WdfWmiInstanceDeregister
530 //
531 typedef
532 _IRQL_requires_max_(PASSIVE_LEVEL)
533 WDFAPI
534 VOID
535 (STDCALL *PFN_WDFWMIINSTANCEDEREGISTER)(
536 _In_
537 PWDF_DRIVER_GLOBALS DriverGlobals,
538 _In_
539 WDFWMIINSTANCE WmiInstance
540 );
541
_IRQL_requires_max_(PASSIVE_LEVEL)542 _IRQL_requires_max_(PASSIVE_LEVEL)
543 FORCEINLINE
544 VOID
545 WdfWmiInstanceDeregister(
546 _In_
547 WDFWMIINSTANCE WmiInstance
548 )
549 {
550 ((PFN_WDFWMIINSTANCEDEREGISTER) WdfFunctions[WdfWmiInstanceDeregisterTableIndex])(WdfDriverGlobals, WmiInstance);
551 }
552
553 //
554 // WDF Function: WdfWmiInstanceGetDevice
555 //
556 typedef
557 _IRQL_requires_max_(DISPATCH_LEVEL)
558 WDFAPI
559 WDFDEVICE
560 (STDCALL *PFN_WDFWMIINSTANCEGETDEVICE)(
561 _In_
562 PWDF_DRIVER_GLOBALS DriverGlobals,
563 _In_
564 WDFWMIINSTANCE WmiInstance
565 );
566
_IRQL_requires_max_(DISPATCH_LEVEL)567 _IRQL_requires_max_(DISPATCH_LEVEL)
568 FORCEINLINE
569 WDFDEVICE
570 WdfWmiInstanceGetDevice(
571 _In_
572 WDFWMIINSTANCE WmiInstance
573 )
574 {
575 return ((PFN_WDFWMIINSTANCEGETDEVICE) WdfFunctions[WdfWmiInstanceGetDeviceTableIndex])(WdfDriverGlobals, WmiInstance);
576 }
577
578 //
579 // WDF Function: WdfWmiInstanceGetProvider
580 //
581 typedef
582 _IRQL_requires_max_(DISPATCH_LEVEL)
583 WDFAPI
584 WDFWMIPROVIDER
585 (STDCALL *PFN_WDFWMIINSTANCEGETPROVIDER)(
586 _In_
587 PWDF_DRIVER_GLOBALS DriverGlobals,
588 _In_
589 WDFWMIINSTANCE WmiInstance
590 );
591
_IRQL_requires_max_(DISPATCH_LEVEL)592 _IRQL_requires_max_(DISPATCH_LEVEL)
593 FORCEINLINE
594 WDFWMIPROVIDER
595 WdfWmiInstanceGetProvider(
596 _In_
597 WDFWMIINSTANCE WmiInstance
598 )
599 {
600 return ((PFN_WDFWMIINSTANCEGETPROVIDER) WdfFunctions[WdfWmiInstanceGetProviderTableIndex])(WdfDriverGlobals, WmiInstance);
601 }
602
603 //
604 // WDF Function: WdfWmiInstanceFireEvent
605 //
606 typedef
607 _Must_inspect_result_
608 _IRQL_requires_max_(APC_LEVEL)
609 WDFAPI
610 NTSTATUS
611 (STDCALL *PFN_WDFWMIINSTANCEFIREEVENT)(
612 _In_
613 PWDF_DRIVER_GLOBALS DriverGlobals,
614 _In_
615 WDFWMIINSTANCE WmiInstance,
616 _In_opt_
617 ULONG EventDataSize,
618 _In_reads_bytes_opt_(EventDataSize)
619 PVOID EventData
620 );
621
622 _Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)623 _IRQL_requires_max_(APC_LEVEL)
624 FORCEINLINE
625 NTSTATUS
626 WdfWmiInstanceFireEvent(
627 _In_
628 WDFWMIINSTANCE WmiInstance,
629 _In_opt_
630 ULONG EventDataSize,
631 _In_reads_bytes_opt_(EventDataSize)
632 PVOID EventData
633 )
634 {
635 return ((PFN_WDFWMIINSTANCEFIREEVENT) WdfFunctions[WdfWmiInstanceFireEventTableIndex])(WdfDriverGlobals, WmiInstance, EventDataSize, EventData);
636 }
637
638
639
640 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
641
642
643
644 WDF_EXTERN_C_END
645
646 #endif // _WDFWMI_H_
647
648