WDM驱动程序在2000年左右还是一种很新的东西,相信很多人都跟我一样,对它很感兴趣,但是又找不到学习的切入点。究其原因,还是因为WDM是一种非常“死板板”的程序,它一运行就是工作在Windows系统的底层RING 0处,提供各种接口给应用程序调用。也正因为如此,它不像Windows普通的应用程序一样,可以很快地上手——更多的时候,你是在阅读它的Windows技术资料和各种Windows接口信息,你还要非常地熟悉Windows系统底层的工作原理,否则一个不小心,就“蓝屏”了,不过话说回来,写Windows驱动程序的时候,死机是家常便饭。
因此很多人都对WDM驱动心怀恐惧。而事实上,我刚开始学WDM的时候,在家看书看了整整3天,但是看完之后好像跟没看也差不了多少,还是不知道怎么WDM驱动程序如何入门,甚至连怎么写一个“Hello World”都不知道。也是后来才知道其实WDM驱动程序根本就没有所谓的“Hello World”程序的,苦逼啊,这主要是因为当时网络上的有关WDM驱动程序资料太少,因为WDM真正得到大面积应用是win2000之后。下面我们说说WDM驱动程序前世今生。
WDM驱动程序前世今生
WDM(Windows Driver Model)模型是从WinNT3.51和WinNT4的内核模式设备驱动程序发展而来的。WDM主要的变化是增加了对即插即用、电源管理、Windows Management Interface(WMI)、设备接口的支持。WDM模型的主要目标,是实现能够跨平台使用、更安全、更灵活、编制更简单的Windows设备驱动程序。WDM采用了“基于对象”的技术,建立了一个分层的驱动程序结构。
WDM首先在Windows98中实现,在Windows2000中得到了进一步的完善,并在后续开发的Windows操作系统中都将存在,比如Windows Me和Windows XP。微软在通过WDM模型的引入,希望减轻设备驱动程序的开发难度和周期,逐渐规范设备驱动程序的开发,应该说,WDM将成为以后设备驱动程序的主流。
Windows系列的跨平台兼容能力的价值
Windows设备驱动程序发展的历史微软已经发布了很多的“Windows”操作系统,从开始的Windows3.0到Windows2000和Windows XP。一些底层的技术一直在各个“Windows”平台下共享,而其他的一些技术随版本的不同有了很大的变化。微软发布Win32 API的目的之一,就是鼓励开发者能够编制出在“Windows”平台之间兼容的应用程序。
由于设备驱动程序是与操作系统最低层的功能发生交互,因此,如果要实现跨平台的兼容,首先必须在不同平台的底层结构上做到兼容。Windows3.0的基本结构一直延续到Windows9x家族,虽然后来的操作系统在驱动程序的开发和管理上有了非常大的改变,但底层的基本结构没有变化。也就是说,一个为Windows3.0开发的设备驱动程序,在大多数情况下,可以不加修改的使用在Windows95和Windows98平台下。在Windows3.x,Windows95,Windows98下使用的是虚拟设备驱动(Virtual Device Driver),也称为VxD。
虚拟设备驱动程序,原来的设计目标是为了支持在Windows平台下的设备,它作为动态连接库(DLL)链接到操作系统里,工作在保护模式下(ring 0)。VxDs解决了那些常规应用程序不能完成的工作,比如直接硬件的读写,也可以说,使用VxD是扩展操作系统内核的一种方法。VxDs最初的编写采用的是Intel汇编语言,后来随着VtoolsD的使用,使用C和C++也开始流行起来。
Windows NT的设计目标
Windows NT的设计体现了更现代和模块化的内部体系,它的目标是更好的灵活性和更加的健壮,兼容Windows3.x和Windows9x并不是它的设计目标,因此,Windows NT的内部体系中没有提供对以前Windows平台的兼容。NT采用了一种特有的内核模式驱动程序体系,一般也采用C语言来编写。
当NT下的驱动程序需要直接控制机器时,它会向硬件抽象层(HAL)发出请求。硬件抽象层建立在驱动程序和实际的硬件之间,为驱动程序隐藏了硬件的不同,这样就可以编制出跨处理器(比如Pentium和Alpha)、源代码兼容的设备驱动程序。因为Windows NT可以工作在单处理器和多处理器环境中,驱动程序必须十分小心的保护关键的数据结构。Windows NT提供了一种分层的体系结构,每一个NT设备驱动程序有一个低层和一个上层接口。低层的驱动程序直接控制硬件。在低层和上层驱动程序之间的是中间层驱动程序。Windows NT也定义了一种类驱动程序体系,并且支持某些设备类。比如,系统中有SCSI类驱动程序支持SCSI磁带设备和SCSI磁盘。Windows NT的这种驱动程序体系,在Windows 98和Windows 2000中得到了继承和扩展,形成了现在的WDM体系。
认识到跨平台兼容能力的价值后,微软开始尝试统一设备体系,给未来的驱动程序开发提供一个简单的平台。微软的做法,不是重新开发一套新的体系,而是在更合理的Windows NT体系的基础上,进行必要的完善,从而形成一个新的设备驱动程序体系,称为Windows driver model,或WDM,在更早的技术文档中,微软也曾用过Win32 Driver Model这个名字。Windows 98最先支持WDM,微软随后推出的操作系统中也都支持WDM,包括Windows 2000系列,Windows Me,Windows XP,但不包括Win CE。
WDM驱动程序模型概论
WDM模型主要采用分层的方法,模仿面向对象的技术,按照微软一贯的思路,先进行逻辑上的“分层”,然后将标准的实现和低层细节“封装”起来,形成“基类”,客户程序通过“继承”的方式来扩展“基类”的功能,完成所需要的实现。在微软的技术文献中,称Windows NT和Windows 2000为“基于对象”(object-based)的系统,和操作系统一样,WDM驱动程序模型也是“基于对象”的系统。
我们知道,在系统中既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此的通信,这样的方法才称为“面向对象的方法”。如果仅使用对象,则这种方法可以称为“基于对象”的方法。“基于对象”的方法虽然不能得到“面向对象”的所有优点,但依然可以使系统的设计、分析和理解更加的清楚。