上篇《Windows 驱动开发 - 4》我们已经完毕了硬件准备。
可是我们还没有详细的数据操作,比如接收读写操作。
在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性。
我们知道进行WDF开发主要是尾随IRPs的“脚步”。
|
I/O Request Delivery Mechanism |
||
|
I/O request type |
UMDF delivery mechanism |
KMDF delivery mechanism |
|
Read |
Queue |
Queue |
|
Write |
Queue |
Queue |
|
Device I/O control |
Queue |
Queue |
|
Internal device I/O control |
Queue |
Queue |
|
Create |
Queue |
Queue or callback |
|
Close |
Callback |
Callback |
|
Cleanup |
Callback |
Callback |
从表中能够看到在进行DEVICE I/O control的时候,WDF是使用了Queue(队列)的机制。
所以,我们要在添加设备时提供队列支持。 WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&ioQueueConfig,
WdfIoQueueDispatchParallel);
ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl;
status = WdfIoQueueCreate(device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
WDF_NO_HANDLE);(1)初始化队列配置
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE
VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE( _Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType );
(2)设置回调事件
设置WDF_IO_QUEUE_CONFIG结构中的成员变量值。
typedef struct _WDF_IO_QUEUE_CONFIG {
ULONG Size;
WDF_IO_QUEUE_DISPATCH_TYPE DispatchType;
WDF_TRI_STATE PowerManaged;
BOOLEAN AllowZeroLengthRequests;
BOOLEAN DefaultQueue;
PFN_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault;
PFN_WDF_IO_QUEUE_IO_READ EvtIoRead;
PFN_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl;
PFN_WDF_IO_QUEUE_IO_STOP EvtIoStop;
PFN_WDF_IO_QUEUE_IO_RESUME EvtIoResume;
PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
union {
struct {
ULONG NumberOfPresentedRequests;
} Parallel;
} Settings;
WDFDRIVER Driver;
} WDF_IO_QUEUE_CONFIG, *PWDF_IO_QUEUE_CONFIG;(3)建立队列
WdfIoQueueCreate
NTSTATUS WdfIoQueueCreate( [in] WDFDEVICE Device, [in] PWDF_IO_QUEUE_CONFIG Config, [in, optional] PWDF_OBJECT_ATTRIBUTES QueueAttributes, [out, optional] WDFQUEUE *Queue );