Partilhar via


Concluindo uma operação de E/S em uma rotina de retorno de chamada de pré-operação

Para concluir uma operação de E/S significa interromper o processamento da operação, atribua a ela um valor final NTSTATUS e retorne-o ao gerenciador de filtros.

Quando um driver de minifiltro conclui uma operação de E/S, 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.

A rotina de retorno de chamada de pré-operação de um driver de minifiltro conclui uma operação de E/S executando as seguintes etapas:

  1. Definindo o campo IoStatus.Status da estrutura de dados de retorno de chamada como o valor final NTSTATUS da operação.

  2. Retornando FLT_PREOP_COMPLETE.

Uma rotina de retorno de chamada de pré-operação que conclui uma operação de E/S não pode definir um contexto de conclusão não NULL (no parâmetro de saída CompletionContext ).

Um driver de minifiltro também pode concluir uma operação na rotina de trabalho para uma operação de E/S pendente anteriormente executando as seguintes etapas:

  1. Definindo o campo IoStatus.Status da estrutura de dados de retorno de chamada como o valor final NTSTATUS da operação.

  2. Passando FLT_PREOP_COMPLETE no parâmetro CallbackStatus quando a rotina de trabalho chama FltCompletePendedPreOperation.

Ao concluir uma operação de E/S, um driver de minifiltro deve definir o campo IoStatus.Status da estrutura de dados de retorno de chamada como o valor final NTSTATUS da operação, mas esse valor NTSTATUS não pode ser STATUS_PENDING ou STATUS_FLT_DISALLOW_FAST_IO. Para uma operação de limpeza ou fechamento, o campo deve ser STATUS_SUCCESS. Essas operações não podem ser concluídas com nenhum outro valor NTSTATUS.

Concluir uma operação de E/S geralmente é chamado de êxito ou falha na operação, dependendo do valor NTSTATUS:

  • Ter êxito em uma operação de E/S significa concluí-la com um valor NTSTATUS de êxito ou informativo, como STATUS_SUCCESS.

  • Falhar em uma operação de E/S significa concluí-la com um valor NTSTATUS de erro ou aviso, como STATUS_INVALID_DEVICE_REQUEST ou STATUS_BUFFER_OVERFLOW.

Os valores NTSTATUS são definidos em ntstatus.h. Esses valores se enquadram em quatro categorias: êxito, informativo, aviso e erro. Para obter mais informações sobre esses valores, consulte Usando valores NTSTATUS.