竹林蹊径,驱动开发的局地基本概念

by admin on 2019年1月31日

   1.  前言

WDK(Windows Driver
Kit)是一种截然集成的驱动程序开发体系,它包含 Windows DDK,用于测试
Wi
ndows 驱动器的可相信性和平安性.

Windows的驱动开发模型

home88一必发,推

因工作上项目的内需,小编要求做驱动相关的支付,在此之前并不曾接触过有关的学问,折腾一段时间下来,功效如需兑现了,也积累了一些经验和见解,所以在此做番总计。

WDM 是 Win32装备驱动程序系列布局

 

自己一贯觉得,编写程序是一件很古怪的作业,它可以带来创制和控制的私欲。每当自己阅读或者编写一段代码时,脑子里自然地就会设想那段代码如何形成预订的逻辑。当面对一个不熟悉的支付环境,或者一个新的根基平台时,首先要了解这些条件依然平台是何等工作的,以及提供了怎么着功用。代码本身可能万分复杂,甚至奥妙无穷,但常见状态下,真正美丽的高品质代码往往是简约的、易于了解的。对于代码编写者或者维护者来说,真正见功夫的地点不在于代码本身,而介于对下层开发平台的精晓和通晓能力,可能那就是俗称的“内功”。

对此驱动开发的支付指点,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一密密麻麻典型的例程源码用于开发人员参考。开发人员在享有一定的驱动概念知识后,通过参考官方例程能够很简单完结所有一定作用的驱动应用程序。

Windows设备驱动程序,过去是WDM(Windows
Driver Model)框架,编程复杂,初学者难以了然其编程
中央。为了缓解这一题材,微软对WDM驱动程序的架构做了革新,形成了崭新的WDF(Windows
Driver F
oundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大下跌了付出难度。从现
在起头,通晓Windows设备驱动程序的开发人员,由过去的“专业”人士,将改成“普通”福特。

   
在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
SDK来支付Windows应用程序。那么,程序员有需要精通Windows
SDK中的基本要素,诸如新闻分发机制、种种图片功能等。在那种处境下,阅读一些卓越的例子程序代码往往能起到飞快引领入门的效益。同样地,C/C++程序员借使局限于C/C++语言本身,很难编写出高品质的实用程序。他们不仅要控制C/C++运行库中函数和花色的用法,甚至还要精晓那么些函数和档次的落到实处机理。即便源代码层面上的库,例如STL(C++的正规模板库),也亟需掌握其代码完成才能灵活自如地用好这一个库(比如STL中的各个容器数据结构、迭代器或算法)。

Windows驱动程序入门:

WDF驱动程序包罗八个品类,一个是内核级的,称为KMDF(Kernel-Mode Driver
Framework),为SYS
文本;另一个是用户级的,称为UMDF(User-Mode
Driver Framework),为DLL文件。

那么,对于系统软件程序员,“内功”是如何啊?系统软件是指操作系统本身仍然依附于操作系统上为利用软件提供服务的软件。系统软件或者有机遇跟硬件直接打交道,那给予了程序员更强的控制能力,他们有空子插手操作系统的一举一动逻辑,甚至改变操作系统的一坐一起特征。但随之而来的是对系统软件代码的更高须要。现代操作系统为使用软件提供了很强的容错能力,应用程序的败诉常常不会提到到操作系统自身的安定,但操作系统对系统软件的容错能力却相比较有限,毕竟系统软件运行起来之后也许被融入到操作系统的实践逻辑中变为操作系统的一局部。因而,通晓和左右操作系统的运行机制成为系统程序员编写出正确、高效的连串软件的基本前提。所谓“内功”,便着落在此。

Github:竹林蹊径,驱动开发的局地基本概念。竹林蹊径,驱动开发的局地基本概念。

 

在Windows平台上开发软件,编写Windows内核驱动程序是无与伦比考验程序员“内功”的。内核驱动程序的代码量平常不大,但驱动程序框架中的任何一个函数,甚至这个函数中任何一行代码背后都可能包涵着复杂的逻辑,或者隐式的渴求和若是。固然驱动程序编写者在纯粹自行定义的函数中,也必须谨慎地关怀一些与环境有关的要素,譬如代码是还是不是可被暂停、是不是可重入,或者所引述的内存是不是被换成到外存。另一方面,应用软件开发中的很多概念,比如地址空间、内存管理、非凡处理和多线程并发等,在驱动程序开发中恐怕要求有分歧的知道方法。别的,常用的C运行库函数基本上不再适合于驱动程序了,驱动程序编写者必须直面一个簇新的最底层环境和帮衬平台。因而,要编制可科学运行的驱动程序,程序员不仅要精通地精晓驱动程序所针对的对象设备或效益(可能包涵硬件装备的种种特色),还要控制Windows内核是什么与驱动程序打交道的,以及水源中广大管理和运行机制,尤其是内存管理、线程调度和产出控制。

 

 Windows的驱动开发模型

当Windows内核驱动程序被加载到基本中并且启动之后,它们成为了Windows内核的一片段,驱动程序中的接口函数在合适的时刻被基本调用,那是Windows驱动程序的中坚工作办法。Microsoft定义了WDM(Windows驱动程序模型)来确定驱动程序的构造,以及Windows内核怎么着与WDM驱动程序打交道。WDM不仅蕴涵I/O管理器定义的驱动程序框架,还定义了在驱动程序中哪些支持PnP(Plug
and Play,即插即用)、电源管理和WMI(Windows Management
Instrumentation,Windows管理规范)。因而,若要编写一个截然帮助WDM的驱动程序,也亟需掌握WDM中所涉及的逐条内核组件。

   2.  驱动类型

  在Windows的不等版本上支付的驱动程序
“模型”(模型这些词语应该来自单词“Mode”。在Win
dowsNT上,驱动程序被称为KernelDriverMode驱动程序。
小编以为那个Mode是指一种驱动程序的布局和
运行的正规化),有过差异的名号。比如在Windows9x上的驱动程序,都称之为VXD,而在WindowsNT上的驱动
次第被称作KDM驱动程序,Windows98~2000那个时代出现的新模型叫做WDM。
  Windows的驱动模型概念,本来是就驱动程序的一言一动而言的。比如WDM驱动,必须要满足提供n种被要
求的风味(如电源管理、即插即用)才被称作”WDM驱动”。假如不提供那一个效应,那么统一称为NT式驱动。
一致的,WDF驱动也有它的一多级专业。
  不过本书采纳简便易行的界别方法。将总体在Windows2000~WindowsVista下能正常运转且未调用WDF相
关的内核API函数的驱动都称呼传统型驱动(包罗NT式和WDM)。假如调用了WDF相关的内核API则称为WD
F驱动。
  请小心:WDF驱动是足以调用传统型驱动所调用的内核API的,WDF可以算得传统型的升级版。
  模型的上扬并不是和操作系统版本的升迁齐步走的,而是有一个日渐替代的历程。比如Windows98已
经援救部分的WDM驱动程序,不过又支持部分的VXD驱动。而到了Windows2000,则VXD那种驱动程序完
全被淘汰了。KDM则是WDM的前身。WDM是在KDM的基础上加码了有的新的特点,制定了一部分新的正规而造
就的。绝一大半函数调用都是通用的。当然,Windows9x种类的内核完全分化,所以VXD与之相比较,就没
有一个内核API函数是平等的。
  故而随着Windows9x的打入冷宫,VXD难逃彻底被淘汰的造化。WindowsNT则提升成了新兴的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内核驱动程序与基础的牢牢关联性使得驱动程序的调试极为不便民,从某种意义上讲,驱动程序的调剂等同于Windows内核的调节。而且,对于一些特定的逻辑错误,内核调试器甚至是心有余而力不足的。正因为这么些缘故,内核驱动程序的代码尽可能精简,从软件设计角度而言,应最大程度地把效果代码放到应用程序中,在驱动程序中只留下最必不可少的听从逻辑。那样的规划也可以使Windows内核被不得法驱动程序代码牵连而导致稳定性难题的几率相对收缩。

 驱动分为如下几种类型:

 

为了方便Windows驱动程序的付出,Microsoft定义了一个驱动程序框架,称为WDF(Windows
Driver Foundation),其中针对内核驱动程序的有些号称KMDF(Kernel-Mode
Driver
Framework)。KMDF实际上是一个库,它包裹了WDM中有的要旨的代码逻辑,从而使程序员可以进一步便于地编写出WDM驱动程序。KMDF可以部分地简化Windows内核驱动程序的开发职分,但是精神上它并不曾下落内核驱动程序的扑朔迷离,甚至须要程序员付出额外的读书努力。

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

劳务控制管理程序 SCM
恍如于linux的医护进度(在linux或者unix操作系统中在系统的引导的时候会打开很多劳动,那个服务
就叫做守护进度)

简单的说,作为一名系统程序员,你须求看清目的操作系统中与你的软件打交道的各类部件,也要这些领会地领会您所看重的开发工具是如何协助你完结那或多或少的。系统程序员往往面临着比采取程序员更长的就学曲线,但是,系统程序员从编写程序中获取的野趣也是在接纳层上难以体会得到的。我信任,当你发现自己编写的软件模块已经与操作系统内核融为一体时,那一刻你的觉得自然是手心里攥着一个操作系统——操作系统尽在您的掌控中了。

驱动程序不是自然须求与硬件通信,假诺须求拜访操作系统主旨数据,往往应用程序没有丰硕的权限,这种情形则需求在基本情势下进展走访。就地点5种驱动类型,小编参考着微软的驱动例子开发过
鼠标键盘设备过滤驱动
网络过滤软件驱动程序,所以对驱动开发的精晓仍在浅水区,如在翻阅进度中窥见有误的地点,还请不吝提出。

 

那本书《竹林蹊径——长远浅出Windows驱动开发》是三位小编张佩、马勇和董鉴源的风靡力作,他们将协调在实践中积累起来的经验整理成册,以期待后学者能少走弯路,收缩Windows驱动程序开发的读书之路。那本书根本介绍了KMDF、USB/1394和旋律驱动程序的费用,以及配备驱动程序的批发和安装。指出有早晚Windows驱动程序开发基础的读者看一看那本书,更加是,若是你正打算选取KMDF,或者正在致力与USB/1394或音频驱动程序相关的编程工作,那么,那本书便是一份难得的实施引导了。

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

windows服务在系统启动是加载,用户需在服务控制平台开启或者关闭服务
Driver Service是劳务的一个特例,听从windows服务的协商
加载和谐在NT驱动分为四个步骤:
1.为NT驱动创立新的劳务
2.敞开此项服务
3.闭馆此项服务
4.去除NT驱动创造的服务
以上三个步骤都是通过SCM组建的劳务来已毕的。

潘爱民

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

 

二〇一〇年17月5日于巴黎西二旗

   3.  开发环境

IO请求包-IRP

 

 

IRP(IO请求包)用于win32和驱动程序通信,NT内核有一个零件叫做IO管理器。IO管理器肩负IRP的散发
,驱动程序里创造好装备并且创办好标志链接后,Win32就足以加载驱动了。而要让一个驱动可以处理I
RP,必需给驱动添加IRP处理例程。

驱网宗旨技术丛书

Visual Studio +
WDK(Windows Driver Kit)

丰裕的格局就是再DriverEntry里面对驱动对象DriverObject操作。该参数是一个指针,指向驱动对象,
使得对象内部有一个MajorFunction数组,该数组的品种是
NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject,IN PIRP
Irp) 。这是一个函数指
针,指向每个IRP对于的处理例程。最终就是为所有要求处理的IRP已毕对应的例程。

竹林蹊径:长远浅出Windows驱动开发

其中WDK需求协调手动下载安装

 

张佩 马勇 董鉴源 编著

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

ISBN 978-7-121-12555-3

 

2011年2月出版

   4.  实现方式

定价:69.00元

 

16开

WDM vs WDF

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

 

532页

依照WDF的驱动开发

WDF的支出要求遵守一定的条条框框,开发完结时索要考虑较多的细节,由于篇幅有限,作者凭着自己的阅历暂且稍做列举,后续将写一篇针对WDF驱动开发的篇章。

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

 

   5.  驱动安装

 

测试环境下安装驱动前

付出的驱动程序没有开展签字或者使用测试签名,则必要在装置上打开测试格局,具体操作为:打开控制台,输入:

bcdedit /set testsigning on

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

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

bcdedit /set testsigning off

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

 

本书是小编根据连年的办事学习经验,计算的直接驱动开发资料。本书越多的是经验之谈,一些举办中的小发现小意外,颇为书中情节添彩。

以服务的款式运行

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

 

本书的特色之一,是对WDF框架做了较多的切入。本书第四个关键内容是(第3~7章)围绕WDF而展开探讨,侧重点各有分歧。第3章以框架为商讨的为主;第4、5两章以WDF框架开发USB和1394使得;第6章讲述内核C++编程,也以WDF框架为蓝本;第7章讲述WDF驱动的测试和调剂。

动用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.  驱动签名

 

其次个主要内容是关于音摄像驱动开发(第10~11章)。音摄像驱动包涵AVStream架构,本书做了较详细的论述。第10章讲述使用AVStream小端口架构,第11章讲述ASIO音频驱动开发。

测试环境

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

 

其多个重大内容是有关设备驱动装置(第12~14章)。第12章讲系统设置模块,从总体角度阐释系统和装置驱动怎么样协作完好地展开工作;第13章讲述INF安装文件的底细,包涵各类域的效劳,以及许多设置指令的应用。第14章讲如何编写驱动装置软件。

生产条件

从Win10起来,驱动文件包不仅要求开展增添验证
(EV)
代码签名,还亟需付出到硬件开发为主仪表盘,具体操作指南可以参见此处,你可以在该文档上找到驱动签名所需的其余内容。

 

剩下的局地章节,分别是关于驱动入门(第1、2章)、Windbg调试命令(第8章)、内核同步(第9章)等内容。

本书适合一般入门级内核程序员,对WDF有趣味,准备开发USB或1394设备驱动者,本书尤其有用。本书对于入行较久,经验丰硕的程序员,也持有一定的参考价值。

发表评论

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

网站地图xml地图