취소 루틴 없이 Higher-Level 드라이버에서 취소 동기화

상위 수준 드라이버는 기존 하위 수준 드라이버가 취소 가능한 IRP를 처리하는지 여부 또는 방법에 대해 가정할 수 없습니다. 상위 수준 드라이버가 IRP에 대해 IoCallDriver 를 호출하는 즉시 더 이상 IRP를 소유하지 않으며 하위 수준 드라이버에 의한 IRP 처리를 확인하거나 제어할 수 없습니다.

그러나 상위 수준 드라이버는 IoCallDriver를 호출하기 전에 IoSetCompletionRoutine을 호출하여 IRP에 대한 IoCompletion 루틴을 설정할 수 있습니다. 상위 수준 드라이버는 하위 드라이버에 IRP를 전달하기 전에 InvokeOnCancel 매개 변수가 TRUE로 설정된 IoSetCompletionRoutine을 호출하여 하위 드라이버에서 보류 중인 IRP가 취소되는지 여부를 확인할 수 있습니다. 이렇게 하면 IRP가 취소되거나 완료되었는지 여부에 관계없이 드라이버의 IoCompletion 루틴이 호출됩니다.

상위 수준 드라이버는 드라이버가 할당한 보류 중인 IRP를 사용하여 IoCancelIrp 을 호출할 수 있습니다. 그러나 이 호출을 수행해도 드라이버 할당 IRP가 STATUS_CANCELLED 설정된 I/O 상태 블록으로 완료되지는 않습니다. 다른 스레드가 이미 IRP를 완료하고 있을 수 있습니다. IRP가 취소되었는지 여부를 검사 위해 상위 수준 드라이버는 IRP를 다음 하위 드라이버로 전달하기 전에 InvokeOnCancel 매개 변수가 TRUE로 설정된 IoSetCompletionRoutine을 호출해야 합니다. 완료 루틴에 대한 자세한 내용은 IRP 완료를 참조하세요.

상위 수준 드라이버는 할당하지 않은 IRP를 사용하여 IoCancelIrp 을 호출하면 안 됩니다.