zoukankan      html  css  js  c++  java
  • Windows 驱动开发

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


  • 相关阅读:
    mysql find_int_set
    PHPSTROM8.0 注册码(7.1也可用)
    gym 101657 D
    gym101657 C
    poj 3525
    poj1279
    poj3335
    poj 1228
    poj 1873
    poj 2074
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5268622.html
Copyright © 2011-2022 走看看