驱动开发的一些基本概念

   1.  前言

WDK(Windows Driver Kit)是一种完全集成的驱动程序开发系统,它包含 Windows DDK,用于测试 Wi
ndows 驱动器的可靠性和稳定性.

因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结。

WDM 是 Win32设备驱动程序体系结构

对于驱动开发的开发指引,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一系列典型的例程源码用于开发人员参考。开发人员在具备一定的驱动概念知识后,通过参考官方例程可以很容易实现拥有特定功能的驱动应用程序。

Windows设备驱动程序,过去是WDM(Windows Driver Model)框架,编程复杂,初学者难以掌握其编程
要领。为了解决这一问题,微软对WDM驱动程序的架构做了改进,形成了全新的WDF(Windows Driver F
oundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。从现
在开始,掌握Windows设备驱动程序的开发人员,由过去的“专业”人士,将变为“普通”大众。

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实例的章节,都采用了传统型驱动进行说明。比如磁盘过滤、文件系统
过滤和网络中间层驱动。此外为了从简单入手,对于入门级的两个例子(串口和键盘)也使用了传统型
太阳集团所有网址16877,驱动。但是虚拟磁盘和虚拟网卡(第5章和第11章),使用了WDF版本的例子,请读者注意识别。

 驱动分为如下几种类型:

 

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

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

驱动程序不是一定需要与硬件通讯,如果需要访问操作系统核心数据,往往应用程序没有足够的权限,这种情况则需要在内核模式下进行访问。就上面5种驱动类型,笔者参考着微软的驱动例子开发过 鼠标键盘设备过滤驱动网络过滤软件驱动程序,所以对驱动开发的理解仍在浅水区,如在阅读过程中发现有误的地方,还请不吝指出。

 

采用的驱动类型关乎到代码的实现(需不需要考虑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 和电源管理完全无关的环境中运行。

 

   3.  开发环境

IO请求包-IRP

 

IRP(IO请求包)用于win32和驱动程序通讯,NT内核有一个组件叫做IO管理器。IO管理器负责IRP的分发
,驱动程序里创建好设备并且创建好符号链接后,Win32就可以加载驱动了。而要让一个驱动可以处理I
RP,必需给驱动添加IRP处理例程。

本文由太阳集团所有网址16877发布于www.16877.com,转载请注明出处:驱动开发的一些基本概念

您可能还会对下面的文章感兴趣: