KeAcquireSpinLock 宏 (wdm.h)

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

语法

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

参数

SpinLock

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

OldIrql

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

返回值

备注

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

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

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

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

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

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library Hal.lib
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlKeDispatchLte (wdm) MarkQueuedIrps (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