Windows驱动开发入门指引

   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驱动程序入门:

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

Github:

 

 

 Windows的驱动开发模型

   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版本的例子,请读者注意识别。

 驱动分为如下几种类型:

 

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

服务控制管理程序 SCM
类似于linux的守护进程(在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务
就叫做守护进程)

发表评论

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