Hi, I’m trying to implement WMI support in filter driver.
It’s an HidBth lower filter driver and it’s based on
osronline’s wdffltr.
WdfWmiInstanceCreate returns with STATUS_SUCCESS, but
in WMI Object Browser there is no instances for
AKFltrDeviceInfo class.
I’m tried to disable auto registration of instance by
instanceConfig.Register = FALSE;
…
status = WdfWmiInstanceRegister(instance);
Got the same STATUS_SUCCESS and no instance
P.S. OS: Windows 7, 32-bit
Here is source of mof, wmidata.h which is autogenerated from mof,
DeviceAdd function and WdfFltrWmiRegistration function, which calls from
DeviceAdd function.
//// MOF
#pragma autorecover
[WMI,
Dynamic,
Provider(“WMIProv”),
Description(“AKFltr device information”) : amended,
DisplayName(“AKFltr WdfFltrDeviceInfo Class”) : amended,
Locale(“MS\0x409”),
guid(“{B04DDA9D-4C2B-4277-A58C-0A5925922C66}”)]
class AKFltrDeviceInfo
{
[key, read]
string InstanceName;
[read]
boolean Active;
[WmiDataId(1),
read,
Description(“Device Vendor and Product IDs”)]
uint32 VIDPID;
[WmiDataId(2),
read,
Description(“Service Name of SDP record”)]
uint8 ServiceName[64];
[WmiDataId(3),
read,
Description(“Service Description of SDP record”)]
uint8 ServiceDescr[64];
[WmiDataId(4),
read,
Description(“Provider Name of SDP record”)]
uint8 ProviderName[64];
[WmiDataId(5),
read,
Description(“Bluetooth device address”)]
uint64 DeviceAddress;
[WmiDataId(6),
read,
Description(“Device capabilities”)]
uint8 DeviceFlags;
};
//// wmidata.h
#ifndef wmidata_h
#define wmidata_h
// AKFltrDeviceInfo - AKFltrDeviceInfo
// AKFltr device information
#define AKFltrDeviceInfoGuid \
{ 0xb04dda9d,0x4c2b,0x4277, { 0xa5,0x8c,0x0a,0x59,0x25,0x92,0x2c,0x66 } }
#if ! (defined(MIDL_PASS))
DEFINE_GUID(AKFltrDeviceInfo_GUID, \
0xb04dda9d,0x4c2b,0x4277,0xa5,0x8c,0x0a,0x59,0x25,0x92,0x2c,0x66);
#endif
typedef struct _AKFltrDeviceInfo
{
// Device Vendor and Product IDs
ULONG VIDPID;
#define AKFltrDeviceInfo_VIDPID_SIZE sizeof(ULONG)
#define AKFltrDeviceInfo_VIDPID_ID 1
// Service Name of SDP record
UCHAR ServiceName[64];
#define AKFltrDeviceInfo_ServiceName_SIZE sizeof(UCHAR[64])
#define AKFltrDeviceInfo_ServiceName_ID 2
// Service Description of SDP record
UCHAR ServiceDescr[64];
#define AKFltrDeviceInfo_ServiceDescr_SIZE sizeof(UCHAR[64])
#define AKFltrDeviceInfo_ServiceDescr_ID 3
// Provider Name of SDP record
UCHAR ProviderName[64];
#define AKFltrDeviceInfo_ProviderName_SIZE sizeof(UCHAR[64])
#define AKFltrDeviceInfo_ProviderName_ID 4
// Bluetooth device address, empty for USB device
ULONGLONG DeviceAddress;
#define AKFltrDeviceInfo_DeviceAddress_SIZE sizeof(ULONGLONG)
#define AKFltrDeviceInfo_DeviceAddress_ID 5
// Device capabilities
UCHAR DeviceFlags;
#define AKFltrDeviceInfo_DeviceFlags_SIZE sizeof(UCHAR)
#define AKFltrDeviceInfo_DeviceFlags_ID 6
} AKFltrDeviceInfo, *PAKFltrDeviceInfo;
#define AKFltrDeviceInfo_SIZE (FIELD_OFFSET(AKFltrDeviceInfo, DeviceFlags) + AKFltrDeviceInfo_DeviceFlags_SIZE)
#endif
//// DeviceAdd
NTSTATUS
WdfFltrEvtDeviceAdd(
IN WDFDRIVER Driver,
IN OUT PWDFDEVICE_INIT DeviceInit
) {
NTSTATUS status;
WDF_OBJECT_ATTRIBUTES wdfObjectAttr;
WDFDEVICE wdfDevice;
PDEVICE_CONTEXT devCont;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
WdfFdoInitSetFilter(DeviceInit);
WdfDeviceInitSetDeviceType(DeviceInit,
FILE_DEVICE_UNKNOWN);
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
DeviceInit,
WdfFltrWdmPnp,
IRP_MJ_PNP,
NULL,
0);
if (!NT_SUCCESS(status)) {
WdfFltrTrace(("WdfDeviceInitAssignWdmIrpPreprocessCallback "
“failed - 0x%x\n”, status));
return status;
}
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
pnpPowerCallbacks.EvtDeviceD0Entry = WdfFltrD0Entry;
pnpPowerCallbacks.EvtDeviceD0Exit = WdfFltrD0Exit;
pnpPowerCallbacks.EvtDeviceQueryRemove = WdfFltrQueryRemove;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit,
&pnpPowerCallbacks);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&wdfObjectAttr,
DEVICE_CONTEXT);
status = WdfDeviceCreate(&DeviceInit,
&wdfObjectAttr,
&wdfDevice);
if (!NT_SUCCESS(status)) {
WdfFltrTrace((“WdfDeviceCreate failed - 0x%x\n”, status));
return status;
}
devCont = WdfFltrGetDeviceContext(wdfDevice);
devCont->MagicNumber = DEVICE_CONTEXT_MAGIC;
devCont->TargetToSendRequestsTo = WdfDeviceGetIoTarget(wdfDevice);
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,
WdfIoQueueDispatchParallel);
ioQueueConfig.EvtIoDeviceControl
= WdfFltrDeviceControl;
ioQueueConfig.EvtIoInternalDeviceControl
= WdfFltrInternalDeviceControl;
status = WdfIoQueueCreate(wdfDevice,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
NULL);
if (!NT_SUCCESS(status)) {
WdfFltrTrace((“WdfIoQueueCreate failed - 0x%x\n”, status));
return status;
}
status = WdfFltrWmiRegistration(wdfDevice);
return STATUS_SUCCESS;
}
//// WdfFltrWmiRegistration
NTSTATUS
WdfFltrWmiRegistration(
WDFDEVICE Device
) {
NTSTATUS status;
WDFWMIINSTANCE instance;
PAKFltrDeviceInfo pAKFltrDeviceInfo;
PDEVICE_CONTEXT pDeviceContext;
WDF_OBJECT_ATTRIBUTES attributes;
WDF_WMI_PROVIDER_CONFIG providerConfig;
WDF_WMI_INSTANCE_CONFIG instanceConfig;
DECLARE_CONST_UNICODE_STRING(mofRsrcName, MOFRESOURCENAME);
PAGED_CODE();
status = WdfDeviceAssignMofResourceName(Device, &mofRsrcName);
if (!NT_SUCCESS(status)) {
return status;
}
WDF_WMI_PROVIDER_CONFIG_INIT(&providerConfig,
&AKFltrDeviceInfo_GUID);
providerConfig.MinInstanceBufferSize = AKFltrDeviceInfo_SIZE;
WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(&instanceConfig,
&providerConfig);
instanceConfig.Register = TRUE;
instanceConfig.UseContextForQuery = TRUE;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes,
AKFltrDeviceInfo);
status = WdfWmiInstanceCreate (Device, &instanceConfig, &attributes,
&instance);
if (!NT_SUCCESS(status)) {
WdfFltrTrace((“InstanceCreate failure 0x%x\n”, status));
return status;
}
pAKFltrDeviceInfo = AKFltrWmiGetData(instance);
pDeviceContext = WdfFltrGetDeviceContext(Device);
pAKFltrDeviceInfo->VIDPID = pDeviceContext->DeviceConfig.VIDPID;
RtlCopyMemory(pAKFltrDeviceInfo->ServiceName,
pDeviceContext->DeviceConfig.ServiceName,
AKFltrDeviceInfo_ServiceName_SIZE);
RtlCopyMemory(pAKFltrDeviceInfo->ServiceDescr,
pDeviceContext->DeviceConfig.ServiceDescr,
AKFltrDeviceInfo_ServiceDescr_SIZE);
RtlCopyMemory(pAKFltrDeviceInfo->ServiceDescr,
pDeviceContext->DeviceConfig.ProviderName,
AKFltrDeviceInfo_ProviderName_SIZE);
pAKFltrDeviceInfo->DeviceAddress = (ULONGLONG)pDeviceContext->DeviceConfig.DeviceAddress;
pAKFltrDeviceInfo->DeviceFlags = pDeviceContext->DeviceConfig.DeviceFlags;
WdfFltrTrace((“WMI registration status-0x%x\n”, status));
return status;
}