共用方式為


使用框架鎖定

有時候驅動程式必須提供與 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 的條件下執行,直到釋放鎖定為止。 如需被動層級處理的詳細資訊,請參閱 支援被動層級中斷