第三卷内核模式驱动程序设计指南 第一部分一般内核模式
1 第三卷 内核模式驱动程序设计指南 第一部分 一般内核模式
第一部分一般内核模式 第1章 Windows2000和WM驱动程序 第2章分层的I/0、IRP和I/0对象 第3章系统定义的对象和对驱动程序的支持 第4章驱动程序基本结构 第5章 Driver Entry和 Reinitialize例程 第6章 Dispatch例程 第7章 Startle和队列管理例程 第8章中断服务例程 第9章 DpcForIsr例程和 CustomDpc例程 第10章 SynchCritSection例程 第11章 Adapter Control和 Controllercontrol例程 第12章 Cancel例程 第13章 InCompletion例程 第14章 LoRimer和 CustomTimerDpc例程 第15章 Unload例程 第16章常见的驱动程序设计问题
2 第一部分 一般内核模式 第 1 章 Windows 2000 和 WDM 驱动程序 第 2 章 分层的 I/O、IRP 和 I/O 对象 第 3 章 系统定义的对象和对驱动程序的支持 第 4 章 驱动程序基本结构 第 5 章 DriverEntry 和 Reinitialize 例程 第 6 章 Dispatch 例程 第 7 章 StartIo 和队列管理例程 第 8 章 中断服务例程 第 9 章 DpcForIsr 例程和 CustomDpc 例程 第 10 章 SynchCritSection 例程 第 11 章 AdapterControl 和 ControllerControl 例程 第 12 章 Cancel 例程 第 13 章 IoCompletion 例程 第 14 章 IoTimer 和 CustomTimerDpc 例程 第 15 章 Unload 例程 第 16 章 常见的驱动程序设计问题
第1章 Windows2000和WM驱动程序 本章叙述了什么是 Windows2000内核模式驱动程序,介绍了一些重要的驱动程序名词,并 总结了内核模式驱动程序的设计目标,解释为了满足这些设计目标, Windows2000(和 WDM)的内核模式驱动程序如何不同于其他操作系统的驱动程序 本章内容组织如下: 1.1 Windows2000组件一览 1.2 Windows2000中的驱动程序种类 1.3 Windows2000和wDM驱动程序设计目标 1.3.1移植性 1.3.2可配置性 1.3.3永远抢占优先和永远中断 1.3.4多处理器安全 1.3.5基于对象 1.3.6带有可复用IRP的包驱动I/0 1.3.7支持异步I/0 关于 Windows nt/ Windows2000操作系统环境的更多细节,可以参看 David solomon的 《 Inside windows n》(微软出版社,1998) 1.1 Windows2000组件一览 图1.1显示了 Microsoft windows2000操作系统环境的主要组件。 图1.1 Windows2000组件一览 在 Windows2000操作系统环境中,一部分组件运行在用户模式下,其他的则运行在内核模 式下。文件系统、中间层和最低层驱动程序被显示在图的左下方,其中包含了内核模式 I/0管理器。 如图1.1所示, Windows2000操作系统包括了许多内核模式组件,它们被精心地定义为功 能相互独立的组件。对内核模式驱动程序设计者来说,最感兴趣的就是内核Ⅰ/O管理、即 插即用管理( Plug and Play manager)、电源管理( Power Manager)、硬件抽象层 ( Hardware Abstraction Layer,HAL)、配置管理( Configuration Manager)、存储管 理( Memory Manager)、运行支持( Executive Support)和过程结构( Proce Structure)组件。对另一些设计者来说,感兴趣的其他组件可能包括对象管理( Ob ject Manager)和安全引用监控器( Security Reference Monitor) 即插即用(PnP)管理和电源管理是 Windows2000中的新组件。他们仅仅支持 Windows 2000驱动程序和WM驱动程序。有关 Windows2000和wDM驱动程序使用这些 Microsoft 操作系统新特性的更详细资料,请参见《 Windows2000驱动程序开发参考》的第1卷《即 插即用、电源管理和安装设计指南》
3 第1章 Windows 2000 和 WDM 驱动程序 本章叙述了什么是 Windows 2000 内核模式驱动程序,介绍了一些重要的驱动程序名词,并 总结了内核模式驱动程序的设计目标,解释为了满足这些设计目标,Windows 2000(和 WDM)的内核模式驱动程序如何不同于其他操作系统的驱动程序。 本章内容组织如下: 1.1Windows 2000 组件一览 1.2Windows 2000 中的驱动程序种类 1.3Windows 2000 和 WDM 驱动程序设计目标 1.3.1 移植性 1.3.2 可配置性 1.3.3 永远抢占优先和永远中断 1.3.4 多处理器安全 1.3.5 基于对象 1.3.6 带有可复用 IRP 的包驱动 I/O 1.3.7 支持异步 I/O 关于 Windows NT/Windows 2000 操作系统环境的更多细节,可以参看 David Solomon 的 《Inside Windows NT》(微软出版社,1998)。 1.1 Windows 2000 组件一览 图 1.1 显示了 Microsoft Windows 2000 操作系统环境的主要组件。 图 1.1 Windows 2000 组件一览 在 Windows 2000 操作系统环境中,一部分组件运行在用户模式下,其他的则运行在内核模 式下。文件系统、中间层和最低层驱动程序被显示在图的左下方,其中包含了内核模式 I/O 管理器。 如图 1.1 所示,Windows 2000 操作系统包括了许多内核模式组件,它们被精心地定义为功 能相互独立的组件。对内核模式驱动程序设计者来说,最感兴趣的就是内核 I/O 管理、即 插即用管理(Plug and Play Manager)、电源管理(Power Manager)、硬件抽象层 (Hardware Abstraction Layer,HAL)、配置管理(Configuration Manager)、存储管 理(Memory Manager)、运行支持(Executive Support)和过程结构(Process Structure)组件。对另一些设计者来说,感兴趣的其他组件可能包括对象管理(Object Manager)和安全引用监控器(Security Reference Monitor)。 即插即用(PnP)管理和电源管理是 Windows 2000 中的新组件。他们仅仅支持 Windows 2000 驱动程序和 WDM 驱动程序。有关 Windows 2000 和 WDM 驱动程序使用这些 Microsoft 操作系统新特性的更详细资料,请参见《Windows 2000 驱动程序开发参考》的第 1 卷《即 插即用、电源管理和安装设计指南》
1.2 Windows2000中的驱动程序种类 在 Windows2000操作系统中,有两个基本的驱动程序种类: 用户模式驱动程序(例如Win32VDD,它是为MS-DOS应用程序开发的专用设备)或另 一个被保护的子系统的驱动程序 用户模式驱动程序是与子系统细节相关的,我们不在这里讨论。更多VD的细节,参 考在线DDK中的“ Virtual device drivers(虚拟设备驱动程序)”文档。 针对逻辑、虚拟或物理设备的内核模式驱动程序 这些驱动程序作为 Windows nt执行体部分来运行: Windows nt是基础的、基于微内 核的操作系统,它支持一个或更多的保护子系统 些 Windows2000内核驱动程序也是wDM驱动程序,它们符合 Windows驱动程序模型 (wDM)。所有的wM驱动程序是PnP驱动程序,并支持电源管理。WDM驱动程序对 Microsoft windows98和 Windows2000操作系统来说,是源代码兼容的(不是二进 制兼容的)。 在这里,术语“ Windows2000驱动程序”通常指代任何运行于 Windows2000操作系统之 上的内核模式驱动程序(是WDM或不是)。必要的时候,本书会特别指出哪些是WDM驱动 程序,哪些只是 Windows2000驱动程序。名词“早期驱动程序”指的是那些为 Windows NT以前版本写的驱动程序,它们是不支持PnP的。 像操作系统自己,内核模式驱动程序是依据仔细定义的需求功能集,作为单独的、模块化 的组件来实现的。 所有的 Windows2000内核模式驱动程序,包括WDM驱动程序,都包含一组系统定义的标准 驱动程序例程和一些依赖于个别设备需求的内部例程。 图1.2内核模式驱动程序类型 如图1.2所示,有三种基本类型的内核模式驱动程序。每一种都有稍微不同的结构和完全 不同的功能 1.最高层驱动程序,例如系统支持的FAT、NTFS和CDFS文件系统驱动程序(FSD)。最 高层驱动程序通常依赖于较低层的驱动程序支持。 虽然特定的文件系统驱动程序可能、或不可能从一个或多个中间层驱动程序获得支 持,但是每个文件系统驱动程序最终依赖一个或多个下层外围设备(可能是PnP硬件 总线)驱动程序的支持 2.中间层驱动程序,例如虚拟磁盘、镜像、或指定设备类型的类驱动程序。中间层驱动 程序也需要较低层驱动程序的支持。 PnP功能驱动程序是中间层驱动程序,它们在一个I/0总线上控制特定的外围设备, 这个I/0总线是由PnP硬件总线驱动程序来控制的。同样还有PnP过滤器驱动程序 ( Pnp filter driver),它们在驱动程序栈( driver stack)内将它们自己插入到 PP功能驱动程序中去,以支持任何特定的外围设备。PnP功能和过滤器驱动程序的子 集也是WDM功能和过滤器驱动程序。 任何系统支持的向外输出一个系统定义的WDM类/微类接口的类驱动程序,实际上是 个带有一个或多个链接的WM微类驱动程序(有时称为WDM微驱动程序)的中间层驱 动程序。每一对相互链接的WDM类/微类,提供与WDM功能驱动程序或WDM“软件”总 线驱动程序相同的功能 4
4 1.2 Windows 2000 中的驱动程序种类 在 Windows 2000 操作系统中,有两个基本的驱动程序种类: ▪ 用户模式驱动程序(例如 Win32 VDD,它是为 MS-DOS 应用程序开发的专用设备)或另 一个被保护的子系统的驱动程序 用户模式驱动程序是与子系统细节相关的,我们不在这里讨论。更多 VDD 的细节,参 考在线 DDK 中的“Virtual Device Drivers(虚拟设备驱动程序)”文档。 ▪ 针对逻辑、虚拟或物理设备的内核模式驱动程序 这些驱动程序作为 Windows NT 执行体部分来运行:Windows NT 是基础的、基于微内 核的操作系统,它支持一个或更多的保护子系统。 一些 Windows 2000 内核驱动程序也是 WDM 驱动程序,它们符合 Windows 驱动程序模型 (WDM)。所有的 WDM 驱动程序是 PnP 驱动程序,并支持电源管理。WDM 驱动程序对 Microsoft Windows 98 和 Windows 2000 操作系统来说,是源代码兼容的(不是二进 制兼容的)。 在这里,术语“Windows 2000 驱动程序”通常指代任何运行于 Windows 2000 操作系统之 上的内核模式驱动程序(是 WDM 或不是)。必要的时候,本书会特别指出哪些是 WDM 驱动 程序,哪些只是 Windows 2000 驱动程序。名词“早期驱动程序”指的是那些为 Windows NT 以前版本写的驱动程序,它们是不支持 PnP 的。 像操作系统自己,内核模式驱动程序是依据仔细定义的需求功能集,作为单独的、模块化 的组件来实现的。 所有的 Windows 2000 内核模式驱动程序,包括 WDM 驱动程序,都包含一组系统定义的标准 驱动程序例程和一些依赖于个别设备需求的内部例程。 图 1.2 内核模式驱动程序类型 如图 1.2 所示,有三种基本类型的内核模式驱动程序。每一种都有稍微不同的结构和完全 不同的功能: 1. 最高层驱动程序,例如系统支持的 FAT、NTFS 和 CDFS 文件系统驱动程序(FSD)。最 高层驱动程序通常依赖于较低层的驱动程序支持。 虽然特定的文件系统驱动程序可能、或不可能从一个或多个中间层驱动程序获得支 持,但是每个文件系统驱动程序最终依赖一个或多个下层外围设备(可能是 PnP 硬件 总线)驱动程序的支持。 2. 中间层驱动程序,例如虚拟磁盘、镜像、或指定设备类型的类驱动程序。中间层驱动 程序也需要较低层驱动程序的支持。 PnP 功能驱动程序是中间层驱动程序,它们在一个 I/O 总线上控制特定的外围设备, 这个 I/O 总线是由 PnP 硬件总线驱动程序来控制的。同样还有 PnP 过滤器驱动程序 (PnP filter driver),它们在驱动程序栈(driver stack)内将它们自己插入到 PnP 功能驱动程序中去,以支持任何特定的外围设备。PnP 功能和过滤器驱动程序的子 集也是 WDM 功能和过滤器驱动程序。 任何系统支持的向外输出一个系统定义的 WDM 类/微类接口的类驱动程序,实际上是一 个带有一个或多个链接的 WDM 微类驱动程序(有时称为 WDM 微驱动程序)的中间层驱 动程序。每一对相互链接的 WDM 类/微类,提供与 WDM 功能驱动程序或 WDM“软件”总 线驱动程序相同的功能
PP软件总线驱动程序表示一组子设备,较高层的类、功能和/或过滤器驱动程序能连 接它们自己到这些子设备上,PmP软件总线驱动程序也是中间层驱动程序。例如,控 制多功能适配器的驱动程序是一个PnP软件总线驱动程序,这样的多功能适配器是用 于不同的设备的一个便携集合。根据便携设备的特性和它的驱动程序使用的接口,这 样的驱动程序也可能是WDM软件总线驱动程序。它似乎使得较高层驱动程序成为一个 PnP/WDM总线驱动程序。对于操作系统来说,驱动程序是以PnP/WDM驱动程序的面目 出现的,它服务于它自己的适配器,将它自己插入底层PP硬件总线驱动程序之上的 驱动程序堆栈中 3.最低层驱动程序,例如PnP硬件总线驱动程序,它控制一个I/0总线,这个总线连了 些外围设备在上面。最低层驱动程序不依赖于较低层驱动程序,而是控制物理外围 设备,例如总线 早期的M设备驱动程序直接地控制物理外围设备,它们是最低层的驱动程序,同样的 驱动程序例如 SCSI HBA( Host Bus Adapter,宿主总线适配器)驱动程序 PnP硬件总线驱动程序是系统提供的,并且通常动态控制可配置的I/0总线。这个驱 动程序通过与即插即用管理协作,为所有连到它所控制的I/0总线上的子设备,配置 和重新配置系统硬件资源(例如设备存储的映射和IRQ)。对其Ⅰ/0总线来说,PnP硬 件总线驱动程序包含了一部分 Windows nt早期版本中由HAL组件提供的功能 Windows2000网络驱动程序也能被划分为上述的基本类型之一。例如,NT服务器或转向器 是一个特定的文件系统驱动程序;传输堆栈中的任何驱动程序都是中间层驱动程序:物理 网卡(有时称为网络接口控制器或NIC)驱动程序则是最低层设备驱动程序。当然 Windows2000为网络设备提供了明确的接口和支持,例如NDIS( Network device Interface Specification,网络设备接口规范)库在网络传输堆栈的下界提供了NC驱动 程序和中间层驱动程序。 本书为文件系统和网络驱动程序设计者提供了一些有用的综述和背景信息,对于内核模式 设备和中间层驱动程序,以及包括WM驱动程序的设计者来说,本书主要是一个设计指 南。网络中间层和设备驱动程序的设计者也应该参考在线DDK中的“ Network driver Design Guide”和“ Reference”。文件系统驱动程序设计者和最高层网络驱动程序设计者 应当参考IFS工具包。 13 Windows2000和WDM驱动程序的设计目标 内核模式驱动程序与很多 Windows2000的设计目标相符合,特别是系统I/0管理器部分。 这些设计目标包括: 平台之间的移植性 硬件和软件的可配置性 永远抢占优先和永远中断 多处理器平台上的多处理器安全 基于对象 带可重用I/0请求包(IRP)的包驱动I/0 异步I/0支持 后面的小节中将向所有的 Windows2000内核模式和WDM驱动程序设计者介绍这些系统设计 目标
5 PnP 软件总线驱动程序表示一组子设备,较高层的类、功能和/或过滤器驱动程序能连 接它们自己到这些子设备上,PnP 软件总线驱动程序也是中间层驱动程序。例如,控 制多功能适配器的驱动程序是一个 PnP 软件总线驱动程序,这样的多功能适配器是用 于不同的设备的一个便携集合。根据便携设备的特性和它的驱动程序使用的接口,这 样的驱动程序也可能是 WDM 软件总线驱动程序。它似乎使得较高层驱动程序成为一个 PnP/WDM 总线驱动程序。对于操作系统来说,驱动程序是以 PnP/WDM 驱动程序的面目 出现的,它服务于它自己的适配器,将它自己插入底层 PnP 硬件总线驱动程序之上的 驱动程序堆栈中。 3. 最低层驱动程序,例如 PnP 硬件总线驱动程序,它控制一个 I/O 总线,这个总线连了 一些外围设备在上面。最低层驱动程序不依赖于较低层驱动程序,而是控制物理外围 设备,例如总线。 早期的 NT 设备驱动程序直接地控制物理外围设备,它们是最低层的驱动程序,同样的 驱动程序例如 SCSI HBA(Host Bus Adapter,宿主总线适配器)驱动程序。 PnP 硬件总线驱动程序是系统提供的,并且通常动态控制可配置的 I/O 总线。这个驱 动程序通过与即插即用管理协作,为所有连到它所控制的 I/O 总线上的子设备,配置 和重新配置系统硬件资源(例如设备存储的映射和 IRQ)。对其 I/O 总线来说,PnP 硬 件总线驱动程序包含了一部分 Windows NT 早期版本中由 HAL 组件提供的功能。 Windows 2000 网络驱动程序也能被划分为上述的基本类型之一。例如,NT 服务器或转向器 是一个特定的文件系统驱动程序;传输堆栈中的任何驱动程序都是中间层驱动程序;物理 网卡(有时称为网络接口控制器或 NIC)驱动程序则是最低层设备驱动程序。当然, Windows 2000 为网络设备提供了明确的接口和支持,例如 NDIS(Network Device Interface Specification,网络设备接口规范)库在网络传输堆栈的下界提供了 NIC 驱动 程序和中间层驱动程序。 本书为文件系统和网络驱动程序设计者提供了一些有用的综述和背景信息,对于内核模式 设备和中间层驱动程序,以及包括 WDM 驱动程序的设计者来说,本书主要是一个设计指 南。网络中间层和设备驱动程序的设计者也应该参考在线 DDK 中的“Network Driver Design Guide”和“Reference”。文件系统驱动程序设计者和最高层网络驱动程序设计者 应当参考 IFS 工具包。 1.3 Windows 2000 和 WDM 驱动程序的设计目标 内核模式驱动程序与很多 Windows 2000 的设计目标相符合,特别是系统 I/O 管理器部分。 这些设计目标包括: ▪ 平台之间的移植性 ▪ 硬件和软件的可配置性 ▪ 永远抢占优先和永远中断 ▪ 多处理器平台上的多处理器安全 ▪ 基于对象 ▪ 带可重用 I/O 请求包(IRP)的包驱动 I/O ▪ 异步 I/O 支持 后面的小节中将向所有的 Windows 2000 内核模式和 WDM 驱动程序设计者介绍这些系统设计 目标