ReactOS  0.4.15-dev-3439-g2693a26
FxWmiProvider Class Reference

#include <fxwmiprovider.hpp>

Inheritance diagram for FxWmiProvider:
Collaboration diagram for FxWmiProvider:

Public Member Functions

 FxWmiProvider (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_WMI_PROVIDER_CONFIG Config, __in CfxDevice *Device)
 
 ~FxWmiProvider ()
 
CfxDeviceGetDevice (VOID)
 
GUIDGetGUID (VOID)
 
ULONG GetFlags (VOID)
 
ULONG GetMinInstanceBufferSize (VOID)
 
ULONG GetRegistrationFlagsLocked (VOID)
 
BOOLEAN IsEventOnly (VOID)
 
BOOLEAN IsEnabled (__in WDF_WMI_PROVIDER_CONTROL Control)
 
ULONGLONG GetTracingHandle (VOID)
 
VOID SetTracingHandle (__in ULONGLONG TracingHandle)
 
WDFWMIPROVIDER GetHandle (VOID)
 
BOOLEAN IsFunctionControlSupported (VOID)
 
_Must_inspect_result_ NTSTATUS FunctionControl (__in WDF_WMI_PROVIDER_CONTROL Control, __in BOOLEAN Enable)
 
_Must_inspect_result_ NTSTATUS AddInstance (__in FxWmiInstance *Instance, __in BOOLEAN NoErrorIfPresent=FALSE)
 
VOID RemoveInstance (__in FxWmiInstance *Instance)
 
ULONG GetInstanceIndex (__in FxWmiInstance *Instance)
 
_Must_inspect_result_ FxWmiInstanceGetInstanceReferenced (__in ULONG Index, __in PVOID Tag)
 
_Must_inspect_result_ FxWmiInstanceGetInstanceReferencedLocked (__in ULONG Index, __in PVOID Tag)
 
virtual BOOLEAN Dispose (VOID)
 
- Public Member Functions inherited from FxNonPagedObject
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
 FxNonPagedObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
virtual ~FxNonPagedObject (VOID)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_maxIRQL(DISPATCH_LEVEL) __drv_setsIRQL(DISPATCH_LEVEL) VOID Lock(__out __drv_deref(__drv_savesIRQL) PKIRQL PreviousIrql)
 
 _Releases_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID Unlock(__in __drv_restoresIRQL KIRQL PreviousIrql)
 
 _Acquires_lock_ (this->m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) VOID LockAtDispatch(VOID)
 
 _Requires_lock_held_ (this->m_NPLock.m_Lock) _Releases_lock_(this -> m_NPLock.m_Lock) __drv_requiresIRQL(DISPATCH_LEVEL) __inline VOID UnlockFromDispatch(VOID)
 
- Public Member Functions inherited from FxObject
PVOID GetCOMWrapper ()
 
void SetCOMWrapper (__drv_aliasesMem PVOID Wrapper)
 
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
 
virtual ~FxObject (VOID)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType Type)
 
PVOID __inline operator new (__in size_t Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __in USHORT ExtraSize=0)
 
VOID operator delete (__in PVOID Memory)
 
VOID SetNoContextHeader (VOID)
 
PVOID __inline GetObjectHandle (VOID)
 
__inline FxContextHeaderGetContextHeader (VOID)
 
__inline PFX_DRIVER_GLOBALS GetDriverGlobals (VOID)
 
WDFTYPE GetType (VOID)
 
USHORT GetObjectSize (VOID)
 
LONG GetRefCnt (VOID)
 
FxTagTrackerGetTagTracker (VOID)
 
CfxDeviceGetDevice (VOID)
 
CfxDeviceBaseGetDeviceBase (VOID)
 
VOID SetDeviceBase (__in CfxDeviceBase *DeviceBase)
 
__inline VOID CallCleanup (VOID)
 
ULONG __inline AddRef (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG Release (__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG AddRefOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual ULONG ReleaseOverride (__in WDFOBJECT_OFFSET Offset, __in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
 
virtual _Must_inspect_result_ NTSTATUS QueryInterface (__in FxQueryInterfaceParams *Params)
 
VOID MarkTraceState (VOID)
 
BOOLEAN __inline IsTraceState (VOID)
 
VOID __inline TraceDroppedEvent (__in FxObjectDroppedEvent Event)
 
VOID MarkPassiveDispose (__in FxObjectLockState State=ObjectLock)
 
VOID MarkPassiveCallbacks (__in FxObjectLockState State=ObjectLock)
 
VOID MarkForceDisposeThread (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsPassiveCallbacks (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsPassiveDispose (__in BOOLEAN AcquireLock=TRUE)
 
BOOLEAN IsForceDisposeThread (__in BOOLEAN AcquireLock=TRUE)
 
VOID MarkCommitted (VOID)
 
BOOLEAN IsCommitted (VOID)
 
VOID MarkDisposeOverride (__in FxObjectLockState State=ObjectLock)
 
VOID MarkNoDeleteDDI (__in FxObjectLockState State=ObjectLock)
 
BOOLEAN IsNoDeleteDDI (VOID)
 
_Must_inspect_result_ NTSTATUS Commit (__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
 
VOID DeleteFromFailedCreate (VOID)
 
VOID ClearEvtCallbacks (VOID)
 
BOOLEAN EarlyDispose (VOID)
 
virtual VOID DeleteObject (VOID)
 
_Must_inspect_result_ NTSTATUS AssignParentObject (__in FxObject *ParentObject)
 
_Must_inspect_result_ NTSTATUS AddContext (__in FxContextHeader *Header, __in PVOID *Context, __in PWDF_OBJECT_ATTRIBUTES Attributes)
 
_Must_inspect_result_ NTSTATUS RemoveParentAssignment (VOID)
 
_Must_inspect_result_ FxObjectGetParentObjectReferenced (__in PVOID Tag)
 
BOOLEAN IsDisposed (VOID)
 

Static Public Member Functions

static _Must_inspect_result_ NTSTATUS _Create (__in PFX_DRIVER_GLOBALS CallersGlobals, __in WDFDEVICE Device, __in_opt PWDF_OBJECT_ATTRIBUTES ProviderAttributes, __in PWDF_WMI_PROVIDER_CONFIG WmiProviderConfig, __out WDFWMIPROVIDER *WmiProvider, __out FxWmiProvider **Provider)
 
- Static Public Member Functions inherited from FxObject
static FxObject_FromDisposeEntry (__in PSINGLE_LIST_ENTRY Entry)
 
static FxObject_GetObjectFromHandle (__in WDFOBJECT Handle, __inout PWDFOBJECT_OFFSET ObjectOffset)
 
static PVOID __inline _ToHandle (__in FxObject *Object)
 
static VOID __inline _ReferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static VOID __inline _DereferenceActual (__in WDFOBJECT Object, __in_opt PVOID Tag, __in LONG Line, __in PSTR File)
 
static PVOID _GetDebugBase (__in FxObject *Object)
 
static PFX_POOL_HEADER _CleanupPointer (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObject *Object)
 
static _Must_inspect_result_ NTSTATUS _GetEffectiveLock (__in FxObject *Object, __in_opt IFxHasCallbacks *Callbacks, __in BOOLEAN AutomaticLocking, __in BOOLEAN PassiveCallbacks, __out FxCallbackLock **CallbackLock, __out_opt FxObject **CallbackLockObject)
 
static _Must_inspect_result_ NTSTATUS _ObjectQuery (_In_ FxObject *Object, _In_ CONST GUID *Guid, _In_ ULONG QueryBufferLength, _Out_writes_bytes_(QueryBufferLength) PVOID QueryBuffer)
 

Protected Types

enum  AddInstanceAction { AddInstanceToTail, AddInstanceToHead }
 

Protected Member Functions

_Must_inspect_result_ NTSTATUS AddInstanceLocked (__in FxWmiInstance *Instance, __in BOOLEAN NoErrorIfPresent, __out PBOOLEAN Update, __in AddInstanceAction Action=AddInstanceToTail)
 
- Protected Member Functions inherited from FxObject
 FxObject (__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxObjectType ObjectType)
 
FxObjectDebugExtensionGetDebugExtension (VOID)
 
BOOLEAN IsDebug (VOID)
 
VOID AllocateTagTracker (__in WDFTYPE Type)
 
virtual VOID SelfDestruct (VOID)
 
PVOID __inline GetObjectHandleUnchecked (VOID)
 
VOID __inline DestroyChildren (VOID)
 
VOID DeleteEarlyDisposedObject (VOID)
 

Protected Attributes

LIST_ENTRY m_ListEntry
 
LIST_ENTRY m_InstanceListHead
 
ULONG m_NumInstances
 
FxWmiIrpHandlerm_Parent
 
GUID m_Guid
 
ULONGLONG m_TracingHandle
 
ULONG m_MinInstanceBufferSize
 
union {
   ULONG   m_Flags
 
   struct {
      ULONG   EventOnly: 1
 
      ULONG   Expensive: 1
 
      ULONG   Tracing: 1
 
   }   m_FlagsByName
 
}; 
 
FxWmiProviderFunctionControlCallback m_FunctionControl
 
BOOLEAN m_EventControlEnabled
 
BOOLEAN m_DataBlockControlEnabled
 
BOOLEAN m_RemoveGuid
 
- Protected Attributes inherited from FxObject
union {
   CfxDeviceBase *   m_DeviceBase
 
   CfxDevice *   m_Device
 
}; 
 

Private Attributes

friend FxWmiIrpHandler
 

Additional Inherited Members

- Static Protected Member Functions inherited from FxObject
static PVOID _GetBase (__in FxObject *Object)
 

Detailed Description

Definition at line 73 of file fxwmiprovider.hpp.

Member Enumeration Documentation

◆ AddInstanceAction

Enumerator
AddInstanceToTail 
AddInstanceToHead 

Definition at line 234 of file fxwmiprovider.hpp.

Constructor & Destructor Documentation

◆ FxWmiProvider()

FxWmiProvider::FxWmiProvider ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in PWDF_WMI_PROVIDER_CONFIG  Config,
__in CfxDevice Device 
)

Definition at line 28 of file fxwmiprovider.cpp.

32  :
34  sizeof(FxWmiProvider),
35  FxDriverGlobals),
36  m_FunctionControl(FxDriverGlobals)
37 {
40  m_NumInstances = 0;
41 
42  m_Parent = Device->m_PkgWmi;
43 
47 
48  m_TracingHandle = 0;
49 
50  m_Flags = Config->Flags;
51  m_MinInstanceBufferSize = Config->MinInstanceBufferSize;
52  RtlCopyMemory(&m_Guid, &Config->Guid, sizeof(GUID));
53 
54  if (Config->EvtWmiProviderFunctionControl != NULL) {
55  m_FunctionControl.m_Method = Config->EvtWmiProviderFunctionControl;
56  }
57 
58  //
59  // Driver cannot call WdfObjectDelete on this handle
60  //
62 
64 }
FxNonPagedObject(__in WDFTYPE Type, __in USHORT Size, __in PFX_DRIVER_GLOBALS FxDriverGlobals)
FxWmiProviderFunctionControlCallback m_FunctionControl
BOOLEAN m_DataBlockControlEnabled
PFN_WDF_WMI_PROVIDER_FUNCTION_CONTROL m_Method
#define FALSE
Definition: types.h:117
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
Definition: fxobject.hpp:1101
ULONG m_MinInstanceBufferSize
LIST_ENTRY m_InstanceListHead
BOOLEAN m_EventControlEnabled
BOOLEAN m_RemoveGuid
VOID MarkNoDeleteDDI(__in FxObjectLockState State=ObjectLock)
Definition: fxobject.hpp:1118
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG Config
Definition: wdfchildlist.h:474
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define NULL
Definition: types.h:112
LIST_ENTRY m_ListEntry
FxWmiIrpHandler * m_Parent
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
ULONGLONG m_TracingHandle

Referenced by _Create().

◆ ~FxWmiProvider()

FxWmiProvider::~FxWmiProvider ( )

Definition at line 66 of file fxwmiprovider.cpp.

67 {
69 }
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define ASSERT(a)
Definition: mode.c:44
LIST_ENTRY m_ListEntry

Member Function Documentation

◆ _Create()

_Must_inspect_result_ NTSTATUS FxWmiProvider::_Create ( __in PFX_DRIVER_GLOBALS  CallersGlobals,
__in WDFDEVICE  Device,
__in_opt PWDF_OBJECT_ATTRIBUTES  ProviderAttributes,
__in PWDF_WMI_PROVIDER_CONFIG  WmiProviderConfig,
__out WDFWMIPROVIDER *  WmiProvider,
__out FxWmiProvider **  Provider 
)
static

Definition at line 88 of file fxwmiprovider.cpp.

96 {
102  GUID zeroGuid;
103  BOOLEAN update;
104 
105  FxObjectHandleGetPtrAndGlobals(CallersGlobals,
106  Device,
108  (PVOID*) &pDevice,
110 
111  *Provider = NULL;
112  update = FALSE;
113 
114  *WmiProvider = NULL;
115 
119  if (!NT_SUCCESS(status)) {
120  return status;
121  }
122 
123  if (WmiProviderConfig->Size != sizeof(WDF_WMI_PROVIDER_CONFIG)) {
125 
128  "WmiProviderConfig Size 0x%x, expected size 0x%x, %!STATUS!",
130  status);
131 
132  return status;
133  }
134 
135  if ((WmiProviderConfig->Flags & ~WdfWmiProviderValidFlags) != 0) {
139  "Invalid flag(s) set, Flags 0x%x, valid mask 0x%x, %!STATUS!",
141  status);
142  return status;
143  }
144 
145  if ((WmiProviderConfig->Flags & WdfWmiProviderTracing) &&
148 
151  "WdfWmiProviderTracing must be the only flag set, %!STATUS!",
152  status);
153 
154  return status;
155  }
156 
157  //
158  // Function control makes sense if it is expensive. Otherwise you will
159  // not be called back on it.
160  //
161  // The opposite, marking yourself as expensive but providing no callback is
162  // OK b/c the provider marks the enabled state and the driver can retrieve
163  // it at runtime.
164  //
165  // Function control also applies to tracing GUIDs since the tracing subsystem
166  // will call enable/disable events to start/stop tracing.
167  //
168  if (WmiProviderConfig->EvtWmiProviderFunctionControl != NULL &&
171 
174  "EvtWmiProviderFunctionControl can only be set if Flags 0x%x has "
175  "WdfWmiProviderTracing (%d) or WdfWmiProviderExpensive (%d) bit "
176  "values set, %!STATUS!",
179 
180  return status;
181  }
182 
183  RtlZeroMemory(&zeroGuid, sizeof(zeroGuid));
184 
186  &zeroGuid,
187  sizeof(GUID)) == sizeof(GUID)) {
189 
192  "WmiProvider Guid filed is all zeros, %!STATUS!",
193  status);
194 
195  return status;
196  }
197 
198  pProvider = NULL;
199 
202 
203  if (pProvider == NULL) {
205 
208  "Could not allocate memory for a WDFWMIPROVIDER, %!STATUS!",
209  status);
210 
211  return status;
212  }
213 
215 
216  if (NT_SUCCESS(status)) {
218 
219  if (!NT_SUCCESS(status)) {
221  }
222  else {
223  //
224  // NT_SUCCES(status) case
225  //
226  *WmiProvider = (WDFWMIPROVIDER) hProvider;
227  }
228  }
229 
230  if (NT_SUCCESS(status)) {
231  *Provider = pProvider;
232 
233  if (update) {
235  }
236  }
237  else {
238  //
239  // AddProvider incremented update count on success however since we
240  // are not going to update registration due to this failure, decrement
241  // the count.
242  //
243  if (update) {
245  }
246 
248  }
249 
250  return status;
251 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_PROVIDER_CONFIG WmiProviderConfig
Definition: wdfwmi.h:356
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
_Must_inspect_result_ NTSTATUS Commit(__in_opt PWDF_OBJECT_ATTRIBUTES Attributes, __out_opt WDFOBJECT *ObjectHandle, __in_opt FxObject *Parent=NULL, __in BOOLEAN AssignDriverAsDefaultParent=TRUE)
Definition: fxobject.cpp:904
FxWmiProvider * pProvider
Definition: fxwmiapi.cpp:54
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
WDFWMIPROVIDER hProvider
Definition: fxwmiapi.cpp:165
_Must_inspect_result_ NTSTATUS AddProvider(__in FxWmiProvider *Provider, __out_opt PBOOLEAN Update=NULL)
FxWmiIrpHandler * m_PkgWmi
Definition: fxdevice.hpp:672
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_PROVIDER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWMIPROVIDER * WmiProvider
Definition: wdfwmi.h:356
FxDevice * pDevice
PFX_DRIVER_GLOBALS pFxDriverGlobals
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_PROVIDER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES ProviderAttributes
Definition: wdfwmi.h:356
VOID UpdateGuids(VOID)
_Must_inspect_result_ NTSTATUS FxValidateObjectAttributes(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES Attributes, __in ULONG Flags=FX_VALIDATE_OPTION_NONE_SPECIFIED)
FxWmiProvider(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_WMI_PROVIDER_CONFIG Config, __in CfxDevice *Device)
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
#define TRACINGPNP
Definition: dbgtrace.h:67
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
VOID DeleteFromFailedCreate(VOID)
Definition: fxobject.cpp:391
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Device, FX_TYPE_DEVICE,(PVOID *)&pDevice, &pFxDriverGlobals)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
static SERVICE_STATUS status
Definition: service.c:31
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
VOID RemoveProvider(__in FxWmiProvider *Provider)
Definition: ps.c:97

◆ AddInstance()

_Must_inspect_result_ NTSTATUS FxWmiProvider::AddInstance ( __in FxWmiInstance Instance,
__in BOOLEAN  NoErrorIfPresent = FALSE 
)

Definition at line 352 of file fxwmiprovider.cpp.

356 {
358  KIRQL irql;
359  BOOLEAN update;
360 
363 
366  "WDFWMIINSTANCE %p cannot be added to tracing WDFWMIPROVIDER %p, "
367  "%!STATUS!", Instance->GetHandle(), GetHandle(), status);
368 
369  return status;
370  }
371 
372  m_Parent->Lock(&irql);
373  status = AddInstanceLocked(Instance, NoErrorIfPresent, &update);
374 
375  if (update) {
376  update = m_Parent->DeferUpdateLocked(irql);
377  }
378  m_Parent->Unlock(irql);
379 
380  if (update) {
382  }
383 
384  return status;
385 }
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
KIRQL irql
Definition: wave.h:1
UCHAR KIRQL
Definition: env_spec_w32.h:591
_Must_inspect_result_ NTSTATUS AddInstanceLocked(__in FxWmiInstance *Instance, __in BOOLEAN NoErrorIfPresent, __out PBOOLEAN Update, __in AddInstanceAction Action=AddInstanceToTail)
unsigned char BOOLEAN
#define TRACINGDEVICE
Definition: dbgtrace.h:58
VOID UpdateGuids(VOID)
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
BOOLEAN DeferUpdateLocked(__in KIRQL OldIrql)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
FxWmiIrpHandler * m_Parent
WDFWMIPROVIDER GetHandle(VOID)
static SERVICE_STATUS status
Definition: service.c:31
IN PVOID Instance
Definition: pci.h:361
Definition: ps.c:97

Referenced by if().

◆ AddInstanceLocked()

_Must_inspect_result_ NTSTATUS FxWmiProvider::AddInstanceLocked ( __in FxWmiInstance Instance,
__in BOOLEAN  NoErrorIfPresent,
__out PBOOLEAN  Update,
__in AddInstanceAction  Action = AddInstanceToTail 
)
protected

Definition at line 255 of file fxwmiprovider.cpp.

261 {
263 
264  *Update = FALSE;
265 
266  if (!IsListEmpty(&Instance->m_ListEntry)) {
267  if (NoErrorIfPresent) {
268  return STATUS_SUCCESS;
269  }
270  else {
271  //
272  // Entry is already on a list, bad caller!
273  //
275 
278  "WDFWMIINSTANCE %p already added, %!STATUS!",
279  Instance->GetHandle(), status);
280 
281  return status;
282  }
283  }
284 
285  //
286  // Check to see if we are in the process of
287  //
288  switch (m_Parent->m_RegisteredState) {
290  //
291  // The GUID will be reported when we do the initial registration
292  //
293  break;
294 
296  //
297  // Either the GUID will be reported when we do the re-registration or
298  // we will clean it up when we goto the cleanup state.
299  //
300  break;
301 
303  //
304  // Since we already registered we need to tell WMI the change in the
305  // number of instances on this provider.
306  //
307  *Update = TRUE;
308  break;
309 
311  //
312  // Device is going away, registration is not allowed for the device
313  // anymore.
314  //
316 
319  "WMI is being cleanedup, WDFWMIINSTANCE %p add failing, %!STATUS!",
320  Instance->GetHandle(), status);
321 
322  return status;
323 
324  default:
325  ASSERT(FALSE);
326  break;
327  }
328 
329  if (Action == AddInstanceToTail) {
330  InsertTailList(&m_InstanceListHead, &Instance->m_ListEntry);
331  }
332  else {
333  InsertHeadList(&m_InstanceListHead, &Instance->m_ListEntry);
334  }
335 
336  //
337  // Since the count is increasing to at least one, we are not going to
338  // need to report this GUID as missing. We could check the
339  // m_Parent->m_RegisteredState and only set it when we are registered, but
340  // it does us no harm to always clear this value regardless of state.
341  //
343 
344  m_NumInstances++;
346 
347  return status;
348 }
WmiRegisteredState m_RegisteredState
#define TRUE
Definition: types.h:120
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
Definition: rtlfuncs.h:201
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define InsertTailList(ListHead, Entry)
#define TRACE_LEVEL_INFORMATION
Definition: storswtr.h:29
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
#define FALSE
Definition: types.h:117
LIST_ENTRY m_InstanceListHead
#define TRACINGDEVICE
Definition: dbgtrace.h:58
#define ASSERT(a)
Definition: mode.c:44
BOOLEAN m_RemoveGuid
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
Definition: fxobject.hpp:734
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:506
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
FxWmiIrpHandler * m_Parent
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
IN PVOID Instance
Definition: pci.h:361
Definition: ps.c:97

Referenced by AddInstance(), and FxWmiIrpHandler::AddPowerPolicyProviderAndInstance().

◆ Dispose()

BOOLEAN FxWmiProvider::Dispose ( VOID  )
virtual

Reimplemented from FxObject.

Definition at line 72 of file fxwmiprovider.cpp.

75 {
76  //
77  // Object is being deleted, remove this object from the irp handler's list
78  // of providers. If we don't do this, the irp handler will have a list
79  // which contains entries which have been freed.
80  //
81  m_Parent->RemoveProvider(this);
82 
83  return FxNonPagedObject::Dispose(); // __super call
84 }
FxWmiIrpHandler * m_Parent
virtual BOOLEAN Dispose(VOID)
VOID RemoveProvider(__in FxWmiProvider *Provider)

◆ FunctionControl()

_Must_inspect_result_ NTSTATUS FxWmiProvider::FunctionControl ( __in WDF_WMI_PROVIDER_CONTROL  Control,
__in BOOLEAN  Enable 
)

Definition at line 508 of file fxwmiprovider.cpp.

512 {
514  GetHandle(),
515  Control,
516  Enable);
517 }
__inline CfxDevice * GetDevice(VOID)
Definition: fxpackage.hpp:46
WDFDEVICE __inline GetHandle(VOID)
Definition: fxdevice.hpp:237
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:140
FxWmiProviderFunctionControlCallback m_FunctionControl
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
_Must_inspect_result_ NTSTATUS Invoke(__in WDFDEVICE Device, __in WDFWMIPROVIDER WmiProvider, __in WDF_WMI_PROVIDER_CONTROL Control, __in BOOLEAN Enable)
FxWmiIrpHandler * m_Parent
WDFWMIPROVIDER GetHandle(VOID)

◆ GetDevice()

CfxDevice* FxWmiProvider::GetDevice ( VOID  )
inline

Definition at line 99 of file fxwmiprovider.hpp.

102  {
103  return m_Parent->GetDevice();
104  }
__inline CfxDevice * GetDevice(VOID)
Definition: fxpackage.hpp:46
FxWmiIrpHandler * m_Parent

Referenced by FxWmiInstance::GetDevice().

◆ GetFlags()

ULONG FxWmiProvider::GetFlags ( VOID  )
inline

Definition at line 115 of file fxwmiprovider.hpp.

118  {
119  return m_Flags;
120  }

◆ GetGUID()

GUID* FxWmiProvider::GetGUID ( VOID  )
inline

Definition at line 107 of file fxwmiprovider.hpp.

110  {
111  return &m_Guid;
112  }

Referenced by FxWmiIrpHandler::AddPowerPolicyProviderAndInstance(), and FxWmiInstance::FireEvent().

◆ GetHandle()

WDFWMIPROVIDER FxWmiProvider::GetHandle ( VOID  )
inline

Definition at line 172 of file fxwmiprovider.hpp.

175  {
176  return (WDFWMIPROVIDER) GetObjectHandle();
177  }
PVOID __inline GetObjectHandle(VOID)
Definition: fxobject.hpp:603

Referenced by __drv_maxIRQL(), AddInstance(), and FunctionControl().

◆ GetInstanceIndex()

ULONG FxWmiProvider::GetInstanceIndex ( __in FxWmiInstance Instance)

Definition at line 441 of file fxwmiprovider.cpp.

444 {
446  ULONG index;
447  KIRQL irql;
448 
449  m_Parent->Lock(&irql);
450  for (index = 0, ple = m_InstanceListHead.Flink;
452  index++, ple = ple->Flink) {
454  break;
455  }
456  }
457  m_Parent->Unlock(irql);
458 
459  return index;
460 }
KIRQL irql
Definition: wave.h:1
PSINGLE_LIST_ENTRY ple
UCHAR KIRQL
Definition: env_spec_w32.h:591
GLuint index
Definition: glext.h:6031
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY m_InstanceListHead
#define index(s, c)
Definition: various.h:29
Definition: typedefs.h:119
LIST_ENTRY m_ListEntry
FxWmiIrpHandler * m_Parent
unsigned int ULONG
Definition: retypes.h:1
IN PVOID Instance
Definition: pci.h:361

Referenced by FxWmiInstance::FireEvent().

◆ GetInstanceReferenced()

_Must_inspect_result_ FxWmiInstance * FxWmiProvider::GetInstanceReferenced ( __in ULONG  Index,
__in PVOID  Tag 
)

Definition at line 464 of file fxwmiprovider.cpp.

468 {
470  KIRQL irql;
471 
472  m_Parent->Lock(&irql);
474  m_Parent->Unlock(irql);
475 
476  return pInstance;
477 }
KIRQL irql
Definition: wave.h:1
UCHAR KIRQL
Definition: env_spec_w32.h:591
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ FxWmiInstance * GetInstanceReferencedLocked(__in ULONG Index, __in PVOID Tag)
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4061
FxWmiInstanceExternal * pInstance
Definition: fxwmiapi.cpp:113
FxWmiIrpHandler * m_Parent

◆ GetInstanceReferencedLocked()

_Must_inspect_result_ FxWmiInstance * FxWmiProvider::GetInstanceReferencedLocked ( __in ULONG  Index,
__in PVOID  Tag 
)

Definition at line 481 of file fxwmiprovider.cpp.

485 {
486  FxWmiInstance* pFound;
488  ULONG i;
489 
490  pFound = NULL;
491 
492  for (i = 0, ple = m_InstanceListHead.Flink;
493  i < m_NumInstances;
494  ple = ple->Flink, i++) {
495 
496  if (i == Index) {
498  pFound->ADDREF(Tag);
499  break;
500  }
501  }
502 
503  return pFound;
504 }
PSINGLE_LIST_ENTRY ple
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY m_InstanceListHead
_In_ WDFCOLLECTION _In_ ULONG Index
Definition: typedefs.h:119
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4061
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
LIST_ENTRY m_ListEntry
unsigned int ULONG
Definition: retypes.h:1

Referenced by FxWmiIrpHandler::Dispatch(), and GetInstanceReferenced().

◆ GetMinInstanceBufferSize()

ULONG FxWmiProvider::GetMinInstanceBufferSize ( VOID  )
inline

Definition at line 123 of file fxwmiprovider.hpp.

126  {
128  }
ULONG m_MinInstanceBufferSize

Referenced by __drv_maxIRQL().

◆ GetRegistrationFlagsLocked()

ULONG FxWmiProvider::GetRegistrationFlagsLocked ( VOID  )

Definition at line 520 of file fxwmiprovider.cpp.

523 {
524  ULONG flags;
525 
528 
529  //
530  // Once tracing GUID is registered, we do not allow it to be unregistered
531  //
533  }
534  else {
536 
539  }
540 
543  }
544  }
545 
546  if (m_RemoveGuid) {
547  //
548  // We have gone down to zero instances of this provider, report it as
549  // gone to WMI.
550  //
551  ASSERT(m_NumInstances == 0);
553 
554  //
555  // Once reported as removed, we do not have not have to report ourselves
556  // as removed again.
557  //
559  }
560 
561  return flags;
562 }
#define WMIREG_FLAG_EVENT_ONLY_GUID
Definition: wmistr.h:75
#define FALSE
Definition: types.h:117
#define WMIREG_FLAG_INSTANCE_PDO
Definition: wmistr.h:69
#define ASSERT(a)
Definition: mode.c:44
#define WMIREG_FLAG_REMOVE_GUID
Definition: wmistr.h:70
BOOLEAN m_RemoveGuid
GLbitfield flags
Definition: glext.h:7161
#define WMIREG_FLAG_TRACED_GUID
Definition: wmistr.h:73
unsigned int ULONG
Definition: retypes.h:1
#define WMIREG_FLAG_EXPENSIVE
Definition: wmistr.h:66
#define WMIREG_FLAG_TRACE_CONTROL_GUID
Definition: wmistr.h:74

Referenced by FxWmiIrpHandler::_RegInfo().

◆ GetTracingHandle()

ULONGLONG FxWmiProvider::GetTracingHandle ( VOID  )
inline

Definition at line 156 of file fxwmiprovider.hpp.

159  {
160  return m_TracingHandle;
161  }
ULONGLONG m_TracingHandle

◆ IsEnabled()

BOOLEAN FxWmiProvider::IsEnabled ( __in WDF_WMI_PROVIDER_CONTROL  Control)
inline

Definition at line 144 of file fxwmiprovider.hpp.

147  {
148  switch (Control) {
151  default: ASSERT(FALSE); return FALSE;
152  }
153  }
BOOLEAN m_DataBlockControlEnabled
#define FALSE
Definition: types.h:117
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
#define ASSERT(a)
Definition: mode.c:44
BOOLEAN m_EventControlEnabled

Referenced by FxWmiInstance::IsEnabled().

◆ IsEventOnly()

BOOLEAN FxWmiProvider::IsEventOnly ( VOID  )
inline

Definition at line 136 of file fxwmiprovider.hpp.

139  {
141  }
#define FLAG_TO_BOOL(_Flags, _FlagMask)
Definition: fxobject.hpp:125

◆ IsFunctionControlSupported()

BOOLEAN FxWmiProvider::IsFunctionControlSupported ( VOID  )
inline

Definition at line 180 of file fxwmiprovider.hpp.

183  {
184  return m_FunctionControl.m_Method != NULL;
185  }
FxWmiProviderFunctionControlCallback m_FunctionControl
PFN_WDF_WMI_PROVIDER_FUNCTION_CONTROL m_Method
#define NULL
Definition: types.h:112

◆ RemoveInstance()

VOID FxWmiProvider::RemoveInstance ( __in FxWmiInstance Instance)

Definition at line 388 of file fxwmiprovider.cpp.

391 {
392  KIRQL irql;
393  BOOLEAN update;
394 
395  update = FALSE;
396 
397  m_Parent->Lock(&irql);
398 
399  if (!IsListEmpty(&Instance->m_ListEntry)) {
400  //
401  // Instance is in the list of instances on this provider. Remove it.
402  //
403  RemoveEntryList(&Instance->m_ListEntry);
404  InitializeListHead(&Instance->m_ListEntry);
405  m_NumInstances--;
406 
408  update = TRUE;
409 
410  //
411  // When the count goes to zero, inform WMI that the GUID should be
412  // removed when we get requeried. We only need to do this once we have
413  // been registered. In all other states, we ignore this value.
414  //
415  if (m_NumInstances == 0 &&
416  (m_Flags & WdfWmiProviderExpensive) == 0) {
417  m_RemoveGuid = TRUE;
418  }
419  }
420  }
421  else {
422  //
423  // The instance was explicitly removed and now the instance is trying
424  // to remove itself during dispose. Nothing to do.
425  //
426  DO_NOTHING();
427  }
428 
429  if (update) {
430  update = m_Parent->DeferUpdateLocked(irql);
431  }
432 
433  m_Parent->Unlock(irql);
434 
435  if (update) {
437  }
438 }
WmiRegisteredState m_RegisteredState
#define TRUE
Definition: types.h:120
KIRQL irql
Definition: wave.h:1
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
BOOLEAN m_RemoveGuid
VOID UpdateGuids(VOID)
BOOLEAN DeferUpdateLocked(__in KIRQL OldIrql)
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
FxWmiIrpHandler * m_Parent
IN PVOID Instance
Definition: pci.h:361
#define DO_NOTHING()
Definition: mxgeneral.h:32

Referenced by FxWmiInstance::Dispose().

◆ SetTracingHandle()

VOID FxWmiProvider::SetTracingHandle ( __in ULONGLONG  TracingHandle)
inline

Definition at line 164 of file fxwmiprovider.hpp.

167  {
168  m_TracingHandle = TracingHandle;
169  }
ULONGLONG m_TracingHandle

Member Data Documentation

◆ @4580

union { ... }

◆ EventOnly

ULONG FxWmiProvider::EventOnly

Definition at line 280 of file fxwmiprovider.hpp.

◆ Expensive

ULONG FxWmiProvider::Expensive

Definition at line 281 of file fxwmiprovider.hpp.

◆ FxWmiIrpHandler

friend FxWmiProvider::FxWmiIrpHandler
private

Definition at line 75 of file fxwmiprovider.hpp.

◆ m_DataBlockControlEnabled

BOOLEAN FxWmiProvider::m_DataBlockControlEnabled
protected

Definition at line 290 of file fxwmiprovider.hpp.

Referenced by FxWmiProvider(), and IsEnabled().

◆ m_EventControlEnabled

BOOLEAN FxWmiProvider::m_EventControlEnabled
protected

Definition at line 288 of file fxwmiprovider.hpp.

Referenced by FxWmiProvider(), and IsEnabled().

◆ m_Flags

ULONG FxWmiProvider::m_Flags

◆ m_FlagsByName

struct { ... } FxWmiProvider::m_FlagsByName

◆ m_FunctionControl

FxWmiProviderFunctionControlCallback FxWmiProvider::m_FunctionControl
protected

Definition at line 286 of file fxwmiprovider.hpp.

Referenced by FunctionControl(), FxWmiProvider(), and IsFunctionControlSupported().

◆ m_Guid

GUID FxWmiProvider::m_Guid
protected

◆ m_InstanceListHead

LIST_ENTRY FxWmiProvider::m_InstanceListHead
protected

◆ m_ListEntry

LIST_ENTRY FxWmiProvider::m_ListEntry
protected

◆ m_MinInstanceBufferSize

ULONG FxWmiProvider::m_MinInstanceBufferSize
protected

Definition at line 268 of file fxwmiprovider.hpp.

Referenced by FxWmiProvider(), and GetMinInstanceBufferSize().

◆ m_NumInstances

◆ m_Parent

◆ m_RemoveGuid

BOOLEAN FxWmiProvider::m_RemoveGuid
protected

◆ m_TracingHandle

ULONGLONG FxWmiProvider::m_TracingHandle
protected

Definition at line 266 of file fxwmiprovider.hpp.

Referenced by FxWmiProvider(), GetTracingHandle(), and SetTracingHandle().

◆ Tracing

ULONG FxWmiProvider::Tracing

Definition at line 282 of file fxwmiprovider.hpp.


The documentation for this class was generated from the following files: