Compartilhar via


Pendente de uma operação de E/S em uma rotina de retorno de chamada postoperation

A rotina de retorno de chamada do postoperation de um driver de minifiltro pode pendente de uma operação de E/S executando as seguintes etapas:

  1. Chamar FltAllocateDeferredIoWorkItem para alocar um item de trabalho para a operação de E/S.

  2. Chamar FltQueueDeferredIoWorkItem para postar a operação de E/S em uma fila de trabalho do sistema.

  3. Retornando FLT_POSTOP_MORE_PROCESSING_REQUIRED.

Observe que a chamada para FltQueueDeferredIoWorkItem falhará se qualquer uma das seguintes condições for verdadeira:

  • A operação não é uma operação de E/S baseada em IRP.

  • A operação é uma operação de E/S de paginação.

  • O campo TopLevelIrp do thread atual não é NULL. (Para obter mais informações sobre como localizar o valor desse campo, consulte IoGetTopLevelIrp.)

  • A instância de destino para a operação de E/S está sendo interrompida. (O gerenciador de filtros indica essa situação definindo o sinalizador FLTFL_POST_OPERATION_DRAINING no parâmetro de entrada Flags para a rotina de retorno de chamada postoperation.)

Os drivers de minifiltro devem estar preparados para lidar com essa falha. Se o driver de minifiltro não puder lidar com essas falhas, considere usar a técnica descrita em Retornando FLT_PREOP_SYNCHRONIZE em vez de aguardar a operação de E/S.

Depois que a rotina de retorno de chamada postoperation do driver de minifiltro retornar FLT_POSTOP_MORE_PROCESSING_REQUIRED, o gerenciador de filtros não executará nenhum processamento de conclusão adicional para a operação de E/S até que a rotina de trabalho do driver de minifiltro chame FltCompletePendedPostOperation para retornar o controle da operação para o gerenciador de filtros. O gerenciador de filtros não executará nenhum processamento adicional nessa situação, mesmo que a rotina de trabalho defina um valor NTSTATUS de falha no campo IoStatus.Status da estrutura de dados de retorno de chamada para a operação.

A rotina de trabalho que desativa e executa o processamento de conclusão para a operação de E/S deve chamar FltCompletePendedPostOperation para retornar o controle da operação para o gerenciador de filtros.