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地图