Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Um driver de nível superior não pode fazer suposições sobre se ou como os drivers de nível inferior existentes lidam com IRPs canceláveis. Assim que qualquer driver de nível superior chama IoCallDriver para um IRP, ele não possui mais esse IRP e não pode verificar nem controlar o processamento do IRP por drivers de nível inferior.
No entanto, qualquer driver de nível superior pode definir uma rotina IoCompletion para um IRP chamando IoSetCompletionRoutine antes de chamar IoCallDriver. O driver de nível superior pode determinar se qualquer IRP pendente é cancelado em um driver inferior chamando IoSetCompletionRoutine com o parâmetro InvokeOnCancel definido como TRUE antes de passar o IRP para drivers inferiores. Tal ação garante que a rotina IoCompletion do controlador será chamada, quer o IRP seja cancelado, quer concluído.
Um driver de nível superior pode chamar IoCancelIrp com qualquer IRP pendente que o driver tenha alocado. No entanto, fazer essa chamada não garante que o IRP alocado pelo driver será concluído com seu bloco de status de E/S definido como STATUS_CANCELLED; outro thread já pode estar completando o IRP. Para verificar se o IRP foi cancelado, o driver de nível superior deve chamar IoSetCompletionRoutine com o parâmetro InvokeOnCancel definido como TRUE antes de passar o IRP para o próximo driver inferior. Consulte Concluindo IRPs para obter mais informações sobre rotinas de conclusão.
Um driver de nível superior não deve chamar IoCancelIrp com um IRP que não alocou.