IRP 취소 동기화
드라이버의 관점에서 IRP는 언제든지 취소할 수 있습니다. IRP 취소는 비동기적으로 발생합니다. 따라서 드라이버는 다음 중 하나라도 IRP가 취소될 경우 생성되는 여러 가지 잠재적인 경합 조건을 처리할 수 있어야 합니다.
드라이버 루틴이 호출된 후, IRP를 큐에 넣기 전에
드라이버 루틴이 호출된 후, 그러나 IRP를 처리하기 전에 예를 들어, 드라이버의 StartIo 루틴이 호출된 후, IRP가 취소될 수 있지만, StartIo 루틴이 디바이스 큐에서 IRP를 제거하기 전에 취소될 수 있습니다.
드라이버 루틴이 IRP를 큐에서 제거한 후, 요청된 I/O를 시작하기 전에
드라이버가 IRP를 큐에 대기하고 큐를 보호하는 스핀 잠금을 해제하면 다른 스레드가 IRP에 액세스하고 변경할 수 있습니다. 원래 스레드가 다시 시작될 때(다음 코드 줄이라도) IRP가 이미 취소되었거나 변경되었을 수 있습니다.
드라이버는 취소로부터 안전한 IRP 큐 프레임워크를 사용하여 IRP 큐를 구현할 수 있습니다. 그런 다음 시스템은 IRPs를 안전하게 취소하기 위해 동기화를 자동으로 처리하는 드라이버에 대한 취소 루틴을 등록합니다. 더 많은 정보는 Cancel-Safe IRP 큐를 참조하십시오. 그렇지 않으면 드라이버가 자체 동기화를 구현해야 합니다.
IRP의 다음 멤버에는 취소에 대한 정보가 포함되어 있습니다.
Irp->취소 IRP가 취소되고 있는지 또는 취소해야 하는지를 나타냅니다.
Irp->CancelRoutine IRP를 취소할 수 있는지 여부를 나타냅니다. 이 멤버에 취소 루틴에 대한 포인터가 포함되어 있으면 IRP를 취소할 수 있습니다. 이 멤버가 NULL 경우 IRP를 취소할 수 없습니다. 이 멤버가 NULL인 경우, 이면서 Irp->취소 이 설정된 경우, 이는 취소 루틴이 실행 중이며 IRP가 취소 과정에 있음을 나타냅니다.
드라이버가 취소 가능한 IRP를 처리하는 경우 취소 가능한 상태로 유지되는 각 IRP에서 적절한 취소 루틴을 설정해야 합니다.
이 섹션에는 IRP 취소 동기화에 대한 다음 항목이 포함되어 있습니다.