次の方法で共有


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)

こちらもご覧ください

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock