共用方式為


維護中斷

本主題描述如何服務 DIRQL 中斷。 如需維護被動層級中斷的相關資訊,請參閱 支援被動層級中斷

維護中斷包含兩個步驟,有時包含三個步驟:

  1. 在 IRQL = DIRQL 執行的插斷服務常式中,將動態資訊儲存 (,例如快速註冊內容) 。

  2. 處理延遲程序呼叫中儲存的變動性資訊, (DPC) 在 IRQL = DISPATCH_LEVEL執行。

  3. 如有必要,在 IRQL = PASSIVE_LEVEL執行其他工作。

當裝置產生硬體中斷時,架構會呼叫驅動程式的插斷服務常式 (ISR) ,此架構型驅動程式會實作為 EvtInterruptIsr 回呼函式。

在裝置的 DIRQL 上執行的 EvtInterruptIsr 回呼函式必須快速儲存插斷資訊,例如註冊內容,如果發生其他中斷,將會遺失。

一般而言, EvtInterruptIsr 回呼函式會排程延遲程序呼叫 (DPC) ,稍後在較低的 IRQL (DISPATCH_LEVEL) 處理儲存的資訊。 架構型驅動程式會將 DPC 常式實作為 EvtInterruptDpcEvtDpcFunc 回呼 函式。

大部分的驅動程式會針對每種中斷類型使用單一 EvtInterruptDpc 回呼函式。 若要排程EvtInterruptDpc回呼函式的執行,驅動程式必須從EvtInterruptIsr回呼函式內呼叫WdfInterruptQueueDpcForIsr

如果您的驅動程式為每個裝置建立多個 架構佇列物件 ,您可以考慮針對每個佇列使用不同的 DPC 物件EvtDpcFunc 回呼函式。 若要排程 EvtDpcFunc 回呼函式的執行,驅動程式必須先呼叫 WdfDpcCreate來建立一或多個 DPC 物件,通常是在驅動程式的 EvtDriverDeviceAdd 回呼函式中。 然後驅動程式的 EvtInterruptIsr 回呼函式可以呼叫 WdfDpcEnqueue

驅動程式通常會在其EvtInterruptDpcEvtDpcFunc回呼函式中完成 I/O 要求

有時候驅動程式必須在 IRQL = PASSIVE_LEVEL執行一些中斷服務作業。 在這種情況下,驅動程式的 EvtInterruptDpcEvtDpcFunc 回呼函式會在 IRQL = DISPATCH_LEVEL執行,可以排程在 IRQL = PASSIVE_LEVEL執行的一或多個 架構工作專案

如需在維護裝置中斷時使用工作專案的驅動程式範例,請參閱 PCIDRV 範例驅動程式。