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