============简要归纳,待整理
Toaster Filter例子,里面创建了两个PnP/电源管理的特性:
一个可选的设备对象cleanup事件回调函数
一个non-power-managed I/O queue
NTSTATUS FilterEvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) { NTSTATUS status = STATUS_SUCCESS; PFDO_DATA fdoData; WDF_IO_QUEUE_CONFIG queueConfig; WDF_OBJECT_ATTRIBUTES fdoAttributes; WDFDEVICE hDevice; WdfFdoInitSetFilter(DeviceInit); // Initialize the object attributes for our WDFDEVICE. WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&fdoAttributes, FDO_DATA); fdoAttributes.EvtCleanupCallback = FilterEvtDeviceContextCleanup; // Create a framework device object. status = WdfDeviceCreate(&DeviceInit, &fdoAttributes, &hDevice); if (!NT_SUCCESS(status)) { return status; } status = WdfDeviceCreateDeviceInterface(hDevice, &GUID_DEVINTERFACE_FILTER, NULL); if (!NT_SUCCESS (status)) { return status; } // Initialize the default queue. WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel); queueConfig.PowerManaged = FALSE; // Specify event processing callbacks. queueConfig.EvtIoWrite = FilterEvtIoWrite; // Create the queue status = WdfIoQueueCreate(hDevice, &queueConfig, WDF_NO_OBJECT_ATTRIBUTES, NULL); if (!NT_SUCCESS (status)) { return status; } return STATUS_SUCCESS; }图例:
WDFDEVICE_INIT structure是用来初始化设备创建时的一系列数据。
WdfFdoInitSetFilter表示device是一个filter
FDO_DATA是设备对象的context类型,在WDF_OBJECT_ATTRIBUTES中。
EvtCleanupCallback在设备被删除时调用
WDF_IO_QUEUE_CONFIG 配置默认queue
在software-only和filter驱动,由framework处理所有相关操作,KMDF只需要实现EvtDriverDeviceAdd。禁用queue的power management。