使 ISR 处于活动或非活动状态

从 Windows 8 开始,驱动程序可以调用 IoReportInterruptActiveIoReportInterruptInactive 例程,使注册的中断服务例程 (ISR) 活动或非活动状态。

若要注册 ISR 并将 ISR 连接到中断或一组中断,驱动程序会调用 IoConnectInterruptEx 例程。 注册 ISR 后,驱动程序可以使用 IoReportInterruptActiveIoReportInterruptInactive 执行轻型 (或“软”) 连接和断开连接操作,使 ISR 的注册保持不变。 IoReportInterruptInactive 通过软断开关联的中断或中断来禁用对 ISR 的调用。 IoReportInterruptActive 软连接这些中断以启用对 ISR 的调用。

例如,驱动程序可能会调用 IoReportInterruptInactive 以在设备退出 D0 电源状态之前软断开一组中断,并在设备重新进入 D0 后调用 IoReportInterruptActive 以软连接这些中断。 原则上,驱动程序可能会在设备退出 D0 之前调用 IoDisconnectInterruptEx ,并在设备重新进入 D0 后调用 IoConnectInterruptEx 。 但是, IoReportInterruptXxx 调用比 IoConnectInterruptExIoDisconnectInterruptEx 调用快。 与 IoConnectInterruptExIoDisconnectInterruptEx 调用相比,IoConnectInterruptEx 调用可能会因各种原因而失败, (例如,) 系统资源不足, IoReportInterruptXxx 调用很少失败(如果有的话)。 此外, IoReportInterruptXxx 例程可以在 IRQL <= DISPATCH_LEVEL调用,而 IoConnectInterruptExIoDisconnectInterruptEx 只能在PASSIVE_LEVEL调用。

默认情况下,ISR (处于活动状态,并在 IoConnectInterruptEx 成功注册 ISR 后) 启用对 ISR 的调用。

IoReportInterruptInactiveIoReportInterruptActive 的调用是可选的。 如果驱动程序从未调用这些例程,则注册的 ISR 将保持活动状态,直到驱动程序调用 IoDisconnectInterruptEx 例程来注销 ISR。

驱动程序应将设备配置为仅在这些中断的 ISR 处于活动状态时发出中断。 当 ISR 处于非活动状态时,无法阻止设备发出中断可能会导致系统不稳定。 例如,如果设备与其他设备共享级别触发的中断线,并且当 ISR 处于非活动状态时,设备发出中断请求,则线路上其他设备的 ISR 将不会确认中断,并且中断将继续触发。 在调用 IoReportInterruptInactive 之前,驱动程序应将设备配置为停止发出中断。 调用 IoReportInterruptActive 后,驱动程序应将设备配置为开始发出中断。

若要注销 ISR,驱动程序可以调用 IoDisconnectInterruptEx ,而不考虑 ISR 当前处于活动状态还是非活动状态。

当 ISR 已处于活动状态时发生的 IoReportInterruptActive 调用不起作用,但不被视为错误。 同样,当 ISR 已 处于非活动状态时发生的 IoReportInterruptInactive 调用不起作用,但不被视为错误。