共用方式為


撰寫 ISR

產生中斷之實體裝置的驅動程式必須至少有一個插斷服務常式 (ISR) 。 ISR 必須執行任何適合裝置的動作來關閉中斷,可能包括停止裝置中斷。 然後,它應該只執行儲存狀態,並將 DPC 排入佇列,以較低的優先順序完成 I/O 作業, (IRQL) ,而不是 ISR 執行的時間。

驅動程式的 ISR 會在一些系統指派的 DIRQL中,在中斷內容中執行,如IoConnectInterruptEx的 SynchronizeIrql參數所指定。

ISR 是可中斷的。 具有較高系統指派 DIRQL 的另一個裝置可以隨時中斷或高 IRQL 系統中斷。

在系統呼叫 ISR 之前,它會取得中斷的微調鎖定,讓 ISR 無法同時在另一個處理器上執行。 ISR 傳回之後,系統會釋放微調鎖定。

由於 ISR 在相對較高的 IRQL 上執行,因此會遮罩目前處理器上對等或較低的 IRQL 中斷,因此應該儘快傳回控制權。 此外,在 DIRQL 上執行 ISR 會限制 ISR 可以呼叫的支援常式集。 如需詳細資訊,請參閱 管理硬體優先順序

一般而言,ISR 會執行下列一般步驟:

  • 如果造成中斷的裝置不是 ISR 所支援的裝置,ISR 會立即傳回 FALSE

  • 否則,ISR 會視需要清除中斷,並儲存任何必要的裝置內容,並將 DPC 排入佇列,以在較低的 IRQL 完成 I/O 作業。 如需詳細資訊,請參閱 DPC 物件和 DPC 。 ISR 必須接著傳回 TRUE

具體而言,在未重迭裝置 I/O 作業的驅動程式中,ISR 應該執行下列動作:

  1. 判斷中斷是否為假性。 如果是,請立即傳回 FALSE ,以便立即呼叫中斷之裝置的 ISR。 否則,請繼續中斷處理。

  2. 視需要停止裝置中斷。

  3. 收集 DpcForIsr (或 CustomDpc) 常式需要完成目前作業的 I/O 處理的任何內容資訊。

  4. 將此內容儲存在 DpcForIsrCustomDpc 常式可存取的區域,通常位於處理目前 I/O 要求造成中斷的目標裝置物件的裝置延伸模組中。

    如果驅動程式重迭 I/O 作業,內容資訊必須包含完成 DPC 常式所需的未處理要求計數,以及 DPC 常式完成每個要求所需的內容。 如果呼叫 ISR 以在 DPC 執行之前處理另一個中斷,它不得覆寫 DPC 尚未完成之要求的已儲存內容。

  5. 如果驅動程式有 DpcForIsr 常式,請使用目前 IRP、目標裝置物件和已儲存的內容指標呼叫 IoRequestDpcIoRequestDpc 會將 DpcForIsr 常式排入佇列,只要 IRQL 低於處理器上的DISPATCH_LEVEL即可執行。

    如果驅動程式有 CustomDpc 常式,請使用與 CustomDpc 常式相關聯的 DPC 物件指標呼叫 KeInsertQueueDpc , (與 CustomDpc 常式相關聯的) ,並將指標 () 至 CustomDpc 常式需要完成作業的任何已儲存內容。 通常,ISR 也會將指標傳遞至目前的 IRP 和目標裝置物件。 當 IRQL 低於處理器上的DISPATCH_LEVEL時, 就會執行 CustomDpc 常式。

  6. 傳回 TRUE ,表示其裝置產生中斷。

一般而言,ISR 不會進行實際的 I/O 處理來滿足 IRP。 相反地,它會停止其裝置中斷、設定必要的狀態資訊,並將驅動程式的 DpcForIsrCustomDpc 排入佇列,以滿足造成裝置中斷的目前要求所需的任何 I/O 處理。

ISR 必須在 DIRQL 執行,以最短的間隔執行。 遵循此指導方針可增加機器中每個裝置的 I/O 輸送量,因為在 DIRQL 遮罩執行時,系統已指派較少的或等於 IRQL 值的所有中斷。

驅動程式中斷物件的 SynchronizeIrql ,在稱為 IoConnectInterrupt的驅動程式時指定,會決定驅動程式 ISR 執行所在的 DIRQL。 如需詳細資訊,請參閱 同步處理裝置資料的存取