WdfInterruptAcquireLock 函式 (wdfinterrupt.h)
[適用於 KMDF 和 UMDF]
WdfInterruptAcquireLock 方法會開始程式代碼序列,在裝置的裝置中斷要求層級 (DIRQL) 上執行,同時保留中斷物件的微調鎖定。
對於被動層級中斷物件,方法會開始在被動層級執行的程式代碼序列,同時保留中斷對象的被動鎖定。
語法
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
參數
[in] Interrupt
架構中斷物件的句柄。
傳回值
沒有
言論
如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。
當驅動程式在 DIRQL 中斷物件上呼叫 WdfInterruptAcquireLock 時,系統會將處理器的 IRQL 提高到裝置的 DIRQL,並取得中斷物件 WDF_INTERRUPT_CONFIG 結構中指定的驅動程式所指定的微調鎖定。 因此,中斷物件的 EvtInterruptIsr 和 EvtInterruptSynchronize 回呼函式(以及呼叫相同中斷物件 之 WdfInterruptAcquireLock 的任何其他程序代碼,都無法執行。
當驅動程式呼叫 WdfInterruptReleaseLock時,系統會將處理器的 IRQL 傳回其上一個層級,並釋放微調鎖定。
當驅動程式在被動層級中斷物件上呼叫 WdfInterruptAcquireLock 時,系統會取得驅動程式在中斷物件 WDF_INTERRUPT_CONFIG 結構中所設定的被動層級中斷鎖定。
當驅動程式呼叫 WdfInterruptReleaseLock時,系統會釋放中斷鎖定。
針對被動層級中斷,驅動程式必須在 IRQL = PASSIVE_LEVEL 呼叫 WdfInterruptAcquireLock。
請勿從任意線程內容呼叫 WdfInterruptAcquireLock,例如 要求處理程式。
如果您的驅動程式必須執行幾行程式代碼,而不需先佔,而且有效率地停用裝置中斷,您可以使用 WdfInterruptAcquirereLock 和 WdfInterruptReleaseLock。 針對較大的程式代碼區段,您的驅動程式應該提供 EvtInterruptSynchronize 回呼函式。
您的驅動程式無法在架構呼叫驅動程式的 EvtInterruptEnable 回呼函式之前呼叫 WdfInterruptAcquireLock,或在架構呼叫驅動程式的 EvtInterruptDisable 回呼函式之後呼叫。
在驅動程式呼叫 WdfInterruptAcquireLock之後,在呼叫 WdfInterruptReleaseLock之前,它不得針對相同的中斷物件再次呼叫 方法。
如需 WdfInterruptAcquireLock 方法的詳細資訊,請參閱 同步處理中斷程式代碼。
如需在架構型驅動程式中處理中斷的詳細資訊,請參閱 處理硬體中斷。
對於被動層級中斷對象,驅動程式必須在任意線程中執行時呼叫 WdfInterruptTryToAcquireLock,而不是在任意線程中執行時呼叫 WdfInterruptAcquireLock,例如 佇列物件回呼函式。 例如,驅動程式可能會從 EvtIoRead呼叫 WdfInterruptTryToAcquireLock。
這樣做可避免死結的可能性,如下列案例所述。
- 為了判斷其裝置是否中斷,SPB 周邊裝置的功能驅動程式會從 ISR 內將 I/O 傳送至其總線,並保留被動層級中斷鎖定。
- 總線驅動程式會在收到上述要求的相同線程中完成第二個要求。
- 第二個要求的完成例程會將要求傳送至周邊驅動程式。
- 周邊驅動程式的 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) |