PnP 管理器重新分发系统资源

如果用户将设备添加到系统,并且设备需要 PnP 管理器已分配给另一个设备的系统资源,则 PnP 管理器会尝试重新分配资源。

在此过程中,PnP 管理器会停止设备并将其从工作 (D0) 状态中取出。 然后,它将新资源列表传递给设备,以便它们可以使用新资源重启。

重新分发资源时,如果设备的驱动程序之一具有:PnP 管理器不会更改设备的资源分配:

Power-Down序列

对于支持要停止的设备的每个函数和筛选器驱动程序,框架从驱动程序堆栈中最高的驱动程序开始,按顺序一次执行一个驱动程序的以下操作:

  1. 如果驱动程序使用自托管 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoSuspend 回调函数。

  2. 框架停止设备的所有电源托管 I/O 队列。

  3. 如果硬件和驱动程序支持 DMA,框架会针对创建的每个 DMA 通道调用驱动程序的 EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerFlushEvtDmaEnablerDisable 回调 函数。

  4. 调用驱动程序的 EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisable 回调函数 ((如果它们存在) ),以便驱动程序可以禁用设备中断。

  5. 框架 (调用驱动程序的 EvtDeviceD0Exit 回调函数(如果存在) )。

  6. 框架调用驱动程序的 EvtDeviceReleaseHardware 回调函数 (,如果该函数存在) 传递 PnP 管理器分配给设备的硬件资源列表。

总线驱动程序是堆栈中最低的驱动程序,最后调用。 当框架调用总线驱动程序的 EvtDeviceD0Exit 回调函数时,它将句柄传递给表示设备的 PDO 的框架设备对象和 WdfPowerDeviceD3FinalTargetState 值。 总线驱动程序可以通过调用 WdfDeviceInitSetReleaseHardwareOrderOnFailure 来控制框架何时调用其 EvtDeviceReleaseHardware 回调函数。

Power-Up序列

第一个调用的驱动程序是总线驱动程序。 当框架调用总线驱动程序的 EvtDeviceD0Entry 回调函数时,回调函数会将设备 (总线) 的子设备还原到其工作 (D0) 状态。

对于支持该设备的每个函数和筛选器驱动程序,框架按顺序一次执行一个驱动程序,从驱动程序堆栈中最低的驱动程序开始:

  1. 框架调用驱动程序的 EvtDevicePrepareHardware 回调函数(如果) 存在) (,并将 PnP 管理器分配给设备的硬件资源列表传递。

  2. 框架调用驱动程序的 EvtDeviceD0Entry 回调函数 ((如果存在) )。

  3. 框架调用驱动程序的 EvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabled 回调函数 ((如果它们) 存在),以便驱动程序可以启用设备中断。

  4. 如果硬件和驱动程序支持 DMA,框架会针对创建的每个 DMA 通道调用驱动程序的 EvtDmaEnablerFillEvtDmaEnablerEnableEvtDmaEnablerSelfManagedIoStart 回调函数。

  5. 框架调用驱动程序的 EvtChildListScanForChildren 回调函数 ((如果存在) )。

  6. 框架重启设备的所有电源托管 I/O 队列。

  7. 如果驱动程序使用自我管理的 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoRestart 回调函数。