다음을 통해 공유


스핀 잠금을 사용하는 호출 지원 루틴

KeAcquireSpinLock 또는 KeAcquireInStackQueuedSpinLock을 호출하면 KeReleaseSpinLock 또는 KeReleaseInStackQueuedSpinLock에 대한 해당 호출이 이전 IRQL을 복원할 때까지 현재 프로세서의 IRQL이 DISPATCH_LEVEL 설정됩니다. 따라서 드라이버는 KeAcquireSpinLock 또는 KeAcquireInStackQueuedSpinLock을 호출할 때 IRQL <= DISPATCH_LEVEL 실행해야 합니다.

KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevelKeReleaseSpinLockFromDpcLevel의 호출자는 이미 IRQL = DISPATCH_LEVEL 실행 중이므로 이러한 지원 루틴은 현재 프로세서에서 IRQL을 재설정할 필요가 없으므로 더 빠르게 실행됩니다. 따라서 IRQL에서 DISPATCH_LEVEL 미만을 실행하는 동안 KeAcquireSpinLockAtDpcLevel 또는 KeAcquireInStackQueuedSpinLockAtDpcLevel 을 호출하는 것은 대부분의 Windows 플랫폼에서 치명적인 오류입니다. 호출자의 원래 IRQL이 복원되지 않았기 때문에 KeReleaseSpinLockFromDpcLevel을 호출하여 KeAcquireSpinLock으로 획득한 스핀 잠금을 해제하는 것도 오류입니다.

ExInterlockedXxx와 같은 임원 스핀 잠금을 보유하는 루틴은 일반적으로 스핀 잠금을 해제하고 호출자에게 컨트롤을 반환할 때까지 IRQL = DISPATCH_LEVEL 실행됩니다. 그러나 드라이버의 InterruptService 루틴 및 SynchCritSection 루틴(DIRQL에서 실행됨)은 ISR 및 SynchCritSection 루틴에서만 사용되는 한 ExInterlockedXxx 목록 루틴과 같은 특정 ExInterlockedXxx 루틴을 호출할 수 있습니다.

인터럽트 스핀 잠금을 보유하는 각 루틴은 연결된 인터럽트 개체 집합의 DIRQL에서 실행됩니다. 따라서 드라이버는 KeAcquireSpinLockKeReleaseSpinLock 또는 ISR 또는 SynchCritSection 루틴에서 임원 스핀 잠금을 사용하는 다른 루틴을 호출해서는 안 됩니다. 이러한 호출은 시스템 교착 상태를 일으킬 수 있는 오류로, 사용자가 컴퓨터를 다시 부팅해야 합니다. 드라이버의 ISR 또는 SynchCritSection 루틴이 ExInterlockedXxxList 루틴을 호출하는 경우 드라이버는 Ke Xxx SpinLock 또는 KeXxxSpinLock Xxx DpcLevel 지원 루틴에 대한 호출에서 ExInterlocked Xxx 목록 루틴에 전달하는 스핀 잠금을 다시 사용할 수 없습니다.

드라이버에 다중 벡터 ISR 또는 둘 이상의 ISR이 있는 경우 해당 루틴은 연결된 인터럽트 개체에 대해 지정된 SynchronizeIrql 값까지 IRQL에서 실행하는 동안 KeSynchronizeExecution을 호출할 수 있습니다.