次の方法で共有


KeAcquireInStackQueuedSpinLockAtDpcLevel 関数 (wdm.h)

呼び出し元が IRQL >= DISPATCH_LEVELで既に実行されている場合、KeAcquireInStackQueuedSpinLockAtDpcLevel ルーチンはキューに入ったスピン ロックを取得します。

構文

void KeAcquireInStackQueuedSpinLockAtDpcLevel(
  PKSPIN_LOCK         SpinLock,
  PKLOCK_QUEUE_HANDLE LockHandle
);

パラメーター

SpinLock

[入力、出力]取得するスピン ロックを指定します。 このパラメーターは、 KeInitializeSpinLock ルーチンの呼び出しによって初期化されている必要があります。

LockHandle

[out]呼び出し元が指定した KLOCK_QUEUE_HANDLE 構造体へのポインター。この構造体を使用して、スピン ロック キュー ハンドルを返すことができます。 ロックを解除するために、呼び出し元はこの値を KeReleaseInStackQueuedSpinLockFromDpcLevel ルーチンに 渡します。

戻り値

なし

解説

IRQL >= DISPATCH_LEVELで実行されているドライバーの場合、 KeAcquireInStackQueuedSpinLockAtDpcLevel、キューに入ったスピン ロックとしてスピン ロックを取得します。 詳細については、「 キューに入ったスピン ロック」を参照してください。 スピン ロックを解放するには、 KeReleaseInStackQueuedSpinLockFromDpcLevel ルーチンを 呼び出します。

IRQL >= DISPATCH_LEVEL で既に実行されているドライバーは、このルーチンを呼び出して、キューに入ったスピン ロックをより迅速に取得できます。 それ以外の場合は、 KeAcquireInStackQueuedSpinLock ルーチンを使用してスピン ロックを取得します。

IRQL > DISPATCH_LEVELで実行されているドライバーの場合、このルーチンは現在の IRQL を変更せずにロックを取得します。 IRQL = DISPATCH_LEVELで実行されているドライバーの場合、このルーチンは、最初に IRQL をDISPATCH_LEVELに設定せずにロックを取得することでパフォーマンスを向上させます。この場合は冗長操作になります。

通常のスピン ロックと同様に、キューに置かれたスピン ロックは、非常に特殊な状況でのみ使用する必要があります。 スピン ロックを使用するタイミングの詳細については、「 KeAcquireSpinLock」を参照してください。

ドライバーは、同じスピン ロックで KeAcquireSpinLockKeAcquireInStackQueuedSpinLock の呼び出しを組み合わせてはなりません。 スピン ロックは、キューに登録されたスピン ロックまたは通常のスピン ロックとして、常に取得または解放する必要があります。

要件

要件
サポートされている最小のクライアント Windows XP
Header wdm.h
IRQL IRQL >= DISPATCH_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

KLOCK_QUEUE_HANDLE

KeAcquireSpinLock

KeAcquireInStackQueuedSpinLock

KeInitializeSpinLock

KeReleaseInStackQueuedSpinLockFromDpcLevel