WDK(Windows Driver Kit)是一种彻底集成的驱动程序开发系统,它包含 Windows DDK,用于测试 Wi
ndows 驱动器的可靠性和稳定性.linux
WDM 是 Win32设备驱动程序体系结构程序员
Windows设备驱动程序,过去是WDM(Windows Driver Model)框架,编程复杂,初学者难以掌握其编程
要领。为了解决这一问题,微软对WDM驱动程序的架构作了改进,造成了全新的WDF(Windows Driver F
oundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大下降了开发难度。从现
在开始,掌握Windows设备驱动程序的开发人员,由过去的“专业”人士,将变为“普通”大众。编程
WDF驱动程序包括两个类型,一个是内核级的,称为KMDF(Kernel-Mode Driver Framework),为SYS
文件;另外一个是用户级的,称为UMDF(User-Mode Driver Framework),为DLL文件。windows
Windows的驱动开发模型数组
在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操做系统中在系统的引导的时候会开启不少服务,这些服务
就叫作守护进程)数据结构
windows服务在系统启动是加载,用户需在服务控制平台开启或者关闭服务
Driver Service是服务的一个特例,遵循windows服务的协议
加载和谐在NT驱动分为四个步骤:
1.为NT驱动建立新的服务
2.开启此项服务
3.关闭此项服务
4.删除NT驱动建立的服务
以上四个步骤都是经过SCM组建的服务来实现的。架构
IO请求包-IRP框架
IRP(IO请求包)用于win32和驱动程序通信,NT内核有一个组件叫作IO管理器。IO管理器负责IRP的分发
,驱动程序里建立好设备而且建立好符号连接后,Win32就能够加载驱动了。而要让一个驱动能够处理I
RP,必需给驱动添加IRP处理例程。函数
添加的方法就是再DriverEntry里面对驱动对象DriverObject操做。该参数是一个指针,指向驱动对象,驱动对象内部有一个MajorFunction数组,该数组的类型是NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) 。这是一个函数指针,指向每一个IRP对于的处理例程。最后就是为全部须要处理的IRP实现对应的例程。