笔者需要做驱动相关的开发,编写Windows内核驱动

时间:2019-10-04 14:47来源:手机美高梅游戏网址
   1.  前言 WDK(Windows DriverKit)是一种完全集成的驱动程序开发系统,它包含 Windows DDK,用于测试Wi ndows 驱动器的可靠性和稳定性. 推 荐 序 因工作上项目的需要,笔者需要做驱动相关

   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 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或音频驱动程序相关的编程工作,那么,这本书便是一份宝贵的实践指导了。

编辑:手机美高梅游戏网址 本文来源:笔者需要做驱动相关的开发,编写Windows内核驱动

关键词:

  • 上一篇:没有了
  • 下一篇:没有了