Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55156
  • 博文数量: 51
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2018-08-26 01:30
文章分类

全部博文(51)

文章存档

2020年(2)

2018年(49)

我的朋友

分类: Windows平台

2018-08-26 02:23:38

上篇《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(队列)的机制。

    所以,我们要在增加设备时提供队列支持。



  1. WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&ioQueueConfig,
  2.                                     WdfIoQueueDispatchParallel);

  3.     ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl;

  4.     status = WdfIoQueueCreate(device,
  5.                          &ioQueueConfig,
  6.                          WDF_NO_OBJECT_ATTRIBUTES,
  7.                          WDF_NO_HANDLE);

(1)初始化队列配置


       


  1. VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
  2.   _Out_ PWDF_IO_QUEUE_CONFIG Config,
  3.   _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType
  4. );

(2)设置回调事件

        设置结构中的成员变量值。


  1. typedef struct _WDF_IO_QUEUE_CONFIG {
  2.   ULONG Size;
  3.   WDF_IO_QUEUE_DISPATCH_TYPE DispatchType;
  4.   WDF_TRI_STATE PowerManaged;
  5.   BOOLEAN AllowZeroLengthRequests;
  6.   BOOLEAN DefaultQueue;
  7.   PFN_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault;
  8.   PFN_WDF_IO_QUEUE_IO_READ EvtIoRead;
  9.   PFN_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
  10.   PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
  11.   PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl;
  12.   PFN_WDF_IO_QUEUE_IO_STOP EvtIoStop;
  13.   PFN_WDF_IO_QUEUE_IO_RESUME EvtIoResume;
  14.   PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
  15.   union {
  16.     struct {
  17.       ULONG NumberOfPresentedRequests;
  18.     } Parallel;
  19.   } Settings;
  20.   WDFDRIVER Driver;
  21. } WDF_IO_QUEUE_CONFIG, *PWDF_IO_QUEUE_CONFIG;

(3)建立队列
        


  1. NTSTATUS WdfIoQueueCreate(
  2.   [in] WDFDEVICE Device,
  3.   [in] PWDF_IO_QUEUE_CONFIG Config,
  4.   [in, optional] PWDF_OBJECT_ATTRIBUTES QueueAttributes,
  5.   [out, optional] WDFQUEUE *Queue
  6. );








阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~