八、 Windows驱动程序模型
Windows环境下驱动程序共有三类,一类是VxD( Virtual Device Driver,虚拟设备驱动程序),起源于Windows 3.1 时代,用于Windows 95/98/Me操作系统中;一类是KMD( Kernel Mode Driver,内核模式驱动程序),用于Windows NT下;还有一类就是WDM(Win32 Driver Mode,Win32驱动程序模型),是微软从Windows 98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,毫不夸张地讲,WDM算得上是21世纪的驱动程序框架。
WMD驱动程序模型
应用程序通过API函数调用Win32系统子函数,驱动程序分为设备驱动程序,总线驱动程序(USBD)和主控制器驱动程序(HCD)三层,它们均运行在系统的内核模式。设备驱动程序使用IRP(I/ORequest Packet)通过总线驱动程序提供的软件接口(USBDI,USB Driver Interface)向总线驱动程序发出I/O请求,并根据数据传输方向提供一个或空或满的内存缓冲区;USBD负责管理数据的总线传输,也有设备驱动程序与其他软件接口的功能单元进行通信,没有直接调用USBD,但总有一个更低层的驱动软件发生USBD调用。主控制器驱动程序处在USB系统软件的最底层,直接与主控制器的硬件通信,它提供了只有总线驱动程序才能访问的主控制器驱动程序软件接口HCDI(Host CONTROL Driver Interface)。其中,总线驱动程序和主控制器驱动程序是系统的底层驱动程序。设备驱动程序是针对某一USB设备的专用驱动程序。
Windows为USB设备提供了底层驱动程序,与底层驱动程序接口的是I/O请求包(IRP),Windows为应用程序提供的接口则是API函数。因此必须在它们之间建立一个驱动程序,在底层驱动与Win32应用程序之间传递消息,即设备驱动程序。VC++、VB等软件开发的应用程序,在设备驱动程序的支持下,都可以调用ReadFile()、WriteFile()、DeviceIoCONTROL()等API函数向设备传递主机请求。Windows系统自动将API调用转化为IRP,设备驱动程序把它向下层驱动传递。直到完成其所指定的功能再沿驱动程序栈返回主机。
WDM还引入了功能设备对象FDO(Functional Device Object)与物理设备对象