若要同步访问 CustomThreadedDpc 例程内外的内存位置,驱动程序可以使用普通自旋锁或队列自旋锁。 执行此作时,驱动程序必须遵循某些规则才能在 IRQL = PASSIVE_LEVEL和 IRQL = DISPATCH_LEVEL正确同步,因为 CustomThreadedDpc 例程可以在两个 IRCL 中执行。
对于普通旋转锁,以下规则适用:
若要获取和释放旋转锁,驱动程序可以从 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 分别快。
有关旋转锁的详细信息,请参阅 旋转锁。