Compartilhar via


Sincronizando o cancelamento em drivers de Higher-Level sem cancelar rotinas

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 é mais proprietário desse 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. Isso garante que a rotina IoCompletion do driver seja chamada se o IRP for cancelado ou 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 seja concluído com seu bloco de E/S status definido como STATUS_CANCELLED; outro thread pode já estar concluindo o IRP. Para marcar 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 ele não alocou.