zoukankan      html  css  js  c++  java
  • windows 2000/xp WDM设备驱动程序开发 (1)

     0. 参考文献

    《windows WDM 设备驱动程序开发指南》《programming the microsoft windows driver model》

    《windows 2000驱动程序开发大全》

    使用driverworks工具(driverStudio),而没有用DDK,因为更快捷

    1. WDM驱动

     例程

     

     页故障:软件级别中断,运行在DISPATCH_LEVEL上; 所以访问DISPATCH_LEVEL的代码需运行在非分页内存

    1.3 设备接口

    旧的命名方法:驱动创建一个符号链接,应用来访问。

    新的命名方法:128位GUID唯一标识, GUIDGEN生成

    2. WDM基本结构

    driverworks: kdriver, kpnpDevice, kpnpLowerDevice

    2.1  kdriver

        1)装载驱动时,pnp管理器为每个驱动程序调用一次driverentry例程

         2)初始化之后,pnp调用addDevice初始化设备;运行时有新设备被枚举将调用addDevice设备

               adddevice本职是把新设备附加到设备堆栈中

         3)driverworks中FDO和PDO连接

            

     2.2 kpnpdevice

       DO_EXCLUSIVE 指出设备是否排斥(io管理器仅允许打开一次)

       列举了一些函数

       HID, human interface device; 

       WMI,windows 管理诊断

     3. IRP操作

      driverworks对IRP进行了封装KIrp

      IRP重要域:

      1)MdlAddress(PMDL): 指向内存描述符表,当使用DO_DIRECT_IO,

            对于IRP_MJ_READ/WRITE, IO管理器就创建MDL,锁定用户内存。 

            对于IRP_MJ_DEVICE_CONTROL, METHOD_IN_DIRECT/ METHOD_OUT_DIRECT, 输出缓冲区创建MDL

      2)associatedIrp.systemBuffer, 系统的数据缓冲区,DO_BUFFERED_IO会用

         

      3)IoStatus, status收到NTSTATUS, information用于保存数据传输操作

      创建IRP时,同时创建关联的IO_STACK_LOCATION堆栈数组,每个堆栈单元对应一个要处理该IRP的驱动,存储IRP类型和参数等

      MajorFunction: 如IRP_MJ_READ

      minorFunction: 如IRP_MJ_PNP 的IRP_MN_START_DEVICE, IRP_MN_REMOVE_DEVICE

      parameters: create, read, startdevice

      deviceObject

      completionRoutine

    3.2 kirp

      函数: complete(), 完成IRP,绝不允许拥有自旋锁的情况下调用此函数,运行在IRQL<=DISPATCH_LEVEL

      status(), 即iostatus.status域, 如STATUS_PENDING

      information(), 若status不是STATUS_SUCCESS, 则这里设置为0

      IoctlBuffer(), bufferedReadDest, bufferedWriteSource() 对应associatedIrp.systembuffer

      MarkPending()

      IoctlCode(), readSize(), 

      WDM使用的成员函数

      allocatedResources, 系统分配的资源

      translatedResources, 系统分配的翻译资源

    3.3 IRP基本操作

     完成IRP    I.pnpComplete()

     取消IRP

     等

  • 相关阅读:
    【转+补充】在OpenCV for Android 2.4.5中使用SURF(nonfree module)
    Delphi StarOffice Framework Beta 1.0 发布
    Angular ngIf相关问题
    angularjs文档下载
    公众号微信支付开发
    公众号第三方平台开发 教程六 代公众号使用JS SDK说明
    公众号第三方平台开发 教程五 代公众号处理消息和事件
    公众号第三方平台开发 教程四 代公众号发起网页授权说明
    公众号第三方平台开发 教程三 微信公众号授权第三方平台
    公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取
  • 原文地址:https://www.cnblogs.com/yuanming/p/7047859.html
Copyright © 2011-2022 走看看