1.  前言

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

Windows的驱动开发模型

因工作上种类的急需,小编须求做驱动相关的开销,此前并从未接触过相关的学识,折腾一段时间下来,功效如需兑现了,也积累了部分经历和见地,所以在此做番统计。

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
Windows驱动开发入门率领,Windows的驱动开发模型。文件;另一个是用户级的,称为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
和电源管理完全毫不相关的环境中运行。

 

二〇一〇年1五月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装置驱动者,本书尤其有用。本书对于入行较久,经验丰盛的程序员,也享有一定的参考价值。

相关文章