使用架構鎖定

有時候驅動程式必須提供與 I/O 要求相關的回呼函式的驅動程式特定同步處理,除了或取代架構提供的同步處理之外。 驅動程式可以使用回呼同步處理鎖定、微調鎖定、等候鎖定和中斷鎖定來同步處理驅動程式程式碼。

回呼同步處理鎖定

如果您已將驅動程式設定為使用架構的 自動同步 處理功能,架構會在呼叫驅動程式的 I/O 要求相關事件回呼函式之前取得同步處理鎖定。

驅動程式也可以取得這些與架構裝置物件和佇列物件相關聯的回 呼同步處理鎖定。 若要取得同步處理鎖定,驅動程式會呼叫 WdfObjectAcquireLock。 若要釋放鎖定,驅動程式會呼叫 WdfObjectReleaseLock

如果驅動程式使用架構的裝置層級或與 I/O 要求相關回呼函式的佇列層級同步處理,但必須同步處理在 IRQL = PASSIVE_LEVEL執行的某些程式碼與在 IRQL = DISPATCH_LEVEL執行的回呼函式,則您可能會想要讓驅動程式使用回呼同步處理鎖定。 這是因為驅動程式只能針對在相同 IRQL 上執行的回呼函式使用自動同步處理。

例如,只有當工作專案物件的父系執行層級為 WdfExecutionLevelPassive (時,驅動程式才能對工作專案物件使用自動同步處理,因為工作專案的回呼函式一律會在 IRQL= PASSIVE_LEVEL) 執行。 因此,如果驅動程式在裝置物件WDF_OBJECT_ATTRIBUTES結構的 ExecutionLevel 成員中指定WdfExecutionLevelDispatch,驅動程式就無法設定子工作專案物件的組態結構的AutomaticSerialization成員。 相反地,驅動程式必須取得回呼同步處理鎖定,才能同步 處理 EvtWorkItem 回呼函式與父裝置物件的回呼函式。

架構等候鎖定

使用架構等候鎖定,從在 IRQL = PASSIVE_LEVEL 執行的程式碼同步處理驅動程式資料的存取。 驅動程式必須先呼叫 WdfWaitLockCreate ,才能使用架構等候鎖定來建立等候鎖定物件。 然後,驅動程式可以呼叫 WdfWaitLockAcquire 來取得鎖定和 WdfWaitLockRelease 來釋放它。

架構微調鎖定

使用架構微調鎖定,從在 IRQL < = DISPATCH_LEVEL執行的程式碼同步處理驅動程式資料的存取。 當驅動程式執行緒取得微調鎖定時,系統會將執行緒的 IRQL 設定為DISPATCH_LEVEL。 當執行緒釋放鎖定時,系統會將執行緒的 IRQL 還原至其上一個層級。

不使用自動架構同步處理的驅動程式可能會使用微調鎖定來同步處理裝置物件內容空間的存取,如果內容空間是可寫入的,而且如果驅動程式的事件回呼函式有一個以上的函式存取空間,則為 。

驅動程式必須先呼叫 WdfSpinLockCreate ,才能使用架構微調鎖定來建立微調鎖定物件。 然後,驅動程式可以呼叫 WdfSpinLockAcquire 來取得鎖定和 WdfSpinLockRelease 以釋放它。

如需微調鎖定的範例用法,請參閱 同步處理已傳送要求的取消

架構中斷鎖定

對於支援 DIRQL 中斷處理的中斷物件,架構中斷鎖定是微調鎖定。 在驅動程式取得中斷微調鎖定之後,驅動程式會在裝置的 DIRQL 上執行,直到釋放鎖定為止。 如需使用中斷鎖定的詳細資訊,請參閱 同步處理中斷程式碼

對於支援被動層級處理的中斷物件,架構中斷鎖定是等候鎖定。 在驅動程式取得中斷等候鎖定之後,驅動程式會在 IRQL = PASSIVE_LEVEL執行,直到釋放鎖定為止。 如需被動層級處理的詳細資訊,請參閱 支援被動層級中斷