使得开发的有的基本概念

   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
文本;另一个是用户级的,称为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内核被不得法驱动程序代码牵连而导致稳定性难点的几率相对减弱。

发表评论

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