Synkronisera annullering i Higher-Level drivrutiner utan att avbryta rutiner

En drivrutin på högre nivå kan inte göra några antaganden om huruvida eller hur befintliga drivrutiner på lägre nivå hanterar avbrytbara IRP:er. Så snart en förare på högre nivå anropar IoCallDriver för en IRP äger den inte längre den IRP:n och kan varken fastställa eller kontrollera bearbetningen av IRP av drivrutiner på lägre nivå.

En drivrutin på högre nivå kan dock ange en IoCompletion- rutin för en IRP genom att anropa IoSetCompletionRoutine innan den anropar IoCallDriver. Drivrutinen på högre nivå kan avgöra om väntande IRP avbryts i en lägre drivrutin genom att anropa IoSetCompletionRoutine med parametern InvokeOnCancel som TRUE- innan den skickar IRP till lägre drivrutiner. Detta säkerställer att drivrutinens IoCompletion- rutin anropas, vare sig IRP avbryts eller slutförs.

En drivrutin på högre nivå kan anropa IoCancelIrp- med eventuella väntande IRP som drivrutinen har allokerat. Att göra det här anropet säkerställer dock inte att den drivrutinsallokerade IRP:n slutförs med dess I/O-statusblock inställt på STATUS_CANCELLED; en annan tråd kanske redan slutför IRP. För att kontrollera om IRP avbröts måste drivrutinen på högre nivå anropa IoSetCompletionRoutine med parametern InvokeOnCancel inställd på TRUE- innan IRP skickas vidare till nästa lägre drivrutin. Mer information om slutföranderutiner finns i Slutföra IRP:er.

En drivrutin på högre nivå får inte anropa IoCancelIrp med en IRP som den inte har allokerat.