电源管理是WDM驱动的一个重点和难点,需要处理好,否则在测试、使用过程中很容易出现各种异常。最严重的就是 bug check 0x9F 相关的各种BSOD。
这里简单介绍下,power Irp包括两类,一类是系统状态相关power Irp(system-irp),另一类是设备状态相关power Irp(device-irp)。我们在Driver Entry中注册的dispatch可以接受上述system-irp和device-irp。本文下面提到的system-irp/device-irp都是指system power irp/device power irp。
本节只介绍下面四种power相关Irp,包括 IRP_MN_QUERY_POWER System-Irp,IRP_MN_QUERY_POWER Device-Irp,IRP_MN_SET_POWER System-Irp,IRP_MN_SET_POWER Device-Irp。
上述四种power相关Irp,系统在转换power state时会首先下发system-Irp,设备的 function driver收到后,会产生一个与之对应的device-Irp,并通过系统下发到power dispatch。处理的流程是首先将system-Irp设置为pending,在device-Irp处理完毕后,依据返回状态设置system-Irp的status,再complete此 system-Irp。具体的处理流程可以参考后面的详细介绍。
上述四种power相关Irp可以依据不同的标准划分,可以划分为system、device相关,还可以划分为 query、se、wakeup相关。本节只讨论query、set相关的power Irp。这里简单描述下query和set的区别。Query通常是用于系统询问设备,是否可以进入某种power状态。Set通常在que