KeAcquireSpinLock ルーチンはスピン ロックを取得するため、呼び出し元は IRQL を発生させることで、マルチプロセッサセーフな方法で共有データへのアクセスを同期できます。
構文
void KeAcquireSpinLock(
SpinLock,
OldIrql
);
パラメーター
SpinLock
呼び出し元がストレージを提供する初期化されたKSPIN_LOCKスピン ロックへのポインター。
OldIrql
この呼び出しが発生したときに現在の IRQL に設定されている KIRQL 変数へのポインター。
戻り値
無し
注釈
KeAcquireSpinLock は、最初に IRQL をDISPATCH_LEVELにリセットしてから、ロックを取得します。 前の IRQL は、ロックが取得された後に OldIrql に書き込まれます。
KeReleaseSpinLock を使用してスピン ロックを解除する場合は、OldIrql 値を指定する必要があります。
ほとんどのドライバーは、ローカル変数を使用して古い IRQL 値を格納します。 ドライバーは、グローバル変数などの共有メモリの場所を使用することもできますが、ドライバーは 2 つの異なるロックに同じ場所を使用しないでください。 そうしないと、競合状態が発生する可能性があります。
スピン ロックは、慎重に使用しないと重大な問題を引き起こす可能性があります。 特に、スピン ロックが保持されている間はデッドロック保護は実行されません。ディスパッチは無効になります。 そこで:
スピン ロックによって保護された重要な領域内のコードは、ページング可能でなく、ページング可能なデータへの参照もできません。
スピン ロックによって保護された重要な領域内のコードは、ページング可能なデータにアクセスしたり、例外を発生させたりする可能性のある外部関数を呼び出したり、例外を生成したりすることもできません。
呼び出し元は、 KeReleaseSpinLock を使用してスピン ロックをできるだけ早く解放する必要があります。
スピン ロックを再帰的に取得しようとすると、デッドロックが発生することが保証されます。 スピン ロックの詳細については、「スピン ロックの 」を参照してください。
要求事項
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 普遍 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
図書館 | 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(wdm)、 SpinlockRelease(kmdf)、SpinlockRelease(kmdf)、 SpinLockRelease(storport)、SpinLockRelease(storport)、 SpinlockRelease(wdm)、 SpinLockSafe(storport)、SpinLockSafe(storport)、 SpinLockSafe(wdm) |