WdfInterruptAcquireLock 函式 (wdfinterrupt.h)

[適用於 KMDF 和 UMDF]

WdfInterruptAcquireLock 方法會開始程式代碼序列,在裝置的裝置中斷要求層級執行, (DIRQL) 同時保存中斷物件的微調鎖定。

對於被動層級中斷物件,此方法會開始在被動層級執行的程式代碼序列,同時保留中斷對象的被動鎖定。

語法

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

參數

[in] Interrupt

架構中斷物件的句柄。

備註

如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。

當驅動程式在 DIRQL 中斷物件上呼叫 WdfInterruptAcquireLock 時,系統會將處理器的 IRQL 引發至裝置的 DIRQL,並取得中斷物件 WDF_INTERRUPT_CONFIG 結構中指定的驅動程式微調鎖定。 因此,中斷物件的 EvtInterruptIsrEvtInterruptSynchronize 回呼函式 (,以及呼叫相同中斷) 物件 之 WdfInterruptAcquireLock 的任何其他程式代碼都無法執行。

當驅動程式呼叫 WdfInterruptReleaseLock 時,系統會將處理器的 IRQL 傳回至其上一個層級,並釋放微調鎖定。

當驅動程式在被動層級中斷物件上呼叫 WdfInterruptAcquireLock 時,系統會取得驅動程式在中斷物件 WDF_INTERRUPT_CONFIG 結構中所設定的被動層級中斷鎖定。

當驅動程式呼叫 WdfInterruptReleaseLock 時,系統會釋放中斷鎖定。

對於被動層級中斷,驅動程式必須在 IRQL = PASSIVE_LEVEL呼叫 WdfInterruptAcquireLock

請勿從任意線程內容呼叫 WdfInterruptAcquireLock ,例如 要求處理程式

如果您的驅動程式必須執行幾行程式代碼,而不需先佔,且有效率地停用裝置中斷服務,您可以使用 WdfInterruptAcquireLockWdfInterruptReleaseLock 。 針對較大的程式代碼區段,您的驅動程序應該提供 EvtInterruptSynchronize 回呼函式。

在架構呼叫驅動程式的 EvtInterruptEnable 回呼函式或架構呼叫驅動程式的 EvtInterruptDisable 回呼函式之後,您的驅動程式無法呼叫 WdfInterruptAcquireLock

在驅動程式呼叫 WdfInterruptAcquireLock 之後,在呼叫 WdfInterruptReleaseLock 之前,它不得針對相同的中斷物件再次呼叫 方法。

如需 WdfInterruptAcquireLock 方法的詳細資訊,請參閱 同步處理中斷程序代碼

如需在架構型驅動程式中處理中斷的詳細資訊,請參閱 處理硬體中斷

對於被動層級中斷對象,驅動程式必須在任意線程中執行時呼叫 WdfInterruptTryToAcquireLock ,而不是 WdfInterruptAcquireLock,例如 佇列物件回呼函式。 例如,驅動程式可能會從 EvtIoRead 呼叫 WdfInterruptTryToAcquireLock

這麼做可避免死結的可能性,如下列案例所述。

  1. 為了判斷其裝置是否中斷,SPB 周邊裝置的函式驅動程式會從其ISR內將I/O傳送至其總線,並保留被動層級中斷鎖定。
  2. 總線驅動程式會在收到上述要求的相同線程中完成第二個要求。
  3. 第二個要求的完成例程會將要求傳送至周邊驅動程式。
  4. 周邊驅動程式的 I/O 分派例程會呼叫 WdfInterruptAcquireLock,然後死結嘗試取得中斷對象的被動鎖定。

規格需求

需求
目標平台 Universal
最小 KMDF 版本 1.0
最低UMDF版本 2.0
標頭 wdfinterrupt.h (包含 Wdf.h)
IRQL <= DIRQL
DDI 合規性規則 DriverCreate (kmdf) KmdfIrql (kmdf) , KmdfIrql2 (kmdf ) , KmdfIrqlExplicit (kmdf) , WdfInterruptLock (kmdf ) , WdfInterruptLockRelease (kmdf)

另請參閱