시스템의 스핀 잠금 취소 사용

시스템은 특정 시스템 루틴이 호출될 때 획득되거나 해제되는 단일 취소 스핀 잠금을 제공합니다.

STATUS_CANCELLED IRP를 완료할 수 있는 모든 루틴을 포함하여 취소 가능한 IRP의 상태를 변경하는 드라이버 루틴은 이 섹션의 지침에 따라 시스템 취소 스핀 잠금을 획득하고 해제해야 합니다.

I/O 관리자 제공 디바이스 큐를 사용하는 드라이버에서 IRP의 취소 가능 상태를 변경하는 Cancel 루틴 이외의 드라이버 루틴은 먼저 IoAcquireCancelSpinLock 을 호출하여 시스템 취소 스핀 잠금을 획득해야 합니다.

취소 스핀 잠금을 획득하면 호출자만 해당 IRP의 취소 가능한 상태를 변경할 수 있습니다. 호출자가 스핀 잠금을 보유하는 동안 I/O 관리자는 해당 IRP에 대한 드라이버의 취소 루틴을 호출할 수 없습니다. 마찬가지로 DispatchCleanup 루틴과 같은 다른 드라이버 루틴은 해당 IRP의 취소 가능한 상태를 동시에 변경할 수 없습니다.

자체 IRP 큐를 관리하고 드라이버 제공 스핀 잠금을 사용하여 큐 액세스를 동기화하는 드라이버에서 드라이버 루틴은 IoSetCancelRoutine을 호출하기 전에 취소 스핀 잠금을 획득할 필요가 없습니다. 그러나 이러한 드라이버는 IoSetCancelRoutine이 반환하는 취소 루틴 포인터를 검사 취소 루틴이 이미 시작되었는지 여부를 결정해야 합니다. 자세한 내용은 Driver-Supplied 스핀 잠금 사용을 참조하세요.

IoAcquireCancelSpinLock을 호출하는 모든 드라이버 루틴은 가능한 한 빨리 IoReleaseCancelSpinLock을 호출해야 합니다.

드라이버는 스핀 잠금을 유지하면서 IRP를 사용하여 IoCompleteRequest 를 호출해서는 안 됩니다. 스핀 잠금을 유지하는 동안 IRP를 완료하려고 하면 교착 상태가 발생할 수 있습니다.