MSDN Kernel-Mode Driver Architecture学习笔记(2)——Windows Driver Model (1)

来源:互联网 发布:中国史前文明 知乎 编辑:程序博客网 时间:2024/04/29 19:56

随学随记,暂时未经编程验证 Written by HOOK_TTG(Jamie Jiang)

 

1、            WDM概述

为了让驱动程序开发者编写的设备驱动可以在源代码上兼容所有的微软Windows操作系统,引入了Windows Driver Model(WDM=Windows驱动程序模型)。符合WDM规则的内核模式驱动程序称之为WDM 驱动程序。

所有的WDM驱动程序必须符合以下几点:

l  包含 wdm.h头文件,不是ntddk.h头文件。(wdm.hntddk.h的子集)

l  用于设计总线驱动程序、功能驱动程序或者过滤驱动程序。

l  MSDN WDM Device Objects and Device Stacks章节中将介绍如何创建设备对象。

l  支持即插即用(PnP)。

l  支持电源管理。

l  支持Windows Management Instrumentation(WMI=Windows管理规范)

WDK中包括非WDM驱动程序吗?

Windows驱动程序开发工具包(WDK)侧重于内核模式WDM驱动程序的开发,但是也包含不符合WDM规则的内核模式驱动程序的开发信息。这些信息方便我们维护当前存在的非WDM驱动程序,以及编写新驱动程序与这些已存在的驱动程序进行连接。

         我们总是要写WDM驱动程序吗?

如果我们要写一个新的内核模式驱动程序,那么最好是WDM驱动程序,除非我们写的程序需要插入到非WDM驱动程序栈中。请阅读微软提供的特定类型设备的驱动程序文档,确定新的驱动程序必须怎么与微软提供的驱动程序的接口对接。(这个特定类型设备信息在WDK文档的 Device and Driver Technologies章节中。)

注意:所有新的驱动程序栈最好由WDM驱动程序组成。

无论开发WDM或者非WDM驱动,都需要考虑跨平台的问题。更多信息,参看 MSDN Writing Drivers for Multiple Platforms and Operating System章节。

如果要开发一个新的WDM驱动程序,应该考虑使用 内核模式驱动程序框架(KMDF)。KMDF提供了比WDM还简单的接口。

2、            WDM驱动程序的类型

WDM驱动程序有三种类型:

Bus drivers(总线驱动程序):驱动一个单独的I/O总线设备,并提供设备无关的插槽功能。总线驱动程序还会检测和报告连接到此总线的子设备。

Function drivers(功能驱动程序):驱动一个单独的设备。

Filter drivers(过滤驱动程序):为设备、类型设备或者总线过滤I/O请求。

在这里,总线是一种可以连接其他物理、逻辑或者虚拟设备的装置。总线还包括一些传统的总线,例如SCSIPCI,还有并口、串口和i8042端口。

对于驱动程序编写者来说,懂得WDM类型之间的不同之处,和当前正在编写的驱动程序的类型是很重要的。例如,是否每个驱动程序都要处理每一个即插即用IRP,还有如何处理这些IRP,这都取决于当前所写的驱动程序的类型。

下图显示了总线驱动程序、功能驱动程序和过滤驱动程序之间的关系。

Figure for Relationship between WDM drivers

 

驱动程序可能的层次

每个设备通常有一个父I/O总线驱动程序、一个该设备的功能驱动,并且还有零个或者多个该设备的过滤驱动程序。驱动程序设计成需要需要过滤驱动程序的话,会丧失一些性能。

上表中驱动程序解释如下:

1.         一个总线驱动程序服务一个总线控制器、适配器或者电桥。总线驱动器需要驱动程序,机器上每种类型的总线都有一个总线控制器。微软为大多数总线提供了总线驱动程序。IHVs(独立硬件提供商)和OEMs(原始设备制造商)也会提供其他的总线驱动程序。

2.         总线过滤驱动程序通常是对一个总线的功能增强,由微软或者系统OEM提供。每个总线可以拥有任意数目的总线过滤驱动程序。

3.         低等级的过滤驱动程序通常是修改设备硬件的行为。它们是可选的,并且有IHVs提供。每个设备可以有很多低等级的过滤驱动程序。

4.         功能驱动程序是设备的主驱动程序。功能驱动程序是必须的(除非这个设备使用raw mode(原始模式)),通常由设备制造厂商编写。

5.         上一等级过滤驱动程序通常是为设备提供附加的特性。它是可选的,并且通常有IHVs提供。

下面分别介绍这三类驱动程序:

l  Bus Drivers(总线驱动程序)

一个总线驱动程序为一个总线控制器、适配器或者电桥提供服务。微软为大多数总线提供了总线驱动程序。例如PCIPnpISASCSIUSB。其他的总线驱动程序则由IVHsOEMs提供。总线控制器需要驱动程序,而且机器上的每种类型的总线都有一个总线驱动程序。如果一台机器上具有多个同类总线,那么一个总线驱动程序就为不知一个总线提供服务了。

总线驱动程序的主要责任是:

n  枚举总线实现的设备。

n  响应即插即用IRPs和电源管理的IRPs

n  总线的多重访问(有些总线需要这样)。

n  通常管理其总线上的设备。

总线驱动程序本质上也是一个功能驱动程序,而且也会枚举它的子总线。

在枚举期间,总线驱动程序识别其总线上的设备,并且为这些设备创建设备对象。(更多关于设备对象的信息,参看 MSDN中的 Device Objects and Device Stacks章节。)总线驱动程序识别连接的设备的方法取决于特定的总线。

        总线驱动程序会为其总线上的设备执行某些操作,包括访问设备的寄存器来在物理上改变设备的电源状态。例如,当设备要进入休眠状态时,总线驱动程序就会设置设备的寄存器使设备处于合适的设备功率状态。

        需要注意的是,无论什么情况,总线驱动程序都不会处理其总线所连接子设备的读写请求。这些子设备的读写请求由这些设备的功能驱动程序来处理。只有一个例外,如果子设备是以raw mode(原始模式)来使用的话,那么它的父总线驱动程序将处理其读写请求。

        由于总线驱动程序为它的控制器、适配器或者电桥起到了功能驱动程序的作用,所以它也会管理这些部件的设备电源策略。

        总线驱动程序也可以实现成一个驱动程序/微驱动程序对(driver/minidriver pair),这样一来,一个SCSI端口/微端口(port/miniport)驱动程序对驱动一个SCSI主机总线适配器(HBA)。在这种驱动程序对中,微驱动程序(minidriver)是个DLL文件,并且连接到另一个驱动程序。

l  Function Drivers(功能驱动程序)

功能驱动程序是设备的主驱动程序(参看上面的驱动程序可能的层次图)。功能驱动程序通常有设备制造商提供,并且是必须的(除非以原始模式使用这个设备)。PnP管理器只为每个设备加载一个功能驱动程序,并且也只加载一个。一个功能驱动程序可以为一个或者多个设备提供服务。

        功能驱动程序为它的设备提供可操作的接口。通常,功能驱动程序处理对设备的读写操作,还有管理设备电源策略。

        设备的功能驱动程序可以实现成一个驱动程序或者微驱动程序对(driver/minidriver),就像一个端口/微端口(port/miniport)驱动程序对或者类型/微类型(class/miniclass)驱动程序对一样。在这种驱动程序对中,微驱动程序是一个DLL文件,并且连接到另一个驱动程序上。

        如果一个设备以原始模式驱动的话,则没有功能驱动程序和上一层或者低等级的过滤驱动程序。所有的原始模式I/O操作将由总线驱动程序和可选的总线过滤驱动程序负责。

l  Filter Drivers(过滤驱动程序)

过滤驱动程序是可选的,用来增强或者修改设备的行为。一个过滤驱动程序可以为一个或者多个

设备提供服务。

n  总线过滤驱动程序:是可选的,通常用于增加一个总线的功能,由微软或者系统OEM提供。

一个总线可以许多个总线过滤驱动。可以用来专门增强标准总线硬件的功能。

对于支持ACPI(高级配置和电源管理接口) BIOS的设备,电源管理器将为这个每个此类设备在总线驱动程序上插入一个微软提供的ACPI过滤器(一个总线过滤驱动程序)。这个ACPI过滤器执行设备电源策略和断开和接通设备的电源。ACPI过滤器对其他驱动程序是透明的,而且在非ACPI机器上将没有ACPI过滤器。

n  Lower-Level Filter Drivers(低级过滤驱动程序):通常用来修改设备的硬件行为,也是可选的,主要由IHVs提供。每个设备可以有许多个此类驱动程序。

底层设备的过滤驱动程序监控并且可以修改某一设备的I/O请求。通常,此类过滤器用于重定义硬件行为来符合期望的技术规范。

底层类型过滤驱动程序监控并且可以修改一个类型设备的I/O请求。例如,一个鼠标设备的底层类型过滤驱动程序可以为鼠标的移动数据提供加速度和非线性转换性能等功能。

n  Upper-Level Filter Drivers(高级过滤驱动程序):通常是对设备特性的增强,也是可选的。主要由IVHs提供。每个设备可以有多个此类驱动程序。

高级设备过滤驱动程序可以为某些设备的增加功能。例如,此类驱动程序可以为一个键盘

增加安全检查的功能。

 高级类型过滤驱动程序可以为所有的类型设备增加功能。

     下面是一个WDM驱动程序层次的例子: 这里将以一套可能的USB硬件WDM驱动程序组来阐述WDM驱动程序的层次。

         下图显示了一个USB游戏杆的PnP硬件配置样例。

                  Pnp hardware configuration for USB joystick

在上图中,一个USB游戏杆插入了USB hub的一个端口。这个USB hub为一个USB 主控制器板上,并且被插在这个板上的一个单独的端口。这个USB主控制器插在了一个PCI总线上。从PnP角度来说,这个USB hubUSB主控制器和PCI总线都是总线设备,因为他们都提供了端口。而这个游戏杆就不是一个总线设备。

下图显示了如何为上图那个USB游戏杆硬件加载驱动程序。

drivers that might be loaded for the USB joystick hardware

从上图底部开始,在示例的栈中包括以下驱动程序:

n  一个PCI驱动程序,用于驱动PCI总线。这是一个PnP总线驱动程序,由微软的系统提供。

n  这个总线驱动程序被实现成了一个类型/微类型驱动程序对。这种类型/微类型驱动程序由微软的系统提供。

n  这个USB hub总线驱动程序用于驱动USB hub。这个USB hub驱动程序由微软的系统提供。

n  这个游戏杆设备有三个驱动程序;其中一个是类型/微类型对。

其中功能驱动程序是游戏杆设备的主驱动程序,而且是一个HID 类型驱动程序/HID USB 微类型驱动程序对。这个HID USB微类型驱动程序支持具备USB特性的HID设置,而且依靠HID类型驱动程序DLL对普通的HID提供支持。

         功能驱动程序可以专门为某个设备服务;或者,对于HID,功能驱动程序可以为一组此类设备提供服务。在这个例子中,HID类型驱动程序/HID USB微类型驱动程序为系统中USB总线上的任何一个HID兼容设备提供服务。一个HID类型驱动程序/HID 1394微类型驱动程序对可以为一条1394总线上的任何HID兼容设备提供服务。

         这个例子中,游戏杆设备有两个过滤驱动程序:一个高级类型过滤驱动程序——增加了一个宏按钮特性,一个低级设备过滤驱动——使这个游戏杆可以模拟一个鼠标设备。

         这个高级过滤驱动程序可以由任何人来编写,而低级过滤驱动程序则由游戏杆制造商编写。

这些内核模式和用户模式HID(人机接口设备)客户端,还有应用程序都是不是驱动程序。在上图显示出来是为了结构上的完整。

 

 

 

原创粉丝点击