Share via


使 ISR 作用中或非作用中

從Windows 8開始,驅動程式可以呼叫IoReportInterruptActiveIoReportInterruptInactive常式,讓已註冊的插斷服務常式 (ISR) 作用中或非作用中。

若要註冊 ISR,並將 ISR 連接到中斷或一組中斷,驅動程式會呼叫 IoConnectInterruptEx 常式。 註冊 ISR 之後,驅動程式可以使用 IoReportInterruptActiveIoReportInterruptInactive 來執行輕量型 (或「軟式」) 連線和中斷連線作業,讓 ISR 的註冊保持不變。 IoReportInterruptInactive 會藉由虛中斷相關聯的中斷或中斷來停用 ISR 的呼叫。 IoReportInterruptActive 軟體連接這些中斷,以啟用對 ISR 的呼叫。

例如,驅動程式可能會在裝置結束 D0 電源狀態之前,呼叫 IoReportInterruptInactive 來軟中斷一組中斷,並在裝置重新輸入 D0 之後呼叫 IoReportInterruptActive 來軟連接這些中斷。 基本上,驅動程式可能會改為在裝置結束 D0 之前呼叫 IoDisconnectInterruptEx ,並在裝置重新輸入 D0 之後呼叫 IoConnectInterruptEx 。 不過,IoReportInterruptXxx呼叫的速度比IoConnectInterruptExIoDisconnectInterruptEx呼叫快。 相較于IoConnectInterruptExIoDisconnectInterruptEx呼叫,這可能會因為各種原因而失敗,例如,系統資源不足 (,) 、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 目前為使用中還是非使用中。

IoReportInterruptActive呼叫,當 ISR 已在作用中時沒有作用,但不會被視為錯誤。 同樣地,當 ISR 處於非作用中狀態時,就會發生 IoReportInterruptInactive 呼叫沒有作用,但不會被視為錯誤。