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