上篇《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
- );