共用方式為


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,例如 要求處理程式

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

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

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

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

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

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

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

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

要求

要求 價值
目標平臺 普遍
最低 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)

另請參閱