KeAcquireSpinLock マクロ (wdm.h)
KeAcquireSpinLock ルーチンはスピン ロックを取得します。これにより、呼び出し元は IRQL を発生させることで、マルチプロセッサセーフな方法で共有データへのアクセスを同期できます。
構文
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
パラメーター
SpinLock
呼び出し元がストレージを提供する、初期化KSPIN_LOCKスピン ロックへのポインター。
OldIrql
この呼び出しが発生したときに現在の IRQL に設定されている KIRQL 変数へのポインター。
戻り値
なし
解説
KeAcquireSpinLock は、最初に IRQL をDISPATCH_LEVELにリセットしてから、ロックを取得します。 前の IRQL は、ロックが取得された後に OldIrql に書き込まれます。
KeReleaseSpinLock を使用してスピン ロックを解放するときは、OldIrql 値を指定する必要があります。
ほとんどのドライバーでは、ローカル変数を使用して古い IRQL 値を格納します。 ドライバーは、グローバル変数などの共有メモリの場所を使用することもできますが、ドライバーは 2 つの異なるロックに同じ場所を使用することはできません。 そうしないと、競合状態が発生する可能性があります。
スピン ロックは、慎重に使用しないと重大な問題を引き起こす可能性があります。 特に、デッドロック保護は実行されません。また、スピン ロックが保持されている間はディスパッチが無効になります。 そのため、次のようになります。
- スピン ロックによって保護された重要な領域内のコードは、ページング可能でなく、ページング可能なデータへの参照も行う必要があります。
- スピン ロックによって保護された重要な領域内のコードは、ページング可能なデータにアクセスしたり、例外を発生させたりする可能性のある外部関数を呼び出したり、例外を生成したりすることはできません。
- 呼び出し元は、 KeReleaseSpinLock を使用してスピン ロックをできるだけ早く解放する必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | Hal.lib |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(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) |