Windows驱动开发入门带领

   1.  前言

Windows的驱动开发模型

因工作上类其余内需,作者必要做驱动相关的开发,以前并不曾接触过相关的学问,折腾一段时间下来,成效如需兑现了,也积累了部分经历和见地,所以在此做番计算。

 

对此驱动开发的支出指点,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一密密麻麻典型的例程源码用于开发人员参考。开发人士在颇具一定的驱动概念知识后,通过参考官方例程可以很不难达成全体一定功效的驱动应用程序。

   
在Windows的两样版本上支付的驱动程序“模型”(模型那几个词语应该来自单词“Mode”。在Windows
NT上,驱动程序被称作Kernel Driver
Mode驱动程序。小编认为这几个Mode是指一种驱动程序的布局和运维的正式),有过不一样的称号。比如在Windows
9x上的驱动程序,都称呼VXD,而在Windows
NT上的驱动程序被誉为KDM驱动程序,Windows
98~两千以此时期出现的新模型叫做WDM。
   
Windows的驱动模型概念,本来是就驱动程序的作为而言的。比如WDM驱动,必需求满意提供n种被必要的风味(如电源管理、即插即用)才被叫作WDM驱动。即使不提供这个意义,那么统一称为NT式驱动。同样的,WDF驱动也有它的一连串标准。
    可是本书采取精炼的界别方法。将全体在Windows 3000~Windows
Vista下能符合规律运作且未调用WDF相关的内核API函数的驱动都称为古板型驱动(包罗NT式和WDM)。固然调用了WDF相关的内核API则名为WDF驱动。
请留意:WDF驱动是足以调用古板型驱动所调用的内核API的,WDF可以说是古板型的升级版。
   
模型的迈入并不是和操作系统版本的晋级齐步走的,而是有一个日渐取代的历程。比如Windows
98已经协理部分的WDM驱动程序,然而又支持部分的VXD驱动。而到了Windows
三千,则VXD那种驱动程序完全被淘汰了。KDM则是WDM的前身。WDM是在KDM的根底上加码了一部分新的特色,制定了一些新的标准而培育的。绝大多数函数调用都以通用的。当然,Windows
9x种类的水源完全不一致,所以VXD与之相比较,就平昔不2个内核API函数是均等的。
    故而随着Windows 9x的打入冷宫,VXD难逃彻底被淘汰的运气。Windows
NT则发展成了新生的Windows版本,KDM也化为了WDM而留存下去。当然,微软不会闲着,将来又推出了新的WDF。读者又不得不担心:本书是用WDM写的如故用WDF写的呢?会不会刚刚学完又被淘汰呢?
   
和VXD不相同,从KDM到WDM再到WDF是一脉相通的,基本上KDM程序员在就学WDM时早已占尽了福利。到WDF也不例外,WDF与其说是新的驱动开发模型,还不如说是在已部分内核API和数据结构的基础上,又包装出一套让使用者觉得更简便易行、更易用的以Wdf-开头的一组API。由此,读者大可不必担心WDF的升高会让前方学习古板型驱动的卖力一曝十寒。2个卓越的事例是:大致在一九九二年到一九九一年间发表第一个版本的硬盘上层过滤diskperf的代码,18年过去了,今日照旧可以编译并不奇怪在最新版本的Vista上运营。
   
本书对于大部分无法找到WDF实例的章节,都施用了守旧型驱动举行认证。比如磁盘过滤、文件系统过滤和互联网中间层驱动。别的为了从简单入手,对于入门级的多个例证(串口和键盘)也利用了古板型驱动。不过虚拟磁盘和编造网卡(第伍章和第贰1章),使用了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 贰零壹壹 + WDK 8.1

 

   4.  实现方式

 

WDM vs WDF

对于刚(yú gāng )接触驱动开发的新手来说,我不指出采纳WDM(Windows
驱动程序模型)举行开发。近年来在网上能找到的关于驱动开发的粤语图书基本上都以环绕WDM情势开展描述的,而至于WDF(Windows
驱动框架)开发的书籍寥寥无几,《竹林溪径——长远浅出Window驱动开发》和《Developing
Drivers with the Windows Driver
Foundation
》算是两本讲述基于WDF开发驱动的书籍,两者都能在网上找到电子书能源。

 

依据WDF的驱动开发

WDF的开发须求根据一定的平整,开发完毕时索要考虑较多的细节,由于篇幅有限,我凭着本身的经验一时稍做列举,后续将写一篇针对WDF驱动开发的小说。

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

 

   5.  驱动安装

 

测试环境下安装驱动前

支出的驱动程序没有进展签字大概采取测试签名,则需求在设施上开启测试形式,具体操作为:打开控制台,输入:

bcdedit /set testsigning on

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

只要要关闭测试格局,则需在支配台输入:

bcdedit /set testsigning off

回车,同样会提示:操作成功完成。
重启设备后则会意识桌面右下角的水印消失。

 

以服务的款型运营

NT式的驱动程序允许以 service
的款式运营, 服务安装的例程可以参考 WDF Sample 中的 Eventdrv
工程,只怕参考作者写的有关进度互连网监督的驱动例程开源代码

 

采取INF文件安装

装备相关的驱动装置可以采取INF进行设置,INF安装文件的编排建议从
WDF Sample
中找到合适的INF文件举行改动,假使您想打听INF的语法,可以参照这里

  • 因此配备管理器手工安装

开拓控制台,输入 devmgmt
回车,那是打开设备管理器的内部一种格局,其他办法比如右键系统菜单栏图标均能够打开义务管理器,只是拔取命令行的办法相比少见,这Ritter别记下一下。找到感兴趣的
装备节点,右键 属性(或更新驱动程序软件),切换来
驱动程序,可以展开感兴趣的操作。那里所见到所提供的选项,后续等你熟识了驱动装置的接口后,你会发觉都有照应的接口对应每一个功效选项。

  • 经进程序完结自动安装

可以参考 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地图