WMI support in lower filter driver

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;
}

Is the MOF binary data actually embedded in your driver’s resources?

-----Original Message-----
From: xxxxx@lists.osr.com [mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@yandex.ru
Sent: Friday, November 05, 2010 1:21 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] WMI support in lower filter driver

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;
}


NTDEV is sponsored by OSR

For our schedule of WDF, WDM, debugging and other seminars visit:
http://www.osr.com/seminars

To unsubscribe, visit the List Server section of OSR Online at http://www.osronline.com/page.cfm?name=ListServer

Yes, it’s embedded. AKFltrDeviceInfo appear in wmi namespace after driver is loaded

Thanks for your reply, Doron!
I’ve found the problem.
only one line:
providerConfig.MinInstanceBufferSize = AKFltrDeviceInfo_SIZE;
changed to
providerConfig.MinInstanceBufferSize = sizeof(AKFltrDeviceInfo);