Não permitir uma operação de E/S rápida em uma rotina de retorno de chamada de pré-operação

Em determinadas circunstâncias, um driver de minifiltro pode optar por não permitir uma operação de E/S rápida em vez de concluí-la. Não permitir uma operação de E/S rápida impede que o caminho de E/S rápido seja usado para a operação.

Como concluir uma operação de E/S, não permitir uma operação de E/S rápida significa interromper o processamento nela e devolvê-la ao gerenciador de filtros. No entanto, não permitir uma operação de E/S rápida é diferente de concluí-la. Se um driver de minifiltro não permitir uma operação de E/S rápida emitida pelo gerente de E/S, o gerente de E/S poderá reemitir a mesma operação que uma operação baseada em IRP equivalente.

Quando a rotina de retorno de chamada de pré-operação de um driver de minifiltro não permite uma operação de E/S rápida, o gerenciador de filtros faz o seguinte:

  • Não envia a operação para drivers de minifiltro abaixo do driver de minifiltro atual, para filtros herdados ou para o sistema de arquivos.

  • Chama as rotinas de retorno de chamada de postoperation dos drivers de minifiltro acima do driver de minifiltro atual na pilha de instâncias do driver de minifiltro.

  • Não chama a rotina de retorno de chamada de postoperation do driver de minifiltro atual para a operação, se houver uma.

Um driver de minifiltro não permite uma operação de E/S rápida retornando FLT_PREOP_DISALLOW_FASTIO da rotina de retorno de chamada de pré-operação para a operação.

A rotina de retorno de chamada de pré-operação não deve definir o campo IoStatus.Status da estrutura de dados de retorno de chamada, pois o gerenciador de filtros define automaticamente esse campo como STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO só pode ser retornado para operações rápidas de E/S. Para determinar se uma operação é uma operação de E/S rápida, consulte FLT_IS_FASTIO_OPERATION.

Os drivers de minifiltro não podem retornar FLT_PREOP_DISALLOW_FASTIO para operações de IRP_MJ_SHUTDOWN, IRP_MJ_VOLUME_MOUNT ou IRP_MJ_VOLUME_DISMOUNT.