スピン ロックを使用するサポート ルーチンの呼び出し
KeAcquireSpinLock または KeAcquireInStackQueuedSpinLock を呼び出すと、 KeReleaseSpinLock または KeReleaseInStackQueuedSpinLock への対応する呼び出しが以前の IRQL を復元するまで、現在のプロセッサの IRQL がDISPATCH_LEVELに設定されます。 そのため、ドライバーは、KeAcquireSpinLock または KeAcquireInStackQueuedSpinLock を<呼び出すときに、IRQL = DISPATCH_LEVELで実行されている必要があります。
KeAcquireSpinLockAtDpcLevel、KeAcquireInStackQueuedSpinLockAtDpcLevel、KeReleaseInStackQueuedSpinLockFromDpcLevel、および KeReleaseSpinLockFromDpcLevel の呼び出し元は、IRQL = DISPATCH_LEVEL で既に実行されているため、現在のプロセッサで IRQL をリセットする必要はありません。 そのため、IRQL で実行している間に KeAcquireSpinLockAtDpcLevel または KeAcquireInStackQueuedSpinLockAtDpcLevel を呼び出すと、ほとんどの Windows プラットフォームで致命的なエラー DISPATCH_LEVEL。 また、呼び出し元の元の IRQL が復元されないため、KeReleaseSpinLockFromDpcLevel を呼び出して KeAcquireSpinLock で取得されたスピン ロックを解放するエラーでもあります。
ExInterlockedXxx などのエグゼクティブ スピン ロックを保持するルーチンは、通常、IRQL = DISPATCH_LEVEL で実行され、スピン ロックを解放して呼び出し元に制御を返します。ただし、ドライバーの InterruptService ルーチンと SynchCritSection ルーチン (DIRQL で実行) は、ルーチンに渡されるスピン ロックが ISR および SynchCritSection ルーチンによって排他的に使用されている限り、ExInterlockedXxxリスト ルーチンなどの特定の ExInterlockedXxx ルーチンを呼び出すことができます。
割り込みスピン ロックを保持する各ルーチンは、割り込みオブジェクトの関連付けられたセットの DIRQL で実行されます。 そのため、ドライバーは、KeAcquireSpinLock と KeReleaseSpinLock を呼び出したり、ISR または SynchCritSection ルーチンからエグゼクティブ スピン ロックを使用する他のルーチンを呼び出したりしてはなりません。 このような呼び出しは、システムのデッドロックを引き起こす可能性があるエラーであり、ユーザーは自分のコンピューターを再起動する必要があります。 ドライバーの ISR または SynchCritSection ルーチンが ExInterlockedXxxList ルーチンを呼び出す場合、ドライバーは、KeXxxSpinLock または KeXxxSpinLockXxxDpcLevel サポート ルーチンの呼び出しで ExInterlockedXxxリスト ルーチンに渡すスピン ロックを再利用できないことに注意してください。
ドライバーにマルチベクトル ISR または複数の ISR がある場合、そのルーチンは、接続されたときに関連付けられている割り込みオブジェクトに指定された SynchronizeIrql 値まで、任意の IRQL で実行中に KeSynchronizeExecution を呼び出すことができます。