Sincronización de la cancelación en controladores de Higher-Level sin rutinas de cancelación
Un controlador de nivel superior no puede realizar suposiciones sobre si los controladores de nivel inferior existentes controlan los IRP cancelables. En cuanto cualquier controlador de nivel superior llama a IoCallDriver para un IRP, ya no es propietario de ese IRP y no puede determinar ni controlar el procesamiento del IRP por controladores de nivel inferior.
Sin embargo, cualquier controlador de nivel superior puede establecer una rutina de IoCompletion para un IRP llamando a IoSetCompletionRoutine antes de llamar a IoCallDriver. El controlador de nivel superior puede determinar si cualquier IRP pendiente se cancela en un controlador inferior llamando a IoSetCompletionRoutine con el parámetro InvokeOnCancel establecido en TRUE antes de pasar el IRP a controladores inferiores. De este modo, se garantiza que se llamará a la rutina IoCompletion del controlador si el IRP se cancela o se completa.
Un controlador de nivel superior puede llamar a IoCancelIrp con cualquier IRP pendiente que el controlador haya asignado. Sin embargo, realizar esta llamada no garantiza que el IRP asignado por el controlador se complete con su bloque de estado de E/S establecido en STATUS_CANCELLED; es posible que otro subproceso ya esté completando el IRP. Para comprobar si el IRP se canceló, el controlador de nivel superior debe llamar a IoSetCompletionRoutine con el parámetro InvokeOnCancel establecido en TRUE antes de pasar irP al siguiente controlador inferior. Consulte Finalización de IRP para obtener más información sobre las rutinas de finalización.
Un controlador de nivel superior no debe llamar a IoCancelIrp con un IRP que no asignó.