Windows的驱动开发模型

   1.  前言

Windows的驱动开发模型

因工作上项目标要求,作者须求做驱动相关的费用,往日并不曾接触过相关的学问,折腾一段时间下来,效能如需兑现了,也积累了有些经历和见解,所以在此做番总括。

 

对于驱动开发的支付指点,微软官方文档网站已经提供了很详细的课程文档,并且在Github上提供了一多重典型的例程源码用于开发人员参考。开发人士在装有一定的驱动概念知识后,通过参考官方例程可以很容易已毕所有一定成效的驱动应用程序。

   
在Windows的例外版本上支出的驱动程序“模型”(模型那么些词语应该来自单词“Mode”。在Windows
NT上,驱动程序被叫做Kernel Driver
Mode驱动程序。小编认为那一个Mode是指一种驱动程序的结构和运转的正规化),有过区其他称谓。比如在Windows
9x上的驱动程序,都叫作VXD,而在Windows
NT上的驱动程序被号称KDM驱动程序,Windows
98~2000以此时代出现的新模型叫做WDM。
   
Windows的驱动模型概念,本来是就驱动程序的行事而言的。比如WDM驱动,必需要满足提供n种被要求的性状(如电源管理、即插即用)才被称呼WDM驱动。即使不提供那几个意义,那么统一称为NT式驱动。同样的,WDF驱动也有它的一体系标准。
    可是本书采纳精炼的区分方法。将全体在Windows 2000~Windows
Vista下能健康运行且未调用WDF相关的内核API函数的驱动都叫作传统型驱动(包含NT式和WDM)。倘若调用了WDF相关的内核API则称为WDF驱动。
请小心:WDF驱动是足以调用传统型驱动所调用的内核API的,WDF可以算得传统型的升级版。
   
模型的开拓进取并不是和操作系统版本的升级齐步走的,而是有一个渐渐取代的进度。比如Windows
98已经支撑部分的WDM驱动程序,可是又襄助部分的VXD驱动。而到了Windows
2000,则VXD这种驱动程序完全被淘汰了。KDM则是WDM的前身。WDM是在KDM的基础上扩展了一些新的特点,制定了部分新的科班而作育的。绝超过半数函数调用都是通用的。当然,Windows
9x连串的根本完全分歧,所以VXD与之相比较,就不曾一个内核API函数是同样的。
    故而随着Windows 9x的打入冷宫,VXD难逃彻底被淘汰的造化。Windows
NT则向上成了新生的Windows版本,KDM也改成了WDM而存在下去。当然,微软不会闲着,现在又推出了新的WDF。读者又不得不担心:本书是用WDM写的依旧用WDF写的呢?会不会刚刚学完又被淘汰呢?
   
和VXD分化,从KDM到WDM再到WDF是一脉相通的,基本上KDM程序员在攻读WDM时曾经占尽了便宜。到WDF也不例外,WDF与其说是新的驱动开发模型,还不如说是在已有的内核API和数据结构的根底上,又装进出一套让使用者觉得更简明、更易用的以Wdf-开始的一组API。因而,读者大可不必担心WDF的上扬会让后边学习传统型驱动的奋力一曝十寒。一个超人的例子是:大概在1991年到1992年间公布第二个版本的硬盘上层过滤diskperf的代码,18年过去了,今日照旧可以编译并正常在新型版本的Vista上运行。
   
本书对于一大半不能找到WDF实例的章节,都应用了传统型驱动举行认证。比如磁盘过滤、文件系统过滤和互联网中间层驱动。别的为了从简单入手,对于入门级的三个例证(串口和键盘)也运用了传统型驱动。不过虚拟磁盘和虚拟网卡(第5章和第11章),使用了WDF版本的事例,请读者注意识别。

Windows驱动程序入门:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/

Github:
https://github.com/Microsoft/Windows-driver-samples

 

   2.  驱动类型

 驱动分为如下二种档次:

  • 设施函数驱动程序
  • 设备筛选器驱动程序
  • 软件驱动程序
  • 文件系统筛选器驱动程序
  • 文件系统驱动程序

驱动程序不是必然要求与硬件通讯,假诺要求拜访操作系统焦点数据,往往应用程序没有丰裕的权杖,那种情状则需要在根本情势下开展访问。就地点5种驱动类型,小编参考着微软的驱动例子开发过
鼠标键盘设备过滤驱动
互联网过滤软件驱动程序,所以对驱动开发的驾驭仍在浅水区,如在阅读进程中发觉有误的地点,还请不吝提出。

动用的驱动类型涉及到代码的落到实处(需不需求考虑PNP和电源管理)和驱动的安装(
NT式驱动程序以 service
的方式运行,其他驱动须求使用通用的INF文件安装),微软的法定文档那样提到:

style=”font-family: ‘Microsoft YaHei’;”>有关软件驱动程序,你的五个挑选为
KMDF 和基本方式 Windows NT 驱动程序模型。 使用 KMDF 和基础方式 Windows
NT 模型,你可以编制驱动程序,而无需考虑即插即用 (PnP) 和电源管理。
你可以改为专心于驱动程序的首要任务上。 使用 KMDF,你不用考虑 PnP
和电源,因为框架会为您处理 PnP 和电源。 使用基本格局 Windows NT
模型,你不要考虑 PnP 和电源,因为根本方式服务在与 PnP
和电源管理完全无关的环境中运行。

   3.  开发环境

 

Visual Studio +
WDK(Windows Driver Kit)

里面WDK要求自己手动下载安装

作者是在Windows平台上支出,使用的付出环境为
Visual Studio 2013 + WDK 8.1

 

   4.  实现方式

 

WDM vs WDF

对此刚接触驱动开发的新手来说,作者不提议使用WDM(Windows
驱动程序模型)举办支付。如今在网上能找到的有关驱动开发的国语图书基本上都是围绕WDM情势展开描述的,而至于WDF(Windows
驱动框架)开发的书籍寥寥无几,《竹林溪径——深远浅出Window驱动开发》和《Developing
Drivers with the Windows Driver
Foundation
》算是两本讲述基于WDF开发驱动的图书,两者都能在网上找到电子书资源。

 

据悉WDF的驱动开发

WDF的开支必要遵从一定的规则,开发完成时须求考虑较多的底细,由于篇幅有限,小编凭着自己的阅历暂且稍做列举,后续将写一篇针对WDF驱动开发的篇章。

  • PNP和电源管理(WDF已经支持封装了一大半的接口);
  • 各个对象:驱动对象,设备对象,WDF对象,文件对象,队列对象;
  • 使得上下文:有时称为设备扩张,用于存储特定设备对象的连带音信的数据结构;
  • 对象的放出:需求考虑差距属性对象释放的机遇;
  • 中断请求级别:处理不当易导致蓝屏;
  • 分页与非分页内存;
  • 同步锁:回调同步锁、框架等待锁、自旋锁、中断锁等;
  • 日记跟踪记录:
    调试的必不可少,可以动用 WPP(Windows软件追踪预处理器)或简捷的
    DebugPrint 输出
  • 与应用程序的简报:控制代码、IRQ,请求队列

 

   5.  驱动安装

 

测试环境下安装驱动前

付出的驱动程序没有展开签约或者选拔测试签名,则要求在设备上打开测试情势,具体操作为:打开控制台,输入:

bcdedit /set testsigning on

回车,会提示:操作成功完成。
然后重启设备,开机后会在电脑桌面右下方彰显有“测试形式”字样内容的水印。

倘若要关张测试形式,则需在控制台输入:

bcdedit /set testsigning off

回车,同样会唤起:操作成功完成。
重启设备后则会发觉桌面右下角的水印消失。

 

以服务的花样运行

NT式的驱动程序允许以 service
的样式运行, 服务安装的例程可以参考 WDF Sample 中的 Eventdrv
工程,或者参考我写的有关进程互连网监控的驱动例程开源代码

 

接纳INF文件安装

配备相关的驱动装置可以挑选INF举办安装,INF安装文件的编纂提出从
WDF Sample
中找到适合的INF文件进行修改,假使你想询问INF的语法,可以参考这里

  • 通过设备管理器手工安装

打开控制台,输入 devmgmt
回车,那是开辟设备管理器的里边一种艺术,其余艺术比如右键系统菜单栏图标均可以打开职务管理器,只是选择命令行的法子比较少见,这里越发记下一下。找到感兴趣的
设施节点,右键 属性(或更新驱动程序软件),切换来
驱动程序,可以开展感兴趣的操作。那里所观望所提供的选项,后续等您熟识了驱动装置的接口后,你会意识都有对应的接口对应每个效用选项。

  • 透进度序完毕自动安装

可以参考 WDF Sample
中的Driver Install Frameworks API (DIFxAPI) Sample
Device Console (DevCon) Tool
五个工程,分别提供了分裂调用接口的驱动装置格局,Device Console (DevCon) Tool
生成的devcon.exe
是一个成效强大的工具,不仅可用来驱动(包)的装置和卸载,还能赢得装备的硬件ID,描述符以及配备所设置的驱动列表等音信,开发人士可以从中一窥究竟。

在使得的装置进度中,系统会自动记录安装的日记,在INF目录(路径一般在 C:\Windows\inf下)下可以找到七个日志文件
setupapi.app.logSetupapi.dev.log
,查看那七个日志文件有利于精晓驱动装置的实践进度,同时也有益排查驱动装置进程中冒出的那多少个。

使得的装置涉及到驱动文件的校验(有限支持驱动文件的完整性和合法性),驱动的预先级计算(拔取最优的驱动去匹配当前识别到的新的配备),驱动的停放目录(Driver
Store)等情节。开发人员熟练驱动装置逻辑有利于驱动的开销,感兴趣可以透过此处开展摸底。

 

   6.  驱动签名

 

测试环境

因此VS集成开发环境创制 Driver
解决方案后会生成多个品种,右键属性打开 XXX Package,左边选中
Driver Signing ,在右手栏 Sign Mode 选择 Test Sign,在
Test Certificate选择
<Create test certificate...>,则在编译时会自动生成测试签名证书。

 

生儿育女环境

从Win10起头,驱动文件包不仅必要展开扩大验证
(EV)
代码签名,还须求提交到硬件开发主旨仪表盘,具体操作指南可以参照此处,你可以在该文档上找到驱动签名所需的其他内容。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图