您的位置:首页 > 其它

Windows 驱动开发 - 5

2016-03-12 14:18 375 查看
上篇《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
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: