KeAcquireSpinLock 宏 (wdm.h)

KeAcquireSpinLock 例程获取旋转锁,以便调用方可以通过引发 IRQL 以多处理器安全的方式同步对共享数据的访问。

语法

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

参数

SpinLock

指向调用方为其提供存储的初始化KSPIN_LOCK旋转锁的指针。

OldIrql

指向在此调用发生时设置为当前 IRQL 的 KIRQL 变量的指针。

返回值

没有

言论

KeAcquireSpinLock 首先将 IRQL 重置为DISPATCH_LEVEL,然后获取锁。 获取锁后,以前的 IRQL 将写入 OldIrql

当使用 KeReleaseSpinLock释放旋转锁时,必须指定 OldIrql 值。

大多数驱动程序使用本地变量来存储旧的 IRQL 值。 驱动程序还可以使用共享内存位置(例如全局变量),但驱动程序不能对两个不同的锁使用相同的位置。 否则,可能会发生争用情况。

如果不是明智地使用旋转锁,旋转锁可能会导致严重问题。 具体而言,不会执行死锁保护,并在保持旋转锁时禁用调度。 因此:

  • 由旋转锁保护的关键区域中的代码既不能可分页,也不能对可分页数据进行任何引用。
  • 由旋转锁保护的关键区域中的代码既不能调用任何可能访问可分页数据或引发异常的外部函数,也不能生成任何异常。
  • 调用方应尽快释放具有 KeReleaseSpinLock 的旋转锁。
尝试以递归方式获取旋转锁可以保证导致死锁。 有关旋转锁的详细信息,请参阅 旋转锁

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
Hal.lib
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIs(storport)IrqlKeDispatchLte(wdm)MarkingQueuedIrps(wdm)ReqSendWhileSpinlock(kmdf)Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm)SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport) )、 SpinLockDpc(wdm)SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport)、SpinlockRelease(wdm)SpinLockSafe(storport)、SpinLockSafe(storport)、SpinLockSafe(wdm)

另请参阅

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock