Синхронизация процесса отмены в драйверах Higher-Level без использования подпрограмм отмены
Драйвер верхнего уровня не может делать никаких предположений о том, обрабатываются ли отменяемые IRPs существующими драйверами нижнего уровня. Как только любой драйвер более высокого уровня вызывает IoCallDriver для IRP, он больше не владеет IRP и не может ни определить, ни контролировать обработку IRP драйверами нижнего уровня.
Однако любой драйвер более высокого уровня может задать подпрограмму IoCompletion для IRP путем вызова IoSetCompletionRoutine перед вызовом IoCallDriver. Драйвер более высокого уровня может определить, отменен ли какой-либо ожидающий IRP в более низком драйвере, вызвав IoSetCompletionRoutine, установив параметр InvokeOnCancel в значение TRUE, до его передачи в более низкие драйверы. Это гарантирует, что подпрограмма IoCompletion драйвера будет вызвана независимо от того, отменен или завершен IRP.
Драйвер более высокого уровня может вызвать IoCancelIrp для любого ожидающего IRP, который был выделен этим драйвером. Однако выполнение этого вызова не гарантирует, что выделенный драйвером IRP будет завершен с его блоком состояния ввода-вывода, равным STATUS_CANCELLED; другой поток может уже завершить IRP. Чтобы проверить, был ли отменен IRP, драйвер более высокого уровня должен вызвать IoSetCompletionRoutine с параметром InvokeOnCancel, установленным в значение TRUE, прежде чем передавать IRP следующему нижнему драйверу. Дополнительные сведения о процедурах завершения см. в разделе Completing IRPs.
Драйвер более высокого уровня не должен вызывать IoCancelIrp с IRP, который он не выделил.