闭设备电源,ACPI过滤程序对其他驱动程序是透明的且在非ACPI机器上是没有的。 低层过滤器驱动程序 低层过滤器驱动程序典型地修改设备硬件的行为(看图14),它们典型地由IHV提供且是可 选择的,对一个设备来说,可以有任何数目的低层滤驱动程序。 低层设备过滤器驱动程序监视和/或修改一个特定设备的1O请求,典型地,这些过滤程序重 新定义了硬件行为来匹配期望的规范。 低层类过滤器驱动程序监视和/或修改一个设备类的IO请求,例如,通过执行一非线性鼠标 动数据转换,鼠标设备的低层类过滤器驱动程序能够提供加速。 顶层过滤器驱动程序 顶层过滤器驱动程序典型地为一设备提供增值的特征(看图14),这种驱动程序通常由IHV 提供且是可选择的。一个设备可有任意数目的顶层过滤器驱动程序。 顶层设备过滤器驱动程序为一个特别的设备添加数值。例如,一个键盘的顶层设备过滤器驱 动程序能够加强额外的安全检查。 顶层类过滤器驱动程序为一个特别类的所有设备添加数值。 132驱动程序层次-一个例子 这一部分描述了USB硬件可能的一套PnP驱动程序来说明PnP驱动程序的层次。 图1.5给出了一个USB操纵杆的PnP硬件配置的例子,在图1.5里,USB操纵杆插进一个 USB集线器上的一端口。该例中的USB集线器常驻在USB主控制器面板上,且插到USB主控制 器面板上的单个端口里,USB主控制器插到一个PCI总线上。从PnP的角度来看,USB集线器 USB主控制器和PCI总线都是总线设备,因为它们每一个都提供端口。操纵杆不是总线设备。 图1.5PnP硬件的USB操纵杆的例子 图1.6给出了一套驱动程序的例子,这些驱动程序可能为图1.5中的USB操纵杆硬件的原 因而装载 开始于图1.6的底部,堆栈例子里的驱动程序包括: 驱动PCⅠ总线的一个PCI驱动程序,这是一个PnP总线驱动程序,PCI总线驱动程序由微软 的系统所带。 ■USB主控制器的总线驱动程序作为一个类/微类驱动程序对来执行。微软系统带有USB主控 制器类和微类驱动程序。 ■USB集线器总线驱动程序驱动USB集线器,微软系统提供USB集线器驱动程序 操纵杆设备的三个驱动程序,其中之一是一个类/微类对。 图1.6PnP驱动程序层次的例子-USB操纵杆 功能驱动程序,即USB操纵杆设备的主要驱动程序,是一个HD类驱动程序/DUSB微类 驱动程序对。(HD代表“ human interface dev ice”) HID USB微类驱动程序支持HD设备的USB 专用的语法,其依赖HD类驱动程序DLL对HD驱动程序的总体支持。 功能驱动程序能专用于特定的设备,或在HD状态下,一个功能驱动程序能服务一组设备
26 闭设备电源,ACPI 过滤程序对其他驱动程序是透明的且在非 ACPI 机器上是没有的。 低层过滤器驱动程序 低层过滤器驱动程序典型地修改设备硬件的行为(看图 1.4),它们典型地由 IHV 提供且是可 选择的,对一个设备来说,可以有任何数目的低层滤驱动程序。 低层设备过滤器驱动程序监视和/或修改一个特定设备的 I/O 请求,典型地,这些过滤程序重 新定义了硬件行为来匹配期望的规范。 低层类过滤器驱动程序监视和/或修改一个设备类的 I/O 请求,例如,通过执行一非线性鼠标 运动数据转换,鼠标设备的低层类过滤器驱动程序能够提供加速。 顶层过滤器驱动程序 顶层过滤器驱动程序典型地为一设备提供增值的特征(看图 1.4),这种驱动程序通常由 IHV 提供且是可选择的。一个设备可有任意数目的顶层过滤器驱动程序。 顶层设备过滤器驱动程序为一个特别的设备添加数值。例如,一个键盘的顶层设备过滤器驱 动程序能够加强额外的安全检查。 顶层类过滤器驱动程序为一个特别类的所有设备添加数值。 1.3.2 驱动程序层次---一个例子 这一部分描述了 USB 硬件可能的一套 PnP 驱动程序来说明 PnP 驱动程序的层次。 图 1.5 给出了一个 USB 操纵杆的 PnP 硬件配置的例子,在图 1.5 里,USB 操纵杆插进一个 USB 集线器上的一端口。该例中的 USB 集线器常驻在 USB 主控制器面板上,且插到 USB 主控制 器面板上的单个端口里,USB 主控制器插到一个 PCI 总线上。从 PnP 的角度来看,USB 集线器、 USB 主控制器和 PCI 总线都是总线设备,因为它们每一个都提供端口。操纵杆不是总线设备。 图 1.5 PnP 硬件的 USB 操纵杆的例子 图 1.6 给出了一套驱动程序的例子,这些驱动程序可能为图 1.5 中的 USB 操纵杆硬件的原 因而装载。 开始于图 1.6 的底部,堆栈例子里的驱动程序包括: ◼ 驱动 PCI 总线的一个 PCI 驱动程序,这是一个 PnP 总线驱动程序,PCI 总线驱动程序由微软 的系统所带。 ◼ USB 主控制器的总线驱动程序作为一个类/微类驱动程序对来执行。微软系统带有 USB 主控 制器类和微类驱动程序。 ◼ USB 集线器总线驱动程序驱动 USB 集线器,微软系统提供 USB 集线器驱动程序。 ◼ 操纵杆设备的三个驱动程序,其中之一是一个类/微类对。 图 1.6 PnP 驱动程序层次的例子--- USB 操纵杆 功能驱动程序,即 USB 操纵杆设备的主要驱动程序,是一个 HID 类驱动程序/HID USB 微类 驱动程序对。(HID 代表“human interface device”)HID USB 微类驱动程序支持 HID 设备的 USB 专用的语法,其依赖 HID 类驱动程序 DLL 对 HID 驱动程序的总体支持。 功能驱动程序能专用于特定的设备,或在 HID 状态下,一个功能驱动程序能服务一组设备
在这个例子当中,HD类/DUSB微类驱动程序对服务于一USB总线系统中的任何 HID- compliant设备。一个HD类驱动程序HD1394微类驱动程序对将服务于1394总线系统里 的任何 HID-compliant设备 功能驱动程序由设备厂商或微软编写。在这个例子当中,功能驱动程序(HD类/ HID USB 微类驱动程序对)由微软编写。 在该例中,操纵杆设备有两个过滤器驱动程序:一个顶层类过滤程序添加一个宏按钮特征和 个低层设备过滤程序使操纵杆能枚举鼠标设备, 需要过滤操纵杆IO编写者编写顶层过滤程序,操纵杄厂商则编写低层过滤器驱动程序 内核模式、用户模式HD客户和应用程序不是驱动程序,但为了全面一并给出。 133设备对象种类 一个驱动程序为它所控制的每个设备产生设备对象,设备对象代表驱动程序的设备。从PnP 的角度看有三种设备对象: 物理设备对象(PDO)-代表一个总线驱动程序的总线上的设备 功能设备对象 )-代表一个功能驱动程序的设备 ■过滤程序设备对象( Filter Do)-代表一个过滤器驱动程序的设备 这三种设备对象都是 DE VICE OBJECT类型,但是使用方式不同并有不同的设备扩展 通过产生一设备对象( loCreateDevice)并将其附着到设备堆栈 ( loAttach DeviceTo device stack),驱动程序将其本身添加到处理设备的I/O驱动程序堆栈 loAttach DeviceTo DeviceStack决定设备堆栈当前的顶层和附着新的设备对象到设备堆栈的顶层。 图1.7给出了设备对象的可能种类,该设备对象可附着于设备堆栈里,表示处理一个设备的 I/O请求的驱动程序。 这一部分描述了每一类的设备对象并注意到何时产生该类。参看第2章获得关于在必要的PnP 驱动程序例程里产生设备对象的细节信息,要获得PnP设备枚举的更多信息,参见第2部分 开始于图1.7的底部: 总线驱动程序为总线上它所枚举的每个设备产生PDO 当总线驱动程序枚举其设备时,它为每个子设备产生PDO。总线驱动程序枚举一设备为PnP 管理器的 Bus Relations响应一个 IRP MN QUERY DEⅤ ICE RELA∏ONS请求。如果自从最近 次总线驱动程序响应 BusRelations的查询关系请求以来(或者这是机器被引导以来第一次查询关 系)设备已经添加到总线上,则总线驱动程序为每个子设备产生一个PDO PDO表示了总线驱动程序的设备,其他内核模式系统组件也和它一样,如电源管理器、PnP 管理器和IO管理器。 一个设备其他的驱动程序附着于PDO顶端的设备对象,但是PDO一直在设备堆栈的底端。 可选择的总线过滤器驱动程序为它们过滤的每个设备产生过滤程序DO。 当PnP管理器在 BusRelations列表里发现一个新设备时,它决定是否有该设备的任何总线过 滤器驱动程序。如果是这样的话,对每个这样的驱动程序PnP管理器确保它们被装载(如果需要 调用 Driver Entry)并调用驱动程序 AddDevice例程。如果总线过滤器驱动程序为这个设备过滤操 作,过滤器驱动程序产生一个设备对象并附着它到 Add Device例程里的设备堆栈上。如果不止 个总线过滤器驱动程序存在,且与这个设备相关,每个这样的过滤器驱动程序产生并附着于它自 己的设备对象
27 在这个 例子当 中, HID 类 /HID USB 微类 驱动 程序对 服务于 一 USB 总线系 统中 的任 何 HID-compliant 设备。一个 HID 类驱动程序/HID 1394 微类驱动程序对将服务于 1394 总线系统里 的任何 HID-compliant 设备。 功能驱动程序由设备厂商或微软编写。在这个例子当中,功能驱动程序(HID 类/HID USB 微类驱动程序对)由微软编写。 在该例中,操纵杆设备有两个过滤器驱动程序:一个顶层类过滤程序添加一个宏按钮特征和 一个低层设备过滤程序使操纵杆能枚举鼠标设备。 需要过滤操纵杆 I/O 编写者编写顶层过滤程序,操纵杆厂商则编写低层过滤器驱动程序。 ◼ 内核模式、用户模式 HID 客户和应用程序不是驱动程序,但为了全面一并给出。 1.3.3 设备对象种类 一个驱动程序为它所控制的每个设备产生设备对象,设备对象代表驱动程序的设备。从 PnP 的角度看有三种设备对象: ◼ 物理设备对象(PDO)---代表一个总线驱动程序的总线上的设备 ◼ 功能设备对象(FDO)---代表一个功能驱动程序的设备 ◼ 过滤程序设备对象(Filter DO)---代表一个过滤器驱动程序的设备 这三种设备对象都是 DEVICE_OBJECT 类型,但是使用方式不同并有不同的设备扩展。 通 过 产 生 一 设 备 对 象 ( IoCreateDevice ) 并 将 其 附 着 到 设 备 堆 栈 (IoAttachDeviceToDevice_Stack),驱动程序将其本身添加到处理设备的 I/O 驱动程序堆栈, IoAttachDeviceToDeviceStack 决定设备堆栈当前的顶层和附着新的设备对象到设备堆栈的顶层。 图 1.7 给出了设备对象的可能种类,该设备对象可附着于设备堆栈里,表示处理一个设备的 I/O 请求的驱动程序。 这一部分描述了每一类的设备对象并注意到何时产生该类。参看第2章获得关于在必要的PnP 驱动程序例程里产生设备对象的细节信息,要获得 PnP 设备枚举的更多信息,参见第 2 部分。 开始于图 1.7 的底部: ◼ 总线驱动程序为总线上它所枚举的每个设备产生 PDO。 当总线驱动程序枚举其设备时,它为每个子设备产生 PDO。总线驱动程序枚举一设备为 PnP 管理器的 BusRelations 响应一个 IRP_MN_QUERY_DEVICE_RELATIONS 请求。如果自从最近一 次总线驱动程序响应 BusRelations 的查询关系请求以来(或者这是机器被引导以来第一次查询关 系)设备已经添加到总线上,则总线驱动程序为每个子设备产生一个 PDO。 PDO 表示了总线驱动程序的设备,其他内核模式系统组件也和它一样,如电源管理器、PnP 管理器和 I/O 管理器。 一个设备其他的驱动程序附着于 PDO 顶端的设备对象,但是 PDO 一直在设备堆栈的底端。 ◼ 可选择的总线过滤器驱动程序为它们过滤的每个设备产生过滤程序 DO。 当 PnP 管理器在 BusRelations 列表里发现一个新设备时,它决定是否有该设备的任何总线过 滤器驱动程序。如果是这样的话,对每个这样的驱动程序 PnP 管理器确保它们被装载(如果需要 调用 DriverEntry)并调用驱动程序 AddDevice 例程。如果总线过滤器驱动程序为这个设备过滤操 作,过滤器驱动程序产生一个设备对象并附着它到 AddDevice 例程里的设备堆栈上。如果不止一 个总线过滤器驱动程序存在,且与这个设备相关,每个这样的过滤器驱动程序产生并附着于它自 己的设备对象
可选择的,低层过滤器驱动程序为它们过滤的每个设备产生过滤程序DO 如果一可选择的低层过滤器驱动程序由于这个设备的原因而存在,PnP管理器确信在总线驱 动程序和任何总线过滤器驱动程序之后装载了这样的驱动程序。PnP管理器调用过滤器驱动程序 的 Add Device例程,在它的 AddDevice例程里,低层的过滤器驱动程序为设备产生一个过滤程序 DO且附着它到设备堆栈里。如果不止一个低层过滤器驱动程序存在,每个这样的驱动程序将产 生并附着它自己的过滤程序DO 功能驱动程序为设备产生一个FDO。 PnP管理器确信已安装了设备的功能驱动程序并调用功能驱动程序的 AddDevice例程,功能 驱动程序产生一个FDO并附着它到设备堆栈里。 ■可选择的,顶层过滤器驱动程序为它们过滤的每个设备产生过滤程序DO 如果任何可选择的,顶层过滤器驱动程序为设备而存在,PnP管理器确信在功能驱动程序调 用它们的 AddDevice例程之后被安装,每个这样的过滤器驱动程序附着它的设备对象到设备堆栈 总之,设备堆栈包括每一驱动程序的设备对象,该驱动程序参与了特定设备的IO处理。父 总线驱动程序有一个PDO,功能驱动程序有一个FDO,每一个可选择的过滤器驱动程序有一个过 滤程序DO。 注意到所有的设备--总线适配器/控制器设备和非总线设备在它们的设备堆栈里有一个 PDO和FDO。总线适配器控制器的PDO由父总线的总线驱动程序产生。例如,如果一个SCSI 适配器插入一个PCI总线,PCl总线驱动程序为SCSI适配器产生一个PDO 如果一个设备正以原始模式使用,则没有功能驱动程序或过滤器驱动程序(没有FDO或过滤 程序DO)。此时还有父总线驱动程序的一个PDO和零个或更多总线过滤程序DO 要获取哪一个驱动程序例程负责产生和附着设备对象的信息,参看第2章 设备堆栈和一些额外信息构成了一个 devnode设备。在一个设备的 dev node里,PnP管理器 保留诸如是否设备已经启动和哪一个驱动程序,如有,登记通知设备上的改变。内核调试程序I devnode命令显示了关于一个 devnode的信息 134设备对象一一个例子 这一部分描述了由USB硬件的驱动程序产生可能的驱动程序的设备对象来说明PnP设备对 象以及它们怎样分层 图18给出了在142部分里描述的驱动程序例子所产生的设备对象 图1.8PnP设备对象分层的例子--USB操纵杆 开始于图1.8的底部,在设备堆栈例子里的设备对象包括 PCl总线的一个PDO和一个FDO 根总线驱动程序枚举内部系统总线(根总线)并为它所发现的每个设备产生一个PDO,这些 PDO的其中之一支持PCI总线。(根总线的PDO和FDO没有在图中列出。) PnP管理器标识PCI驱动程序为PCI总线的功能驱动程序,安装驱动程序(如果还没安装的 话),并传递PDO给PCI驱动程序。在它的 AddDevice例程里,PCI驱动程序产生PCl总线 ( locreateDevice)的一个FDO并增加FDO到PCl总线的设备堆栈 ( loAttachDevice todevicestack)。象PCI总线的功能驱动程序一样,PCl驱动程序产生并附着这
28 ◼ 可选择的,低层过滤器驱动程序为它们过滤的每个设备产生过滤程序 DO。 如果一可选择的低层过滤器驱动程序由于这个设备的原因而存在,PnP 管理器确信在总线驱 动程序和任何总线过滤器驱动程序之后装载了这样的驱动程序。PnP 管理器调用过滤器驱动程序 的 AddDevice 例程,在它的 AddDevice 例程里,低层的过滤器驱动程序为设备产生一个过滤程序 DO 且附着它到设备堆栈里。如果不止一个低层过滤器驱动程序存在,每个这样的驱动程序将产 生并附着它自己的过滤程序 DO。 ◼ 功能驱动程序为设备产生一个 FDO。 PnP 管理器确信已安装了设备的功能驱动程序并调用功能驱动程序的 AddDevice 例程,功能 驱动程序产生一个 FDO 并附着它到设备堆栈里。 ◼ 可选择的,顶层过滤器驱动程序为它们过滤的每个设备产生过滤程序 DO。 如果任何可选择的,顶层过滤器驱动程序为设备而存在,PnP 管理器确信在功能驱动程序调 用它们的 AddDevice 例程之后被安装,每个这样的过滤器驱动程序附着它的设备对象到设备堆栈。 总之,设备堆栈包括每一驱动程序的设备对象,该驱动程序参与了特定设备的 I/O 处理。父 总线驱动程序有一个 PDO,功能驱动程序有一个 FDO,每一个可选择的过滤器驱动程序有一个过 滤程序 DO。 注意到所有的设备---总线适配器/控制器设备和非总线设备---在它们的设备堆栈里有一个 PDO 和 FDO。总线适配器/控制器的 PDO 由父总线的总线驱动程序产生。例如,如果一个 SCSI 适配器插入一个 PCI 总线,PCI 总线驱动程序为 SCSI 适配器产生一个 PDO。 如果一个设备正以原始模式使用,则没有功能驱动程序或过滤器驱动程序(没有 FDO 或过滤 程序 DO)。此时还有父总线驱动程序的一个 PDO 和零个或更多总线过滤程序 DO。 要获取哪一个驱动程序例程负责产生和附着设备对象的信息,参看第 2 章。 设备堆栈和一些额外信息构成了一个 devnode 设备。在一个设备的 devnode 里,PnP 管理器 保留诸如是否设备已经启动和哪一个驱动程序,如有,登记通知设备上的改变。内核调试程序! devnode 命令显示了关于一个 devnode 的信息。 1.3.4 设备对象---一个例子 这一部分描述了由 USB 硬件的驱动程序产生可能的驱动程序的设备对象来说明 PnP 设备对 象以及它们怎样分层。 图 1.8 给出了在 1.4.2 部分里描述的驱动程序例子所产生的设备对象。 图 1.8 PnP 设备对象分层的例子---USB 操纵杆 开始于图 1.8 的底部,在设备堆栈例子里的设备对象包括: 1. PCI 总线的一个 PDO 和一个 FDO 根总线驱动程序枚举内部系统总线(根总线)并为它所发现的每个设备产生一个 PDO,这些 PDO 的其中之一支持 PCI 总线。(根总线的 PDO 和 FDO 没有在图中列出。) PnP 管理器标识 PCI 驱动程序为 PCI 总线的功能驱动程序,安装驱动程序(如果还没安装的 话),并传递 PDO 给 PCI 驱动程序。在它的 AddDevice 例程里,PCI 驱动程序产生 PCI 总线 ( IoCreateDevice ) 的 一 个 FDO 并 增 加 FDO 到 PCI 总线的设备堆栈 (IoAttachDeviceToDeviceStack)。象 PCI 总线的功能驱动程序一样,PCI 驱动程序产生并附着这
个FDO作为它的部分任务。 在该例中,没有PC总线的过滤器驱动程序。 2.USB主控制器的一个PDO和一个FDO PnP管理器指示PCI驱动程序来启动它的设备( IRP MN START DE VICE),然后查询它的 子代( IRP MN QUERY DEVICE RELATIONS BusRelations)PCI驱动程序。作为响应,PCI驱 动程序枚举其总线上的设备。在这个例子中,PCI驱动程序发现了一个USB主机控制器并产生那 个设备的一个PDO。图中的宽箭头表示了USB主机控制器是PCI总线的一个“子代”。PCI驱动 程序生成它子设备的PDO,象支持PCI总线的总线驱动程序一样,作为它的部分任务。 PnP管理器标识USB主机控制器微类/类驱动程序对作为USB主机控制器的功能驱动程序并 装载该驱动程序对,PnP管理器在适当的时间调用该驱动程序对生成并附着USB主机控制器一个 FDO。 在该例中,没有过滤器驱动程序支持USB主机控制器 3.USB集线器的一个PDO和一个FDO USB主机控制器枚举它的总线、在单个端口上定位USB集线器,并为集线器生成一个PDO USB集线器驱动程序生成并且为集线器附加一个FDO 在该例中,没有USB集线器的过滤器驱动程序 4.操纵杆设备的一个PDO、一个FDO和两个过滤程序DO USB集线器驱动程序枚举它的总线、定位一个HD设备(操纵杆)和生成一个操纵杆PDO 在该例中,低层过滤器驱动程序已经在注册表中为操纵杆设备而设置,这样,PnP管理器装载过 滤器驱动程序。过滤器驱动程序决定相关设备并给设备堆栈生成和附加一个过滤程序DO。 PnP管理器决定了操纵杆设备的功能驱动程序是HD类微类驱动程序对并装载这些驱动程 序。驱动程序对包含一个链接到类驱动程序DLL的一个微类驱动程序:它们一起作为设备的一个 功能驱动程序来执行。该类/微类驱动程序对生成一个设备对象、FDO,并把它附加到设备堆栈中 顶层过滤器驱动程序生成并附加一过滤程序DO到设备堆栈,其方式与低层过滤程序类似 注意到由父总线驱动程序生成的FDO一直处于一个特定设备的设备堆栈的底部,当驱动程序 处理PnP或电源IRP时,它们必须向下通过设备堆栈传递每一个IRP给PDO和其关的总线驱动 程序。 图1.9给出了与图1.8相同的设备堆栈,但强调哪一个设备对象由哪一个驱动程序生成和管 图1.9从驱动程序角度看到的设备对象层次的例子 一个总线驱动程序跨越多个设备堆栈,一个总线驱动程序为它的总线适配器/控制器生成 FDO,并为它的每个子设备生成一个PDO
29 个 FDO 作为它的部分任务。 在该例中,没有 PCI 总线的过滤器驱动程序。 2. USB 主控制器的一个 PDO 和一个 FDO PnP 管理器指示 PCI 驱动程序来启动它的设备(IRP_MN_START_DEVICE),然后查询它的 子代(IRP_MN_QUERY_DEVICE_RELATIONS BusRelations)PCI 驱动程序。作为响应,PCI 驱 动程序枚举其总线上的设备。在这个例子中,PCI 驱动程序发现了一个 USB 主机控制器并产生那 个设备的一个 PDO。图中的宽箭头表示了 USB 主机控制器是 PCI 总线的一个“子代”。PCI 驱动 程序生成它子设备的 PDO,象支持 PCI 总线的总线驱动程序一样,作为它的部分任务。 PnP 管理器标识 USB 主机控制器微类/类驱动程序对作为 USB 主机控制器的功能驱动程序并 装载该驱动程序对,PnP 管理器在适当的时间调用该驱动程序对生成并附着 USB 主机控制器一个 FDO。 在该例中,没有过滤器驱动程序支持 USB 主机控制器。 3. USB 集线器的一个 PDO 和一个 FDO USB 主机控制器枚举它的总线、在单个端口上定位 USB 集线器,并为集线器生成一个 PDO。 USB 集线器驱动程序生成并且为集线器附加一个 FDO。 在该例中,没有 USB 集线器的过滤器驱动程序。 4. 操纵杆设备的一个 PDO、一个 FDO 和两个过滤程序 DO USB 集线器驱动程序枚举它的总线、定位一个 HID 设备(操纵杆)和生成一个操纵杆 PDO。 在该例中,低层过滤器驱动程序已经在注册表中为操纵杆设备而设置,这样,PnP 管理器装载过 滤器驱动程序。过滤器驱动程序决定相关设备并给设备堆栈生成和附加一个过滤程序 DO。 PnP 管理器决定了操纵杆设备的功能驱动程序是 HID 类/微类驱动程序对并装载这些驱动程 序。驱动程序对包含一个链接到类驱动程序 DLL 的一个微类驱动程序;它们一起作为设备的一个 功能驱动程序来执行。该类/微类驱动程序对生成一个设备对象、FDO,并把它附加到设备堆栈中。 顶层过滤器驱动程序生成并附加一过滤程序 DO 到设备堆栈,其方式与低层过滤程序类似。 注意到由父总线驱动程序生成的 FDO 一直处于一个特定设备的设备堆栈的底部,当驱动程序 处理 PnP 或电源 IRP 时,它们必须向下通过设备堆栈传递每一个 IRP 给 PDO 和其关的总线驱动 程序。 图 1.9 给出了与图 1.8 相同的设备堆栈,但强调哪一个设备对象由哪一个驱动程序生成和管 理。 图 1.9 从驱动程序角度看到的设备对象层次的例子 一个总线驱动程序跨越多个设备堆栈,一个总线驱动程序为它的总线适配器/控制器生成 FDO,并为它的每个子设备生成一个 PDO
第2章PnP和电源管理必须的驱动程序支持 本章描述了例程和IRP处理,这些在 Windows2000和WDM驱动程序里对支持即插即用(PnP) 和电源管理是必须的。它覆盖了以下的主题 2.1必须的PnP支持的总览 22PnP和电源管理 Driver Entry例程 2.3PnP和电源管理 Add Device例程 2.3.1编写 Add Device例程的指南 24 Dispatch PnP例程 25 DispatchPower例程 26PnP和电源管理 Unload例程 些驱动程序通过系统提供的端口或类驱动程序与PnP和电源系统的细节是隔离的,这样的 驱动程序无需实现所有的这些机制。举个例子,一个SCSI端口驱动程序屏蔽了一个SCSI微端口 驱动程序的许多电源管理和PnP系统的细节,这样一个SCSI微端口驱动程序不需要直接处理电 源和 PnP IRP。对这些驱动程序,参看驱动程序专用文件来获得必要的PnP支持细节。 参看第一章对PnP和电源管理的概念和术语的介绍。 21必须的PnP支持的总览 个支持PnP和电源管理的驱动程序必须具有以下功能: 个用来安装驱动程序的INF文件 一个 cat( catalog)文件,该文件有驱动程序包的WHQL数字签名 一个用于初始化驱动程序的 Driver Entry例程 一个用于初始化设备的 Add Device例程 个 DispatchPnP例程,该例程处理PnP操作的IRP,如启动、停止和删除设备 个 Dispatch Power例程处理电源操作的IRP ■一个 Unload例程删除任何由 DriverEntry设定的驱动程序专用资源 这些例程在下面的部分中讨论。参见第4部分获得关于INF文件、cat文件和驱动程序安装 的信息。 22PnP和电源管理 DriverEntry例程 个 Driver Entry例程初始化一个驱动程序,所有的驱动程序必须有一个 DriverEntry例程 当装载驱动程序时,PnP管理器为每个驱动程序调用一次 DriverEntry。在驱动程序初始化之后 PnP管理器能够调用驱动程序的 AddDevice例程来初始化由该驱动程序控制的设备 DriverEntry例程定义如下: NTSTATUS
30 第2章 PnP 和电源管理必须的驱动程序支持 本章描述了例程和 IRP 处理,这些在 Windows2000 和 WDM 驱动程序里对支持即插即用(PnP) 和电源管理是必须的。它覆盖了以下的主题: 2.1 必须的 PnP 支持的总览 2.2 PnP 和电源管理 DriverEntry 例程 2.3 PnP 和电源管理 AddDevice 例程 2.3.1 编写 AddDevice 例程的指南 2.4 Dispatch PnP 例程 2.5 DispatchPower 例程 2.6 PnP 和电源管理 Unload 例程 一些驱动程序通过系统提供的端口或类驱动程序与 PnP 和电源系统的细节是隔离的,这样的 驱动程序无需实现所有的这些机制。举个例子,一个 SCSI 端口驱动程序屏蔽了一个 SCSI 微端口 驱动程序的许多电源管理和 PnP 系统的细节,这样一个 SCSI 微端口驱动程序不需要直接处理电 源和 PnP IRP。对这些驱动程序,参看驱动程序专用文件来获得必要的 PnP 支持细节。 参看第一章对 PnP 和电源管理的概念和术语的介绍。 2.1 必须的 PnP 支持的总览 一个支持 PnP 和电源管理的驱动程序必须具有以下功能: ◼ 一个用来安装驱动程序的 INF 文件 ◼ 一个.cat(catalog)文件,该文件有驱动程序包的 WHQL 数字签名 ◼ 一个用于初始化驱动程序的 DriverEntry 例程 ◼ 一个用于初始化设备的 AddDevice 例程 ◼ 一个 DispatchPnP 例程,该例程处理 PnP 操作的 IRP,如启动、停止和删除设备 ◼ 一个 DispatchPower 例程处理电源操作的 IRP ◼ 一个 Unload 例程删除任何由 DriverEntry 设定的驱动程序专用资源 这些例程在下面的部分中讨论。参见第 4 部分获得关于 INF 文件、.cat 文件和驱动程序安装 的信息。 2.2 PnP 和电源管理 DriverEntry 例程 一个 DriverEntry 例程初始化一个驱动程序,所有的驱动程序必须有一个 DriverEntry 例程。 当装载驱动程序时,PnP 管理器为每个驱动程序调用一次 DriverEntry。在驱动程序初始化之后, PnP 管理器能够调用驱动程序的 AddDevice 例程来初始化由该驱动程序控制的设备。 DriverEntry 例程定义如下: NTSTATUS