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 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 Hal.lib
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 HwStorPortProhibitedDDIs (storport) IrqlKeDispatchLte (wdm) MarkingQueuedIrps (wdm) ReqSendWhileSpinlock () , 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