PnP 管理器重新分发系统资源
如果用户将设备添加到系统,并且设备需要 PnP 管理器已分配给另一个设备的系统资源,则 PnP 管理器会尝试重新分配资源。
在此过程中,PnP 管理器会停止设备并将其从工作 (D0) 状态中取出。 然后,它将新资源列表传递给设备,以便它们可以使用新资源重启。
重新分发资源时,如果设备的驱动程序之一具有:PnP 管理器不会更改设备的资源分配:
名为 WdfDeviceSetSpecialFileSupport ,并在设备上打开一个特殊文件。
提供了一个 EvtDeviceQueryStop 回调函数,并且回调函数已否决了重新分配。
Power-Down序列
对于支持要停止的设备的每个函数和筛选器驱动程序,框架从驱动程序堆栈中最高的驱动程序开始,按顺序一次执行一个驱动程序的以下操作:
如果驱动程序使用自托管 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoSuspend 回调函数。
框架停止设备的所有电源托管 I/O 队列。
如果硬件和驱动程序支持 DMA,框架会针对创建的每个 DMA 通道调用驱动程序的 EvtDmaEnablerSelfManagedIoStop、 EvtDmaEnablerFlush 和 EvtDmaEnablerDisable 回调 函数。
调用驱动程序的 EvtDeviceD0ExitPreInterruptsDisabled 和 EvtInterruptDisable 回调函数 ((如果它们存在) ),以便驱动程序可以禁用设备中断。
框架 (调用驱动程序的 EvtDeviceD0Exit 回调函数(如果存在) )。
框架调用驱动程序的 EvtDeviceReleaseHardware 回调函数 (,如果该函数存在) 传递 PnP 管理器分配给设备的硬件资源列表。
总线驱动程序是堆栈中最低的驱动程序,最后调用。 当框架调用总线驱动程序的 EvtDeviceD0Exit 回调函数时,它将句柄传递给表示设备的 PDO 的框架设备对象和 WdfPowerDeviceD3Final 的 TargetState 值。 总线驱动程序可以通过调用 WdfDeviceInitSetReleaseHardwareOrderOnFailure 来控制框架何时调用其 EvtDeviceReleaseHardware 回调函数。
Power-Up序列
第一个调用的驱动程序是总线驱动程序。 当框架调用总线驱动程序的 EvtDeviceD0Entry 回调函数时,回调函数会将设备 (总线) 的子设备还原到其工作 (D0) 状态。
对于支持该设备的每个函数和筛选器驱动程序,框架按顺序一次执行一个驱动程序,从驱动程序堆栈中最低的驱动程序开始:
框架调用驱动程序的 EvtDevicePrepareHardware 回调函数(如果) 存在) (,并将 PnP 管理器分配给设备的硬件资源列表传递。
框架调用驱动程序的 EvtDeviceD0Entry 回调函数 ((如果存在) )。
框架调用驱动程序的 EvtInterruptEnable 和 EvtDeviceD0EntryPostInterruptsEnabled 回调函数 ((如果它们) 存在),以便驱动程序可以启用设备中断。
如果硬件和驱动程序支持 DMA,框架会针对创建的每个 DMA 通道调用驱动程序的 EvtDmaEnablerFill、 EvtDmaEnablerEnable 和 EvtDmaEnablerSelfManagedIoStart 回调函数。
框架调用驱动程序的 EvtChildListScanForChildren 回调函数 ((如果存在) )。
框架重启设备的所有电源托管 I/O 队列。
如果驱动程序使用自我管理的 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoRestart 回调函数。