標籤:
上篇《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);
Windows 驅動開發 - 5