当前位置: 代码迷 >> 驱动开发 >> Windows 驱动开发 - 五
  详细解决方案

Windows 驱动开发 - 五

热度:289   发布时间:2016-04-28 09:59:33.0
Windows 驱动开发 - 5

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


  相关解决方案