同期とスレッド DPC
CustomThreadedDpc ルーチンの内部と外部の両方からアクセスされるメモリ位置へのアクセスを同期するために、ドライバーは通常のスピン ロックまたはキューに入っているスピン ロックを使用できます。 この場合、ドライバーは IRQL = PASSIVE_LEVEL および IRQL = DISPATCH_LEVEL で正しく同期するために、特定の規則に従う必要があります。CustomThreadedDpc ルーチンは両方の IRQL で実行できるためです。
通常のスピン ロックの場合は、次の規則が適用されます。
スピン ロックを取得して解放するために、ドライバーは CustomThreadedDpc ルーチンの内側と外側の両方から KeAcquireSpinLock と KeReleaseSpinLock を呼び出すことができます。
ドライバーは、CustomThreadedDpc ルーチン内から KeAcquireSpinLockForDpc と KeReleaseSpinLockForDpc を呼び出すことができます。 CustomThreadedDpc ルーチンは、IRQL = DISPATCH_LEVELでのみ安全に呼び出すことができるため、KeAcquireSpinLockAtDpcLevel または KeReleaseSpinLockFromDpcLevel を呼び出すことはできません。
キューに入ったスピン ロックの規則は次に似ています。
スピン ロックを取得して解放するために、ドライバーは CustomThreadedDpc ルーチンの内側と外側の両方から KeAcquireInStackQueuedSpinLock と KeReleaseInStackQueuedSpinLock を呼び出すことができます。
ドライバーは、CustomThreadedDpc ルーチン内から KeAcquireInStackQueuedSpinLockForDpc と KeReleaseInStackQueuedSpinLockForDpc を呼び出すことができます。 CustomThreadedDpc ルーチンは、IRQL = DISPATCH_LEVEL でのみ安全に呼び出すことができるため、KeAcquireInStackQueuedSpinLockAtDpcLevel または KeReleaseInStackQueuedSpinLockFromDpcLevel を呼び出すことはできません。
KeAcquireSpinLockForDpc と KeAcquireInStackQueuedSpinLockForDpc は、DISPATCH_LEVEL で呼び出されたときに IRQL をリセットしないため、それぞれ KeAcquireSpinLock と KeAcquireInStackQueuedSpinLock よりも高速に実行されます。
ロックの詳細については、「スピンロック」を参照してください。