建立中斷物件

處理裝置硬體中斷的 Windows 驅動程式架構 (WDF) 驅動程式必須為每個裝置可支援的中斷建立架構中斷物件。 在Windows 8或更新版本的作業系統上執行的架構 1.11 版和更新版本中,Kernel-Mode Driver Framework (KMDF) 和User-Mode Driver Framework (UMDF) 驅動程式可以建立需要被動層級處理的中斷物件。 不過,除非您在晶片 (SoC) 平臺上撰寫系統的驅動程式,否則驅動程式應該使用 DIRQL 中斷物件。

驅動程式通常會在其 EvtDriverDeviceAdd 回呼函式中建立架構中斷物件。 驅動程式也可以從其 EvtDevicePrepareHardware 回呼函式建立中斷物件。

架構會先呼叫驅動程式的EvtDriverDeviceAdd回呼函式,再呼叫 隨插即用 (PnP) 管理員已將系統資源,例如中斷向量指派給裝置。 在 PnP 管理員指派資源之後,架構會將中斷資源儲存在裝置的中斷物件中。 不支援隨插即用的驅動程式 (無法使用中斷物件。)

若要建立架構中斷物件,您的驅動程式必須初始化 WDF_INTERRUPT_CONFIG 結構,並將它傳遞至 WdfInterruptCreate 方法。

UMDF 支援下列類型的中斷:

  • 層級觸發 (共用或獨佔)
  • 僅限邊緣觸發 (獨佔)
  • 依定義) 的 MSI (獨佔

注意 UMDF 不支援 共用 邊緣觸發的中斷。

從 UMDF 2.15 版開始,UMDF 支援簡單的裝置中斷,例如硬體按鈕,通常是由 GPIO 針腳所支援,您無法使用硬體暫存器明確啟用或停用。 若要支援這類裝置,UMDF 驅動程式必須使用獨佔邊緣觸發的中斷。

從 KMDF 1.15 版開始,KMDF 也支援這類裝置的中斷,而不需要 處理Active-Both中斷中所述的因應措施。

此外,在 WDF_INTERRUPT_CONFIG中,驅動程式會提供下列驅動程式提供的事件回呼函式的指標:

EvtInterruptEnable
啟用硬體中斷。

EvtInterruptDisable
停用硬體中斷。

EvtInterruptIsr
插斷服務常式 (ISR) 中斷。

EvtInterruptDpc
延遲程序呼叫 (中斷的 DPC) 。

EvtInterruptWorkItem
被動層級中斷的工作專案。

對於在作業系統Windows 8或更新版本上使用架構 1.11 版或更新版本的驅動程式,驅動程式可以將架構中斷物件的父代 (DIRQL 或被動) 設定為架構裝置物件或架構佇列物件。 如果驅動程式指定父系,驅動程式必須將中斷物件WDF_INTERRUPT_CONFIG結構的AutomaticSerialization成員設定為 TRUE。 (回想一下,如果 AutomaticSerialization 為 TRUE,架構會將中斷物件的 EvtInterruptDpcEvtInterruptWorkItem 回呼函式與中斷父物件下其他物件的回呼函式同步處理。)

例如,驅動程式可能會將佇列指定為中斷的父系,以將佇列的回呼與中斷的 EvtInterruptDpcEvtInterruptWorkItem 回呼同步處理。 在此組態中,架構會在刪除裝置物件時刪除佇列物件。

呼叫WdfInterruptCreate之後,驅動程式可以選擇性地呼叫WdfInterruptSetPolicy 或 WdfInterruptSetExtendedPolicy來指定其他中斷參數。 驅動程式通常會從其 EvtDriverDeviceAdd 回呼函式呼叫這些方法。

架構會在刪除中斷的父代之前自動刪除中斷。 或者,驅動程式可以呼叫 WdfObjectDelete ,以在稍早的時間刪除中斷。

支援訊息訊號中斷

從 Windows Vista 開始,支援訊息訊號中斷 (MSI) 。 若要讓作業系統支援裝置的 MSI,驅動程式的 INF 檔案必須在登錄中設定一些值。 如需如何設定這些值的詳細資訊,請參閱 在登錄中啟用Message-Signaled中斷

您的驅動程式應該針對裝置可支援的每個插斷向量或 MSI 訊息建立架構中斷物件。 如果 PnP 管理員未授與裝置可支援的所有中斷資源,將不會使用額外的中斷物件,而且不會呼叫其回呼函式。

在 Windows 7 中,作業系統不支援每個裝置函式超過 910 個中斷訊息的資源要求。 在Windows 8中,作業系統不支援每個裝置函式超過 2048 個中斷的資源要求。

如果設備磁碟機超過此限制,裝置可能無法啟動。 若要在包含許多邏輯處理器的電腦中操作,驅動程式不應該要求每個處理器有一個以上的中斷。

驅動程式必須容忍中斷資源的系統重新平衡,PnP 管理員會從資源需求清單中指派給裝置的任何一組替代中斷資源。 例如,裝置可能會指派的訊息中斷數目比要求的驅動程式少。 在最糟的情況下,驅動程式必須準備好只使用一行中斷來操作裝置。