pnp&power management&wmi

50
PNP&Power PNP&Power Management&WMI Management&WMI [email protected] [email protected]

Upload: meris

Post on 10-Feb-2016

173 views

Category:

Documents


0 download

DESCRIPTION

PNP&Power Management&WMI. [email protected]. Plug and play. 与 Hot plug 不一样 没有什么跳线,开关之类,不会引起资源冲突,因为资源不再是驱动程序自己配置,而是即插即用 (Plug and Play -- PnP) 管理器自动配置。 PNP 管理器使用主功能码为 IRP_MJ_PNP 的 IRP 与设备驱动程序交换信息和请求 这种类型的请求是新引入 WDM 中的,在以前的驱动程序中,大部分检测和配置设备的工作由设备驱动程序自己做。而 WDM 驱动程序可以让 PnP 管理器做这个工作。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PNP&Power Management&WMI

PNP&Power PNP&Power Management&WManagement&W

[email protected]@mti.xidian.edu.cn

Page 2: PNP&Power Management&WMI

Plug and playPlug and play 与与 Hot plug Hot plug 不一样不一样 没有什么跳线,开关之类,不会引起资源冲突,因为资源没有什么跳线,开关之类,不会引起资源冲突,因为资源不再是驱动程序自己配置,而是即插即用不再是驱动程序自己配置,而是即插即用 (Plug and (Plug and

Play -- PnP)Play -- PnP) 管理器自动配置。管理器自动配置。 PNPPNP 管理器使用主功能码为管理器使用主功能码为 IRP_MJ_PNPIRP_MJ_PNP 的的 IRPIRP 与设与设备驱动程序交换信息和请求 备驱动程序交换信息和请求 这种类型的请求是新引入这种类型的请求是新引入 WDMWDM 中的,在以前的驱动程中的,在以前的驱动程序中,大部分检测和配置设备的工作由设备驱动程序自己序中,大部分检测和配置设备的工作由设备驱动程序自己做。而做。而 WDMWDM 驱动程序可以让驱动程序可以让 PnPPnP 管理器做这个工作。管理器做这个工作。 为了与为了与 PnPPnP 管理器协同工作,驱动程序需要处理一些相管理器协同工作,驱动程序需要处理一些相关的关的 IRPIRP 。 。 PNP&PM&WMI.docPNP&PM&WMI.doc

Page 3: PNP&Power Management&WMI

PnPPnP 请求在请求在 WDMWDM 中的作用中的作用 PnPPnP 请求指示驱动程序何时以及如何配置或取消请求指示驱动程序何时以及如何配置或取消其硬件或自身的设置 。有三个对过滤器驱动程序其硬件或自身的设置 。有三个对过滤器驱动程序或功能驱动程序特别重要。或功能驱动程序特别重要。 PnPPnP 管理器使用管理器使用

IRP_MN_START_DEVICEIRP_MN_START_DEVICE 来通知功能驱动程来通知功能驱动程序其硬件被赋予了什么序其硬件被赋予了什么 I/OI/O 资源,以及指导功能资源,以及指导功能驱动程序做任何必要的硬件或软件设置以便设备驱动程序做任何必要的硬件或软件设置以便设备能正常工作。能正常工作。 IRP_MN_STOP_DEVICEIRP_MN_STOP_DEVICE 告诉功告诉功能驱动程序关闭设能驱动程序关闭设备。备。 IRP_MN_REMOVE_DEVICEIRP_MN_REMOVE_DEVICE 告诉功能驱告诉功能驱动程序关闭设备并释放与之关联的设备对象 动程序关闭设备并释放与之关联的设备对象

Page 4: PNP&Power Management&WMI

PnPPnP 请求在请求在 WDMWDM 中的作用中的作用 PnPPnP 请求指导驱动程序完成一系列状态转换,请求指导驱动程序完成一系列状态转换,如图所示。如图所示。 WORKINGWORKING 和和 STOPPEDSTOPPED 是设是设备的两个基本状态。当创建设备对象后,设备备的两个基本状态。当创建设备对象后,设备就立即进入就立即进入 STOPPEDSTOPPED 状态。状态。 WORKINGWORKING状态指出设备是全部可操作的。此外,还有两状态指出设备是全部可操作的。此外,还有两个中间状态,个中间状态, PENDINGSTOPPENDINGSTOP 和和

PENDINGREMOVEPENDINGREMOVE ,它们出现在,它们出现在WORKINGWORKING 状态状态前。前。 SURPRISEREMOVEDSURPRISEREMOVED 发生在物理硬发生在物理硬件突然被移去的情况下。件突然被移去的情况下。

Page 5: PNP&Power Management&WMI
Page 6: PNP&Power Management&WMI

处理处理 IRP_MJ_PNP IRP_MJ_PNP 的分发函的分发函数数 使用函数指针表使用函数指针表 使用使用 switch caseswitch case 语句语句

Page 7: PNP&Power Management&WMI

启动设备启动设备IRP_MN_START_DEVICE IRP_MN_START_DEVICE

当当 PnPPnP 管理器检测到硬件时,它首先参考注册表管理器检测到硬件时,它首先参考注册表以了解有哪些过滤器驱动程序将管理该硬件 ,如以了解有哪些过滤器驱动程序将管理该硬件 ,如果必要,它将装入这些驱动程序,并调用它们的果必要,它将装入这些驱动程序,并调用它们的AddDeviceAddDevice 函数。最后函数。最后 AddDeviceAddDevice 函数创建函数创建设备对象并连入设备堆栈。此后,设备对象并连入设备堆栈。此后, PnPPnP 管理器将管理器将为所有设备驱动程序分配为所有设备驱动程序分配 I/OI/O 资源。 资源。

PnPPnP 管理器为每个设备创建一个资源需求列表并管理器为每个设备创建一个资源需求列表并允许驱动程序过滤这个列表,或者对它进行更改。允许驱动程序过滤这个列表,或者对它进行更改。通常的驱动程序不用处理这个资源需求列表。通通常的驱动程序不用处理这个资源需求列表。通过需求列表,过需求列表, PnPPnP 管理器在分配资源时能协调当管理器在分配资源时能协调当前系统中所有硬件的潜在资源冲突。前系统中所有硬件的潜在资源冲突。

Page 8: PNP&Power Management&WMI

启动设备启动设备 一旦资源分配确定,一旦资源分配确定, PnPPnP 管理器通过向每个设备管理器通过向每个设备发送一个带发送一个带 IRP_MN_START_DEVICEIRP_MN_START_DEVICE 副功能副功能码的码的 PnPPnP 请求来通知设备。请求来通知设备。 通常过滤器驱动程序对这个通常过滤器驱动程序对这个 IRPIRP 不感兴趣,所以不感兴趣,所以它们使用它们使用 DefaultPnpHandlerDefaultPnpHandler 方式把请求向下方式把请求向下传。而功能驱动程序正好相反,它需要在这个传。而功能驱动程序正好相反,它需要在这个

IRPIRP 上做大量工作,包括分配并配置额外的软件上做大量工作,包括分配并配置额外的软件资源以及为设备操作做准备。这个工作需要在资源以及为设备操作做准备。这个工作需要在PASSIVE_LEVELPASSIVE_LEVEL 级上进行,并在低层驱动程级上进行,并在低层驱动程序处理完该序处理完该 IRPIRP 后完成。后完成。

典型的处理典型的处理 IRP_MN_START_DEVICE IRP_MN_START_DEVICE 的例程的例程如:如: PNP&PM&WMI.docPNP&PM&WMI.doc

Page 9: PNP&Power Management&WMI

停止设备停止设备IRP_MN_STOP_DEVICE IRP_MN_STOP_DEVICE

设备停止请求通知程序关闭设备,然后设备停止请求通知程序关闭设备,然后PnPPnP 管理器重新分配管理器重新分配 I/OI/O 资源。资源。

在硬件级,关闭设备将包括暂停或停止当在硬件级,关闭设备将包括暂停或停止当前活动并阻止后来的中断。在软件级,关前活动并阻止后来的中断。在软件级,关闭设备将涉及释放设备启动时配置的闭设备将涉及释放设备启动时配置的 I/OI/O资源。资源。 典型的处理典型的处理 IRP_MN_STOP_DEVICE IRP_MN_STOP_DEVICE 的例程如:的例程如: PNP&PM&WMI.docPNP&PM&WMI.doc

Page 10: PNP&Power Management&WMI

移除设备移除设备 IRP_MN_REMOVE_DEVICE IRP_MN_REMOVE_DEVICE

开始,开始, PnPPnP 管理器通过调用驱动程序中的管理器通过调用驱动程序中的AddDeviceAddDevice 函数来通知程序已经找到要管理的硬件函数来通知程序已经找到要管理的硬件实例,并给一个创建设备对象的机会。当设备将要实例,并给一个创建设备对象的机会。当设备将要被系统删除时,被系统删除时, PnPPnP 管理器发送副功能码为管理器发送副功能码为IRP_MN_REMOVE_DEVICEIRP_MN_REMOVE_DEVICE 的的 PnPPnP 请求。请求。

因为系统在发送因为系统在发送 IRP_MN_REMOVE_DEVICEIRP_MN_REMOVE_DEVICE 之之前不一定发送前不一定发送 IRP_MN_STOP_DEVICEIRP_MN_STOP_DEVICE ,为了响,为了响应这个请求,应该做与应这个请求,应该做与 IRP_MN_STOP_DEVICEIRP_MN_STOP_DEVICE相同事情,关闭设备,然后删除设备对象 。相同事情,关闭设备,然后删除设备对象 。 典型的处理典型的处理 IRP_MN_REMOVE_DEVICE IRP_MN_REMOVE_DEVICE 的例的例程如:程如: PNP&PM&WMI.docPNP&PM&WMI.doc

Page 11: PNP&Power Management&WMI

IRP_MN_SURPRISE_REMOIRP_MN_SURPRISE_REMOVALVAL

有时用户可能不经过任何用户接口交互操作突然地拆有时用户可能不经过任何用户接口交互操作突然地拆卸设备。如果系统检测到这种突然的删除,它就向驱卸设备。如果系统检测到这种突然的删除,它就向驱动程序发送副功能码为动程序发送副功能码为IRP_MN_SURPRISE_REMOVALIRP_MN_SURPRISE_REMOVAL 的的 PnPPnP 请求,请求,后面还会跟着一个后面还会跟着一个 IRP_MN_REMOVE_DEVICEIRP_MN_REMOVE_DEVICE 请请求。求。

除非以前在处理除非以前在处理IRP_MN_QUERY_CAPABILITIESIRP_MN_QUERY_CAPABILITIES 时曾设置时曾设置SurpriseRemovalOKSurpriseRemovalOK标志,否则系统将显示一个标志,否则系统将显示一个对话框,通知用户这样做是危险的。对话框,通知用户这样做是危险的。

我们意外拔出我们意外拔出 usbusb 设备时可能会得到一个对话框,比设备时可能会得到一个对话框,比如如 uu盘,但是如果是盘,但是如果是 usbusb键盘,可能不会得到。键盘,可能不会得到。

Page 12: PNP&Power Management&WMI

IRP_MN_SURPRISE_REMOIRP_MN_SURPRISE_REMOVALVAL

为了响应突然删除请求,设备驱动程序应为了响应突然删除请求,设备驱动程序应该禁止所有已注册的接口。如果应用程序该禁止所有已注册的接口。如果应用程序事先关注这种通知,这将给应用程序一个事先关注这种通知,这将给应用程序一个机会关闭设备的句柄。(很多情况下应用机会关闭设备的句柄。(很多情况下应用程序都会希望在设备被移除时得到一个事程序都会希望在设备被移除时得到一个事件通知,这就是需要驱动程序中调用禁止件通知,这就是需要驱动程序中调用禁止接口的函数)接口的函数) 然后驱动程序应释放然后驱动程序应释放 I/OI/O 资源并向下传递资源并向下传递请求:请求:

Page 13: PNP&Power Management&WMI

Power managementPower management WDMWDM 驱动程序中电源管理的意义驱动程序中电源管理的意义 减少电力消耗减少电力消耗 移动设备电池问题移动设备电池问题

Page 14: PNP&Power Management&WMI

电源管理模型电源管理模型 在在 Windows 2000Windows 2000 和和 Windows 98Windows 98 中,操作系统接管中,操作系统接管了大部分电源管理工作。这是因为只有操作系统才能真正了大部分电源管理工作。这是因为只有操作系统才能真正了解电源管理的内部过程。例如,系统了解电源管理的内部过程。例如,系统 BIOSBIOS负责的电源负责的电源管理不能区分应用程序使用的屏幕和屏幕保护程序使用的管理不能区分应用程序使用的屏幕和屏幕保护程序使用的屏幕之间的区别。但操作系统可以区分开这种不同,从而屏幕之间的区别。但操作系统可以区分开这种不同,从而确定是否可以关闭显示器。确定是否可以关闭显示器。 作为计算机全局电源策略,操作系统支持一些用户接口,作为计算机全局电源策略,操作系统支持一些用户接口,用户可以通过这些接口元素控制最终的电源管理策略。这用户可以通过这些接口元素控制最终的电源管理策略。这些用户接口元素包括控制面板、开始菜单上的命令、控制些用户接口元素包括控制面板、开始菜单上的命令、控制设备唤醒特征的设备唤醒特征的 APIAPI 通过向设备发送通过向设备发送 IRPIRP ,内核的电源管理部件实现了操作,内核的电源管理部件实现了操作系统的电源策略。系统的电源策略。 WDMWDM 驱动程序主要是作为响应这些驱动程序主要是作为响应这些

IRPIRP 的被动角色。 的被动角色。

Page 15: PNP&Power Management&WMI

WDMWDM 驱动程序的角色驱动程序的角色 设备的某个驱动程序充当设备电源策略的管理者。通常都设备的某个驱动程序充当设备电源策略的管理者。通常都是由功能驱动程序充当这个角色。电源管理器可以改变整是由功能驱动程序充当这个角色。电源管理器可以改变整个系统的电源状态。功能驱动程序接收电源管理器发来的个系统的电源状态。功能驱动程序接收电源管理器发来的

IRP(IRP( 系统系统 IRP)IRP) ,作为设备电源策略的管理者,功能驱动,作为设备电源策略的管理者,功能驱动程序用设备理解的术语翻译这些程序用设备理解的术语翻译这些 IRPIRP 并引发新的并引发新的 IRP(IRP( 设设备备 IRP)IRP) 。。

当响应设备当响应设备 IRPIRP 时,功能驱动程序需要关心设备专有的时,功能驱动程序需要关心设备专有的细节。设备硬件会有自己的上下文信息,不应该在设备处细节。设备硬件会有自己的上下文信息,不应该在设备处于低电源期间丢失这些信息。例如,键盘驱动程序会保存于低电源期间丢失这些信息。例如,键盘驱动程序会保存锁定键锁定键 (( 如如 CAPS-LOCKCAPS-LOCK 、、 NUM-LOCKNUM-LOCK 、、 SCROLL-SCROLL-LOCK)LOCK) 、、 LEDLED等信息。功能驱动程序有责任保存并恢等信息。功能驱动程序有责任保存并恢复这些上下文信息。复这些上下文信息。

Page 16: PNP&Power Management&WMI

WDMWDM 驱动程序的角色驱动程序的角色 某些设备带有唤醒特征,当外部事件发生时,这某些设备带有唤醒特征,当外部事件发生时,这些设备可以唤醒系统;功能驱动程序应与用户协些设备可以唤醒系统;功能驱动程序应与用户协同工作以确保唤醒特征在需要时有效。同工作以确保唤醒特征在需要时有效。 许多功能驱动程序还管理含有大量许多功能驱动程序还管理含有大量 IRPIRP 的队列的队列(( 设备读写设备读写 IRP)IRP) ,因此当设备电源状态转变时需,因此当设备电源状态转变时需要停止或释放这些队列。要停止或释放这些队列。 处于设备堆栈底端的总线驱动程序有责任控制设处于设备堆栈底端的总线驱动程序有责任控制设备的电流和执行任何与设备唤醒特征相关的电气备的电流和执行任何与设备唤醒特征相关的电气步骤。步骤。 过滤器驱动程序通常作为电源管理过滤器驱动程序通常作为电源管理 IRPIRP 通过的管通过的管道,它们用专用的协议向下层驱动程序传递电源道,它们用专用的协议向下层驱动程序传递电源管理请求。管理请求。

Page 17: PNP&Power Management&WMI

设备电源状态与系统电源状态 设备电源状态与系统电源状态 WDMWDM 模型使用与模型使用与 ACPI(Advanced ACPI(Advanced

Configuration and Power Interface)Configuration and Power Interface)规范相同的术语来描述电源状态 规范相同的术语来描述电源状态 设备能呈现下图所描述的四种电源状态。设备能呈现下图所描述的四种电源状态。

Page 18: PNP&Power Management&WMI
Page 19: PNP&Power Management&WMI

设备电源状态设备电源状态 在在 D0D0 状态中,设备处于全供电状态。在状态中,设备处于全供电状态。在 D3D3 状态中,设状态中,设备处于无供电备处于无供电 (( 或最小限度的电流或最小限度的电流 )) 状态。中间的状态。中间的 D1D1 和和

D2D2 状态指出设备的两个不同睡眠状态。随着设备从状态指出设备的两个不同睡眠状态。随着设备从 D0D0状态变化到状态变化到 D3D3 状态,设备将消耗越来越少的电力,同时状态,设备将消耗越来越少的电力,同时需要保留的当前状态上下文信息也越来越少。而设备再转需要保留的当前状态上下文信息也越来越少。而设备再转变回变回 D0D0 状态的延迟期则相应增加。 状态的延迟期则相应增加。 MicrosoftMicrosoft规定了不同类型设备的类专用电源需求。例如,规定了不同类型设备的类专用电源需求。例如,这个规范要求每个设备至少要支持这个规范要求每个设备至少要支持 D0D0 和和 D3D3 两个状态。两个状态。输入设备输入设备 (( 键盘、鼠标等键盘、鼠标等 )) 还应该支持还应该支持 D1D1 状状态。态。 ModemModem 设备需要另外支持设备需要另外支持 D2D2 状态。设备类上的这状态。设备类上的这些不同规定可能来源于设备的用途和工业上的实践。些不同规定可能来源于设备的用途和工业上的实践。 操作系统不直接处理设备的电源状态,由设备驱动程序专操作系统不直接处理设备的电源状态,由设备驱动程序专门处理门处理

Page 20: PNP&Power Management&WMI

系统电源状态系统电源状态 系统使用一组与系统使用一组与 ACPIACPI 设备状态类似的系设备状态类似的系统电源状态来控制电源,如下图。统电源状态来控制电源,如下图。

Page 21: PNP&Power Management&WMI
Page 22: PNP&Power Management&WMI

系统电源状态系统电源状态 WorkingWorking 状态是全供电状态,计算机可以实现全状态是全供电状态,计算机可以实现全部功能。程序仅能在部功能。程序仅能在 WorkingWorking 状态下执行。 状态下执行。 其它系统电源状态对应更小的电力需求配置,在其它系统电源状态对应更小的电力需求配置,在这些系统电源状态中,计算机不能执行任何指令。这些系统电源状态中,计算机不能执行任何指令。

ShutdownShutdown 状态就是电源关闭状状态就是电源关闭状态。态。 HibernateHibernate 状态是另一种状态是另一种 ShutdownShutdown 状态,状态,它把计算机的整个状态都记录到硬盘上,因此在它把计算机的整个状态都记录到硬盘上,因此在电源恢复供电时可以使计算机快速恢复到记录前电源恢复供电时可以使计算机快速恢复到记录前的状态。在的状态。在 HibernateHibernate 和和 WorkingWorking 状态之间是状态之间是三个有不同电力消耗级别的中间状态。三个有不同电力消耗级别的中间状态。

Page 23: PNP&Power Management&WMI

电源状态转换电源状态转换 系统初始化后即进入系统初始化后即进入 WorkingWorking 状态。大部状态。大部分设备也以分设备也以 D0D0 状态启动,但某些设备的驱状态启动,但某些设备的驱动程序会在设备启动时使设备进入低电源动程序会在设备启动时使设备进入低电源消耗状态。在系统启动并正常运行后,这消耗状态。在系统启动并正常运行后,这些设备的驱动程序才使设备进入一个稳定些设备的驱动程序才使设备进入一个稳定的状态,在这个状态中,系统电源处于的状态,在这个状态中,系统电源处于

WorkingWorking 状态,而设备处于的状态取决于状态,而设备处于的状态取决于具体活动和设备自身的能力。 具体活动和设备自身的能力。

Page 24: PNP&Power Management&WMI

电源状态转换电源状态转换 用户的活动或外部事件会导致电源状态的改变。用户的活动或外部事件会导致电源状态的改变。 一个常见的电源状态转换情景是用户在开始菜单上选择一个常见的电源状态转换情景是用户在开始菜单上选择“关闭系统”中的“等待”选项,使计算机进入等待状态。“关闭系统”中的“等待”选项,使计算机进入等待状态。 在响应这个命令过程中,电源管理器首先向每个驱动程序在响应这个命令过程中,电源管理器首先向每个驱动程序发送带有发送带有 IRP_MN_QUERY_POWERIRP_MN_QUERY_POWER 副功能码的副功能码的

IRP_MJ_POWERIRP_MJ_POWER 请求以询问设备能否接受即将到来的请求以询问设备能否接受即将到来的电源关闭请求。如果所有驱动程序都同意,电源管理器将电源关闭请求。如果所有驱动程序都同意,电源管理器将发送第二个带有发送第二个带有 IRP_MN_SET_POWERIRP_MN_SET_POWER 副功能码的电副功能码的电源管理源管理 IRPIRP ,然后驱动程序把其设备置入低电源状态以,然后驱动程序把其设备置入低电源状态以响应这个响应这个 IRPIRP 。如果有任何一个驱动程序否决了这个查。如果有任何一个驱动程序否决了这个查询,电源管理器仍旧发出这个询,电源管理器仍旧发出这个 IRP_MN_SET_POWERIRP_MN_SET_POWER请求,但它使用现在的电源级别。请求,但它使用现在的电源级别。

Page 25: PNP&Power Management&WMI

电源状态转换电源状态转换 系统并不总是发送系统并不总是发送 IRP_MN_QUERY_POWERIRP_MN_QUERY_POWER请求。某些事件请求。某些事件 (( 如电池电力将要耗尽如电池电力将要耗尽 )) 必须被必须被无条件接受,并且操作系统也不再发出查询请求。无条件接受,并且操作系统也不再发出查询请求。 如果查询发出后,并且驱动程序也接受了请求的如果查询发出后,并且驱动程序也接受了请求的电源状态,那么驱动程序将不再启动任何会妨碍电源状态,那么驱动程序将不再启动任何会妨碍未来电源状态设置请求的操作。例如,磁带机驱未来电源状态设置请求的操作。例如,磁带机驱动程序在使一个进入低电源状态的查询请求成功动程序在使一个进入低电源状态的查询请求成功返回前先确保当前没有执行备份操作。另外,该返回前先确保当前没有执行备份操作。另外,该驱动程序还拒绝任何后来的备份命令,除非是另驱动程序还拒绝任何后来的备份命令,除非是另一个电源状态设置请求。 一个电源状态设置请求。

Page 26: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 电源管理器与驱动程序沟通使用电源管理器与驱动程序沟通使用

IRP_MJ_POWERIRP_MJ_POWER 类型的类型的 IRPIRP 下表列出了当前可以使用的四个副功能码。下表列出了当前可以使用的四个副功能码。

Page 27: PNP&Power Management&WMI

Minor Function Code Description

IRP_MN_QUERY_POWER Determines whether prospective

change in power state can safely occur

IRP_MN_SET_POWER Instructs driver to change power state

IRP_MN_WAIT_WAKE

Instructs bus driver to arm wake-up feature; provides way for function driver to know when wake-up signal occurs

IRP_MN_POWER_SEQUENCE

Provides optimization for context saving and restoring

Page 28: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 所有驱动程序,包括过滤器驱动程序和功所有驱动程序,包括过滤器驱动程序和功能驱动程序通常都向其下面的驱动程序传能驱动程序通常都向其下面的驱动程序传递电源管理请求。唯一的例外是递电源管理请求。唯一的例外是

IRP_MN_QUERY_POWERIRP_MN_QUERY_POWER 请求。请求。 IO_STACK_LOCATIONIO_STACK_LOCATION 的的

ParametersParameters 联合中的联合中的 PowerPower 子结构有子结构有四个参数描述了电源管理请求,但大多数四个参数描述了电源管理请求,但大多数WDMWDM 驱动程序仅对其中两个参数感兴趣 驱动程序仅对其中两个参数感兴趣

Page 29: PNP&Power Management&WMI

SystemContext A context value used internally by the Power Manager

Type DevicePowerState or SystemPowerState

(values of POWER_STATE_TYPE enumeration)

State

Power state—either a DEVICE_POWER_STATE enumeration value or a SYSTEM_POWER_STATE enumeration value

ShutdownType A code indicating the reason for a transition to PowerSystem Shutdown

Page 30: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 控制如何把电源管理请求传递到低级驱动程序有控制如何把电源管理请求传递到低级驱动程序有特殊的规则。第一,在释放一个电源管理请求的特殊的规则。第一,在释放一个电源管理请求的控制之前,必须调用控制之前,必须调用 PoStartNextPowerIrpPoStartNextPowerIrp ,,即使以错误状态完成该即使以错误状态完成该 IRPIRP ,也要这样做。做这,也要这样做。做这个调用的原因是,电源管理器自己需要维持一个个调用的原因是,电源管理器自己需要维持一个电源管理请求队列,所以必须通知它确实可以出电源管理请求队列,所以必须通知它确实可以出队一个请求,以及向设备发送下一个请求。除了队一个请求,以及向设备发送下一个请求。除了调用调用 PoStartNextPowerIrpPoStartNextPowerIrp ,还必须调用专,还必须调用专用例程用例程 PoCallDriverPoCallDriver(( 代替代替 IoCallDriverIoCallDriver))来向下层驱动程序发送请求。来向下层驱动程序发送请求。 下图显示了三种可能的电源请求处理过程。下图显示了三种可能的电源请求处理过程。

Page 31: PNP&Power Management&WMI
Page 32: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 下面函数显示了一个电源管理请求沿设备堆栈被向下下面函数显示了一个电源管理请求沿设备堆栈被向下传递的过程 传递的过程 NTSTATUS DefaultPowerHandler(IN NTSTATUS DefaultPowerHandler(IN

PDEVICE_OBJECT fdo, IN PIRP Irp) { PDEVICE_OBJECT fdo, IN PIRP Irp) { PoStartNextPowerIrp(Irp); PoStartNextPowerIrp(Irp); IoSkipCurrentIrpStackLocation(Irp); IoSkipCurrentIrpStackLocation(Irp); PDEVICE_EXTENSION pdx = PDEVICE_EXTENSION pdx =

(PDEVICE_EXTENSION) fdo-(PDEVICE_EXTENSION) fdo->DeviceExtension; return PoCallDriver(pdx->DeviceExtension; return PoCallDriver(pdx->LowerDeviceObject, Irp);>LowerDeviceObject, Irp);

} }

Page 33: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 功能驱动程序使用两个步骤来传递功能驱动程序使用两个步骤来传递 IRPIRP 并并执行其设备相关的动作,当进入更低的电执行其设备相关的动作,当进入更低的电源状态时,它先执行设备相关的步骤,然源状态时,它先执行设备相关的步骤,然后向下传递请求。当回到更高的电源状态后向下传递请求。当回到更高的电源状态时,它先向下传递请求,然后在完成例程时,它先向下传递请求,然后在完成例程中执行设备相关的步骤。这个巧妙的嵌套中执行设备相关的步骤。这个巧妙的嵌套操作保证了当驱动程序操作硬件时,硬件操作保证了当驱动程序操作硬件时,硬件一直处于供电状态。一直处于供电状态。

Page 34: PNP&Power Management&WMI
Page 35: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 电源管理电源管理 IRPIRP 到来时,程序处于一个系统线程的上下文到来时,程序处于一个系统线程的上下文中,不要阻塞这个线程。中,不要阻塞这个线程。 如果设备有如果设备有 INRUSHINRUSH 特征,或者清除了设备对象中的特征,或者清除了设备对象中的

DO_POWER_PAGABLEDO_POWER_PAGABLE 标志,那么电源管理器将在标志,那么电源管理器将在DISPATCH_LEVELDISPATCH_LEVEL 级上发送级上发送 IRPIRP 。而当执行在。而当执行在DISPATCH_LEVELDISPATCH_LEVEL 级上时,不可能阻塞一个线程。级上时,不可能阻塞一个线程。

如果设置了如果设置了 DO_POWER_PAGABLEDO_POWER_PAGABLE 标志,会在标志,会在PASSIVE_LEVELPASSIVE_LEVEL 级上收到电源管理级上收到电源管理 IRPIRP ,此时,如果,此时,如果在服务一个系统在服务一个系统 IRPIRP 时请求了设备电源管理时请求了设备电源管理 IRPIRP 然后阻然后阻塞,将导致死锁:电源管理器不会向程序发送设备塞,将导致死锁:电源管理器不会向程序发送设备 IRPIRP ,,除非系统除非系统 IRPIRP 派遣例程返回,因此将永远等待下去 派遣例程返回,因此将永远等待下去

Page 36: PNP&Power Management&WMI

处理处理 IRP_MJ_POWERIRP_MJ_POWER 请求请求 功能驱动程序在处理某些电源管理请求时会执行一功能驱动程序在处理某些电源管理请求时会执行一些耗费时间的步骤。些耗费时间的步骤。 DDKDDK 指出,可以在用户不易指出,可以在用户不易察觉的范围内延迟电源管理察觉的范围内延迟电源管理 IRPIRP 的完成,但是能够的完成,但是能够延迟并不意味着能够阻塞。在这些操作完成时,不延迟并不意味着能够阻塞。在这些操作完成时,不能阻塞意味着需要使用完成例程来使这些步骤异步。能阻塞意味着需要使用完成例程来使这些步骤异步。 对对 IRP_MN_QUERY_POWERIRP_MN_QUERY_POWER查询可以回查询可以回答“答“ Yes”Yes” 或“或“ No”No” 。即可以失败该。即可以失败该 IRPIRP 。失败该。失败该

IRPIRP 就是说“就是说“ No”No” 。但对于。但对于IRP_MN_SET_POWERIRP_MN_SET_POWER 请求却没有这样的自由:请求却没有这样的自由:必须执行它携带的指令。必须执行它携带的指令。

Page 37: PNP&Power Management&WMI

管理电源状态转换管理电源状态转换 设备可以有唤醒系统的能力。设备可以决定成功还是失败设备可以有唤醒系统的能力。设备可以决定成功还是失败一个查询,决定由哪个设备电源状态来对应新系统电源状一个查询,决定由哪个设备电源状态来对应新系统电源状态,这些都取决于设备当前是否使用了唤醒特征。态,这些都取决于设备当前是否使用了唤醒特征。 可以在没有任何活动时关闭设备的电源供应,当有可以在没有任何活动时关闭设备的电源供应,当有 IRPIRP 到到来时再恢复设备的电源供应。也许设备是一来时再恢复设备的电源供应。也许设备是一个“个“ INRUSH”INRUSH” 设备,这种设备在上电时需要大的电流,设备,这种设备在上电时需要大的电流,因此电源管理器需要特殊对待这种设备。 因此电源管理器需要特殊对待这种设备。 传统方法解决传统方法解决 query-powerquery-power 和和 set-powerset-power 操作时,即用操作时,即用通常的派遣例程和完成例程,需要非常精确的编码,需要通常的派遣例程和完成例程,需要非常精确的编码,需要面对许多复杂的因素。因此可以围绕一个有限状态机来建面对许多复杂的因素。因此可以围绕一个有限状态机来建立电源管理程序,有限状态机可以方便地处理异步活动。立电源管理程序,有限状态机可以方便地处理异步活动。 最开始写程序对电源管理的最开始写程序对电源管理的 IRPIRP 处理可以是直接向下发送 处理可以是直接向下发送

Page 38: PNP&Power Management&WMI

WMI (windows WMI (windows management and management and instrumentation)instrumentation)

Windows 2000Windows 2000支持一种称为支持一种称为 WindowsWindows 管理管理诊断诊断 (WMI)(WMI) 的机制,用于管理计算机系统 的机制,用于管理计算机系统 WBEM(WBEM( 基于基于WebWeb 的企业管理的企业管理 )) 是一个广泛的是一个广泛的工业标准,而工业标准,而 WMIWMI 是这个工业标准的是这个工业标准的

MicrosoftMicrosoft 实现。 实现。 WMIWMI 的目标是为系统管理和企业网络中管理数据的目标是为系统管理和企业网络中管理数据的描述提供了一个模型,并尽可能独立于专用的描述提供了一个模型,并尽可能独立于专用

APIAPI 或数据对象模型。这种独立性促进了能创建、或数据对象模型。这种独立性促进了能创建、传输,和显示控制数据的独立系统部件的发展。 传输,和显示控制数据的独立系统部件的发展。

Page 39: PNP&Power Management&WMI

WMIWMI 公用信息模型公用信息模型 (CIM)(CIM) 是由是由 DMTF(Distributed DMTF(Distributed

Management Task Force)Management Task Force)支持的基于支持的基于WebWeb 的企的企业管理规范,以前被称为业管理规范,以前被称为 DMTFDMTF 。。 MicrosoftMicrosoft命名命名其其 CIMCIM 实现为“实现为“WBEM”WBEM” ,其本质上是“,其本质上是“ CIM for CIM for Windows”Windows” 。。 CIM for WindowsCIM for Windows 的内核模式部分的内核模式部分称为“称为“WMI”WMI” 。为了使。为了使 CIMCIM 被更广泛地采被更广泛地采纳,纳, DMTFDMTF 启动了一个市场行动并使用启动了一个市场行动并使用 WBEMWBEM 作作为为 CIMCIM 的名称。之后的名称。之后 MicrosoftMicrosoft 重命名其重命名其 WBEMWBEM实现为实现为 WMIWMI ,并重命名,并重命名WMI(WMI(内核模式部分内核模式部分 ))为“为“WMI extensions for WDM”WMI extensions for WDM” 。这就是。这就是说,说, WMIWMI兼容兼容 CIMCIM 和和 WBEMWBEM规范。规范。

Page 40: PNP&Power Management&WMI

WMIWMI WDMWDM 驱动程序以三种方式适应驱动程序以三种方式适应 WMIWMI ,,第一,第一, WMIWMI 通常能响应提取性能数据的请通常能响应提取性能数据的请求。第二,各种控制器应用程序可以使用求。第二,各种控制器应用程序可以使用

WMIWMI 方式控制设备的通用特征。第方式控制设备的通用特征。第三,三, WMIWMI提供了一个事件通知机制,允许提供了一个事件通知机制,允许驱动程序通知应用程序有重要的事件发生。驱动程序通知应用程序有重要的事件发生。 看下图看下图

Page 41: PNP&Power Management&WMI
Page 42: PNP&Power Management&WMI

WMIWMI 在在 WMIWMI模型中,数据和事件被分成了消费者和模型中,数据和事件被分成了消费者和生产者两类。数据块就是抽象类的实例,其概念生产者两类。数据块就是抽象类的实例,其概念

与与 C++C++ 中的类概念一致。中的类概念一致。 如同如同 C++C++ 中的类,中的类, WMIWMI 类也有数据成员和实类也有数据成员和实现对象行为的方法。现对象行为的方法。 数据块中的内容并不是由数据块中的内容并不是由 WMIWMI 指定,而是由数指定,而是由数据生产者和数据的使用目的决定的。送往驱动程据生产者和数据的使用目的决定的。送往驱动程序的数据最有可能来自管理者本身的操作。而驱序的数据最有可能来自管理者本身的操作。而驱动程序发出的数据通常是某种性能的统计数据,动程序发出的数据通常是某种性能的统计数据,这些数据的消费者可能是某个性能监视程序。 这些数据的消费者可能是某个性能监视程序。

Page 43: PNP&Power Management&WMI

WMIWMI WMIWMI 允许存在多重命名空间,每个命名空间中包含的类允许存在多重命名空间,每个命名空间中包含的类属于一个或多个用户模式生产者。生产者使用平台属于一个或多个用户模式生产者。生产者使用平台 SDKSDK中公开的中公开的 COMCOM 接口来注册接口来注册 WindowsWindows 管理服务管理服务

(Windows Management Service)(Windows Management Service) 。一旦。一旦 Windows Windows 20002000 发行,操作系统发行,操作系统 (( 包括所有设备驱动程序包括所有设备驱动程序 )) 将支持将支持一个名为一个名为 root\cimv2root\cimv2 的命名空间,里面包含了的命名空间,里面包含了 CIMCIM 版版本本 22 。在。在 CIMV2CIMV2命名空间的结构还未确定命名空间的结构还未确定时,时, MicrosoftMicrosoft 决定临时为设备驱动程序类使用另一个决定临时为设备驱动程序类使用另一个命名空间命名空间 root\wmiroot\wmi 。。

可以下载可以下载WMI toolsWMI tools 来查看来查看 wmiwmi 数据和事件或者帮助数据和事件或者帮助调试调试 wmiwmi 程序,这些工具包括:程序,这些工具包括: WMI object WMI object browser, WMI CIM studio, WMI Event browser, WMI CIM studio, WMI Event Registration tool, WMI event viwer.Registration tool, WMI event viwer.

Page 44: PNP&Power Management&WMI

WMIWMI WDMWDM 驱动程序可以作为驱动程序可以作为 WMIWMI 类实例的生类实例的生产者。一个描述了驱动程序支持的各种类产者。一个描述了驱动程序支持的各种类(( 驱动程序可以为这些类提供数据驱动程序可以为这些类提供数据 )) 的脚本的脚本称为驱动程序规划称为驱动程序规划 (schema)(schema) 。可以使用。可以使用

MOF(Managed Object Format)MOF(Managed Object Format) 语言定语言定义规划。系统则维护一个称为义规划。系统则维护一个称为 repositoryrepository的数据字典,它包含了所有已知的规划定义。的数据字典,它包含了所有已知的规划定义。如果驱动程序做得正确,系统将在初始化驱如果驱动程序做得正确,系统将在初始化驱动程序时自动把规划放到动程序时自动把规划放到 repositoryrepository 中。中。

Page 45: PNP&Power Management&WMI
Page 46: PNP&Power Management&WMI

规划规划 一个最简单的一个最简单的 WMIWMI规划的例子规划的例子

PNP&PM&WMI.docPNP&PM&WMI.doc 用用 MOFMOF编译器编译这个规划并产生一个二进制编译器编译这个规划并产生一个二进制文件,这个文件最后将成为驱动程序可执行文件文件,这个文件最后将成为驱动程序可执行文件的一个资源。在驱动程序初始化过程中,有一部的一个资源。在驱动程序初始化过程中,有一部分代码就是告诉分代码就是告诉 WMIWMI 生产者这个资源在哪里,生产者这个资源在哪里,以便它能读取这个规划并添入到以便它能读取这个规划并添入到 repositoryrepository 。。 编译完规划后,还应该运行编译完规划后,还应该运行 WMIMOFCK.EXEWMIMOFCK.EXE工具,在工具,在 DDKDDK 中可以找到该工具,该工具执行检中可以找到该工具,该工具执行检测以便规划能与测以便规划能与 WMIWMI兼容。兼容。

Page 47: PNP&Power Management&WMI

WDMWDM 驱动程序与驱动程序与 WMI WMI 内核模式驱动程序对内核模式驱动程序对 WMIWMI 的支持主要是基于对主代码为的支持主要是基于对主代码为

IRP_MJ_SYSTEM_CONTROLIRP_MJ_SYSTEM_CONTROL 的的 IRPIRP 的支持。为了能的支持。为了能接收到这种接收到这种 IRPIRP ,必须先注册这种需求:,必须先注册这种需求: IoWMIRegistrationControl(fdo, WMI_ACTION_REIoWMIRegistrationControl(fdo, WMI_ACTION_RE

GISTER); GISTER); 注册调用的恰当时间是在注册调用的恰当时间是在 AddDeviceAddDevice 例程中,注册完成例程中,注册完成后,一旦系统认为可以安全地向驱动程序发送系统控制后,一旦系统认为可以安全地向驱动程序发送系统控制

IRPIRP 时,它就向驱动程序发出一个时,它就向驱动程序发出一个IRP_MJ_SYSTEM_CONTROLIRP_MJ_SYSTEM_CONTROL 请求,以获得设备的详细请求,以获得设备的详细注册信息。与注册调用作用相反的调用应该在注册信息。与注册调用作用相反的调用应该在RemoveDeviceRemoveDevice 函数中做出:函数中做出:

IoWMIRegistrationControl(fdo, WMI_ACTION_DEIoWMIRegistrationControl(fdo, WMI_ACTION_DEREGISTER); REGISTER);

Page 48: PNP&Power Management&WMI

Minor Function Codes for IRP_MJ_SYSTEM_CONTROL

Minor Function Code Description

IRP_MN_QUERY_ALL_DATA Gets all instances of every item in a data block

IRP_MN_QUERY_SINGLE_INSTANCE

Gets every item in a single instance of a data block

IRP_MN_CHANGE_SINGLE_INSTANCE

Replaces every item in a single instance of a data block

IRP_MN_CHANGE_SINGLE_ITEM Changes one item in a data block

IRP_MN_ENABLE_EVENTS Enables event generation

IRP_MN_DISABLE_EVENTS Disables event generation

IRP_MN_ENABLE_COLLECTION Starts collecting “expensive” statistics

IRP_MN_DISABLE_COLLECTION Stops collecting “expensive” statistics

IRP_MN_REGINFO_EX Gets detailed registration information

IRP_MN_EXECUTE_METHOD Executes a method function

Page 49: PNP&Power Management&WMI

一个典型的查询操作的流程一个典型的查询操作的流程

Page 50: PNP&Power Management&WMI

用户模式程序与用户模式程序与 WMI WMI WMIWMI 使用使用 COMCOM 方式支持用户模式应用程序。方式支持用户模式应用程序。通过实现几个通过实现几个 COMCOM 接口,接口, WindowsWindows 管理服务管理服务就象消费者与生产者之间的信息流交易场所。生就象消费者与生产者之间的信息流交易场所。生产者经由某个接口向产者经由某个接口向 WindowsWindows 管理程序注册它管理程序注册它们的存在。消费者通过接口间接地与生产者通信。们的存在。消费者通过接口间接地与生产者通信。 如果想在用户模式中访问如果想在用户模式中访问WMIWMI 信息,首先需要信息,首先需要与一个特殊的命名空间建立连接。在该命名空间与一个特殊的命名空间建立连接。在该命名空间的上下文中,可以找到的上下文中,可以找到 WMIWMI 类的实例。可以查类的实例。可以查询并设置与该类实例相关的的数据块,调用它们询并设置与该类实例相关的的数据块,调用它们的方法例程,监视它们生成的事件。的方法例程,监视它们生成的事件。