当前位置: 首页 > news >正文

usb驱动程序开发技术总结(二)

二.USB接口驱动程序的开发

1.设备和驱动程序的层次结构

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 375pt; HEIGHT: 327.75pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:%5CDOCUME~1%5Cboy%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.emz" o:title=""><font size="4"></font></imagedata></shape>

WDM模型使用了如图所示的层次结构。图中右边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。

WDM中引入了功能设备对象(FDO)和物理设备对象(PDO)来描述硬件。一个PDO对应一个真实硬件,一个硬件只允许有一个PDO,却可以有多个FDO。在驱动程序中直接操作的不是硬件设备,而是相应的PDOFDOPDOFDO都处于堆栈的最低层。在FDO的上面和下面还会有一些过滤器设备对象(filter device object)。位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO之上)的过滤器设备对象称为下层过滤器。在用户态和内核态通信方面,系统为每一个用户请求打包形成一个IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区分是发送给哪一个设备的。

2.编写驱动程序的基本步骤

(1) 首先编写一个DriverEntry例程。在这个例程中必须设置一系列的回调例程来处理IRP. DriverEntry是内核模式驱动程序主入口点常用的名字。该例程的主要工作是把各种函数指针填入驱动程序对象。这些指针为操作系统指明了驱动程序容器中各种子例程的位置。

2)编写一个AddDevice例程,它的基本功能是创建一个设备对象并把它连接到堆栈底部为pdo的设备堆栈中。相关步骤如下:调用IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象;寄存一个或多个设备接口,以便应用程序能知道设备的存在,另外,还可以给出设备名并创建符号连接;初始化设备扩展和设备对象的Flag成员;调用IoAttachDeviceToDeviceStack函数把新设备对象放到堆栈上。

3)编译连接驱动程序。

4)测试驱动程序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python使用技巧(二十八):减少字典计算速度的技巧
  • NLP模型笔记2022-18:GCN/GNN模型在nlp中的使用【论文+源码】
  • usb驱动程序开发技术总结(三)
  • 目标检测系列算法:YOLOv6代码复现
  • 饕餮元年开发日记(中场休息篇)
  • 完美解决ubuntu:签名无效 KEYEXPIRED、EXPKEYSIG更新出bug
  • 饕餮元年开发日记(四)
  • NLP模型笔记2022-19:知识图谱工具neo4j图数据库的安装与使用
  • NLP模型笔记2022-20:py2neo接口处理知识图谱neo4j实体
  • 饕餮元年开发日记(三)
  • NLP模型笔记2022-21:知识图谱neo4j指定方向实体(头实体、尾实体、头尾实体关系)
  • NLP模型笔记2022-22:知识图谱neo4j批量可视化
  • 饕餮元年开发日记(二)
  • NLP模型笔记2022-23:知识图谱neo4j可视化实体多关系属性【破案线索关系】
  • 饕餮元年开发日记(一)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • canvas 绘制双线技巧
  • codis proxy处理流程
  • ES6系统学习----从Apollo Client看解构赋值
  • Java 多线程编程之:notify 和 wait 用法
  • javascript数组去重/查找/插入/删除
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • 高性能JavaScript阅读简记(三)
  • 关于Java中分层中遇到的一些问题
  • 技术胖1-4季视频复习— (看视频笔记)
  • 判断客户端类型,Android,iOS,PC
  • 如何实现 font-size 的响应式
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 怎么把视频里的音乐提取出来
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​虚拟化系列介绍(十)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #DBA杂记1
  • #nginx配置案例
  • #pragma once
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (第27天)Oracle 数据泵转换分区表
  • (二)linux使用docker容器运行mysql
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十三)Flink SQL
  • (算法二)滑动窗口
  • ***通过什么方式***网吧
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net多线程总结
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @JsonFormat与@DateTimeFormat注解的使用
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Angular] 笔记 20:NgContent
  • [BUUCTF]-Reverse:reverse3解析
  • [C++] vector对比list deque的引出