澳门新浦京8455com:开采职员在全数一定的驱动概念知识后,在Windows的不相同版本上开荒的驱动程序

笔者是在Windows平台上开发,使用的开发环境为
Visual Studio 2013 + WDK 8.1

添加的方法就是再DriverEntry里面对驱动对象DriverObject操作。该参数是一个指针,指向驱动对象,
驱动对象内部有一个MajorFunction数组,该数组的类型是
NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject,IN PIRP
Irp) 。这是一个函数指
针,指向每个IRP对于的处理例程。最后就是为所有需要处理的IRP实现对应的例程。

这个观点既适用于应用软件程序员,也适用于系统软件程序员。对于应用软件程序员,低层的应用开发平台是支撑应用开发的基础,譬如,基于Windows
SDK来开发Windows应用程序。那么,程序员有必要理解Windows
SDK中的基本要素,诸如消息分发机制、各种图形功能等。在这种情况下,阅读一些典型的例子程序代码往往能起到快速引领入门的效果。同样地,C/C++程序员如果局限于C/C++语言本身,很难编写出高质量的实用程序。他们不仅要掌握C/C++运行库中函数和类型的用法,甚至还要理解这些函数和类型的实现机理。即使源代码层面上的库,例如STL(C++的标准模板库),也需要理解其代码实现才能灵活自如地用好这些库(比如STL中的各种容器数据结构、迭代器或算法)。

   
在Windows的不同版本上开发的驱动程序“模型”(模型这个词语应该来源于单词“Mode”。在Windows
NT上,驱动程序被称为Kernel Driver
Mode驱动程序。笔者认为这个Mode是指一种驱动程序的结构和运作的规范),有过不同的名称。比如在Windows
9x上的驱动程序,都叫做VXD,而在Windows
NT上的驱动程序被称为KDM驱动程序,Windows
98~2000这个时期出现的新模型叫做WDM。
澳门新浦京8455com,   
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版本的例子,请读者注意识别。

   2.  驱动类型

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

为了便于Windows驱动程序的开发,Microsoft定义了一个驱动程序框架,称为WDF(Windows
Driver Foundation),其中针对内核驱动程序的部分称为KMDF(Kernel-Mode
Driver
Framework)。KMDF实际上是一个库,它封装了WDM中一些基本的代码逻辑,从而使程序员可以更加方便地编写出WDM驱动程序。KMDF可以部分地简化Windows内核驱动程序的开发任务,但是本质上它并没有降低内核驱动程序的复杂性,甚至需要程序员付出额外的学习努力。

Windows的驱动开发模型

 

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

本书的特色之一,是对WDF框架做了较多的切入。本书第一个主要内容是(第3~7章)围绕WDF而展开讨论,侧重点各有不同。第3章以框架为讨论的中心;第4、5两章以WDF框架开发USB和1394驱动;第6章讲述内核C++编程,也以WDF框架为蓝本;第7章讲述WDF驱动的测试和调试。

 

Visual Studio +
WDK(Windows Driver Kit)

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

本书适合一般入门级内核程序员,对WDF有兴趣,准备开发USB或1394设备驱动者,本书尤其有用。本书对于入行较久,经验丰富的程序员,也具有一定的参考价值。

基于WDF的驱动开发

WDF的开发需要遵循一定的规则,开发实现时需要考虑较多的细节,由于篇幅有限,笔者凭着自己的经验暂且稍做列举,后续将写一篇针对WDF驱动开发的文章。

  • PNP和电源管理(WDF已经帮忙封装了大部分的接口);
  • 各种对象:驱动对象,设备对象,WDF对象,文件对象,队列对象;
  • 驱动上下文:有时称为设备扩展,用于存储特定设备对象的相关信息的数据结构;
  • 对象的释放:需要考虑不同性质对象释放的时机;
  • 中断请求级别:处理不当易导致蓝屏;
  • 分页与非分页内存;
  • 同步锁:回调同步锁、框架等待锁、自旋锁、中断锁等;
  • 日志跟踪记录:
    调试的必备,可以采用 WPP(Windows软件追踪预处理器)或简单的
    DebugPrint 输出
  • 与应用程序的通讯:控制代码、IRQ,请求队列

 

   5.  驱动安装

 

IO请求包-IRP

第三个主要内容是关于设备驱动安装(第12~14章)。第12章讲系统安装模块,从总体角度阐述系统和设备驱动如何配合完好地进行工作;第13章讲述INF安装文件的细节,包括各个域的作用,以及诸多安装指令的使用。第14章讲如何编写驱动安装软件。

   1.  前言

 

那么,对于系统软件程序员,“内功”是什么呢?系统软件是指操作系统本身或者依附于操作系统上为应用软件提供服务的软件。系统软件可能有机会跟硬件直接打交道,这赋予了程序员更强的控制能力,他们有机会介入操作系统的行为逻辑,甚至改变操作系统的行为特性。但随之而来的是对系统软件代码的更高要求。现代操作系统为应用软件提供了很强的容错能力,应用程序的失败通常不会波及到操作系统自身的稳定性,但操作系统对系统软件的容错能力却比较有限,毕竟系统软件运行起来之后可能被融入到操作系统的执行逻辑中成为操作系统的一部分。因此,理解和掌握操作系统的运行机制成为系统程序员编写出正确、高效的系统软件的基本前提。所谓“内功”,便着落在此。

 驱动分为如下几种类型:

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

我一直认为,编写程序是一件很奇妙的事情,它可以带来创造和控制的欲望。每当我阅读或者编写一段代码时,脑子里自然地就会想象这段代码怎样完成预定的逻辑。当面对一个不熟悉的开发环境,或者一个新的基础平台时,首先要清楚这个环境或者平台是如何工作的,以及提供了哪些功能。代码本身可能非常复杂,甚至奥妙无穷,但通常情况下,真正优美的高质量代码往往是简单的、易于理解的。对于代码编写者或者维护者来说,真正见功夫的地方不在于代码本身,而在于对下层开发平台的理解和驾驭能力,可能这就是俗称的“内功”。

相关文章

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图