Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.