동기화 및 스레드된 DPC
CustomThreadedDpc 루틴 내부 및 외부에서 액세스하는 메모리 위치에 대한 액세스를 동기화하기 위해 드라이버는 일반 스핀 잠금 또는 대기 중인 스핀 잠금을 사용할 수 있습니다. 이렇게 하면 CustomThreadedDpc 루틴이 두 IRQL에서 모두 실행될 수 있으므로 드라이버는 IRQL = PASSIVE_LEVEL 및 IRQL = DISPATCH_LEVEL 올바르게 동기화하기 위해 특정 규칙을 준수해야 합니다.
일반 스핀 잠금의 경우 다음 규칙이 적용됩니다.
스핀 잠금을 획득하고 해제하기 위해 드라이버는 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보다 빠르게 실행됩니다.
스핀 잠금에 대한 자세한 내용은 스핀 잠금을 참조하세요.