标签:
上篇《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 );
标签:
原文地址:http://blog.csdn.net/xiaobin_hlj80/article/details/46444233