若要同步處理從 CustomThreadedDpc 常式內部和外部存取之記憶體位置的存取,驅動程式可以使用一般微調鎖定或佇列微調鎖定。 這樣做時,驅動程式必須遵守特定規則,才能在 IRQL = PASSIVE_LEVEL 和 IRQL = DISPATCH_LEVEL 正確同步處理,因為 CustomThreadedDpc 常式可以在這兩個 IRQL 執行。
對於普通自旋鎖,以下規則適用:
若要取得和釋放旋鎖,驅動程式可以從 CustomThreadedDpc 常式的內部和外部呼叫 KeAcquireSpinLock 和 KeReleaseSpinLock。
驅動程式可以從 CustomThreadedDpc 常式內部呼叫 KeAcquireSpinLockForDpc 和 KeReleaseSpinLockForDpc。 請注意, CustomThreadedDpc 常式不得呼叫 KeAcquireSpinLockAtDpcLevel 或 KeReleaseSpinLockFromDpcLevel,因為這些常式只能安全地呼叫 IRQL = DISPATCH_LEVEL。
佇列自旋鎖的規則相似:
若要取得和釋放旋轉鎖,驅動程式可以在 CustomThreadedDpc 常式的內部或外部呼叫 KeAcquireInStackQueuedSpinLock 和 KeReleaseInStackQueuedSpinLock。
驅動程式可以從 CustomThreadedDpc 常式內部呼叫 KeAcquireInStackQueuedSpinLockForDpc 和 KeReleaseInStackQueuedSpinLockForDpc。 請注意, CustomThreadedDpc 常式不得呼叫 KeAcquireInStackQueuedSpinLockAtDpcLevel 或 KeReleaseInStackQueuedSpinLockFromDpcLevel,因為這些常式只能在 IRQL = DISPATCH_LEVEL 安全地呼叫。
因為 KeAcquireSpinLockForDpc 和 KeAcquireInStackQueuedSpinLockForDpc 在 DISPATCH_LEVEL 呼叫時不會重設 IRQL,所以它們的執行速度分別比 KeAcquireSpinLock 和 KeAcquireInStackQueuedSpinLock 更快。
如需微調鎖定的詳細資訊,請參閱 微調鎖定。