Compartilhar via


função de retorno de chamada PFLT_POST_OPERATION_CALLBACK (fltkernel.h)

Um driver de minifiltro pode registrar uma ou mais rotinas do tipo PFLT_POST_OPERATION_CALLBACK para executar o processamento de conclusão para operações de E/S.

Sintaxe

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

Parâmetros

[in, out] Data

Um ponteiro para os dados de retorno de chamada FLT_CALLBACK_DATA estrutura para a operação de E/S.

[in] FltObjects

Um ponteiro para um gerenciador de filtros mantido FLT_RELATED_OBJECTS estrutura que contém ponteiros opacos para os objetos relacionados à solicitação de E/S atual.

[in, optional] CompletionContext

Um ponteiro de contexto que foi retornado pelo retorno de chamada pré-operação do driver de minifiltro PFLT_PRE_OPERATION_CALLBACK rotina. O ponteiro CompletionContext fornece uma maneira de comunicar informações da rotina de retorno de chamada pré-operação para a rotina de retorno de chamada pós-operação.

[in] Flags

Uma máscara de bits de sinalizadores que especifica como o retorno de chamada pós-operação deve ser executado.

Sinalizador Significado
FLTFL_POST_OPERATION_DRAINING O gerenciador de filtros define esse sinalizador para indicar que a instância do driver de minifiltro está sendo desanexada e que essa rotina de retorno de chamada pós-operação está sendo chamada para limpo o contexto de conclusão do driver de minifiltro. O retorno de chamada pós-operação deve retornar FLT_POSTOP_FINISHED_PROCESSING. Se esse sinalizador for definido, o parâmetro Data apontará para uma cópia da estrutura de dados de retorno de chamada original para a operação, não a estrutura de dados de retorno de chamada original. Além disso, quando esse sinalizador é definido, a rotina de retorno de chamada pós-operação é chamada em IRQL <= APC_LEVEL.

Retornar valor

Essa rotina de retorno de chamada retorna um dos seguintes valores de status:

Código de retorno Descrição
FLT_POSTOP_FINISHED_PROCESSING
O driver de minifiltro concluiu o processamento de conclusão para a operação de E/S e está retornando o controle da operação para o gerenciador de filtros.

Depois que o retorno de chamada pós-operação retorna esse valor status, o gerenciador de filtros continua o processamento de conclusão da operação de E/S.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
O driver de minifiltro interrompeu o processamento de conclusão para a operação de E/S, mas não está retornando o controle da operação para o gerenciador de filtros.

O retorno de chamada pós-operação de um driver de minifiltro pode retornar esse valor status somente se o retorno de chamada pós-operação do driver de minifiltro tiver postado a operação de E/S em uma fila de trabalho. O driver de minifiltro deve, eventualmente, retomar o processamento de conclusão da operação de E/S.

Depois que o retorno de chamada pós-operação retornar FLT_POSTOP_MORE_PROCESSING_REQUIRED, o gerenciador de filtros não executará nenhum processamento de conclusão adicional da operação de E/S, a menos que ambas as seguintes condições sejam verdadeiras:

  • O retorno de chamada pós-operação postou a operação de E/S em uma fila de trabalho.
  • Depois que a rotina de trabalho executa o processamento de conclusão da operação, ela chama FltCompletePendedPostOperation para retornar o controle da operação para o gerenciador de filtros.
Esse valor status só pode ser retornado para operações de E/S baseadas em IRP. Para determinar se uma determinada estrutura de dados de retorno de chamada representa uma operação de E/S baseada em IRP, use a macro FLT_IS_IRP_OPERATION .
FLT_POSTOP_DISALLOW_FSFILTER_IO
O driver de minifiltro não está permitindo uma operação queryOpen rápida e forçando a operação pelo caminho lento. Isso faz com que o gerente de E/S ate a solicitação executando uma consulta/fechamento/abertura do arquivo. Os drivers de minifiltro só devem retornar esse status para QueryOpen.

Comentários

A rotina de retorno de chamada pós-operação de um driver de minifiltro executa o processamento de conclusão para um ou mais tipos de operações de E/S.

As rotinas de retorno de chamada pós-operação são semelhantes às rotinas de conclusão usadas pelos drivers de filtro do sistema de arquivos herdados.

Rotinas de retorno de chamada pós-operação são chamadas em um contexto de thread arbitrário, em IRQL <= DISPATCH_LEVEL. Como essa rotina de retorno de chamada pode ser chamada no IRQL DISPATCH_LEVEL, ela está sujeita às seguintes restrições:

  • Ele não pode chamar com segurança qualquer rotina de modo kernel que deve ser executada em um IRQL inferior.
  • Todas as estruturas de dados usadas nessa rotina devem ser alocadas do pool nãopagado.
  • Ela não pode ser tornada paginável.
  • Ele não pode adquirir recursos, mutexes ou mutexes rápidos. No entanto, ele pode adquirir bloqueios de rotação.
  • Ele não pode obter, definir ou excluir contextos, mas pode liberar contextos.

Qualquer processamento de conclusão de E/S que precise ser executado no IRQL < DISPATCH_LEVEL não pode ser executado diretamente na rotina de retorno de chamada de postoperation. Em vez disso, ele deve ser postado em uma fila de trabalho chamando uma rotina como FltDoCompletionProcessingWhenSafe ou FltQueueDeferredIoWorkItem.

Lembre-se de que FltDoCompletionProcessingWhenSafe nunca deve ser chamado se o parâmetro Flags do retorno de chamada pós-operação tiver o FLTFL_POST_OPERATION_DRAINING bit definido. Veja a seguir exceções a esta regra:

  • Se a rotina de retorno de chamada pré-operação de um driver de minifiltro retornar FLT_PREOP_SYNCHRONIZE para uma operação de E/S baseada em IRP, a rotina de retorno de chamada pós-operação correspondente será chamada em IRQL <= APC_LEVEL, no mesmo contexto de thread que o retorno de chamada pré-operação.
  • As rotinas de retorno de chamada pós-criação têm a garantia de serem chamadas no IRQL PASSIVE_LEVEL, no contexto do thread que originou a operação de IRP_MJ_CREATE.

Um driver de minifiltro registra uma rotina de retorno de chamada pós-operação para um tipo específico de operação de E/S armazenando o ponto de entrada da rotina de retorno de chamada na matriz OperationRegistration da estrutura FLT_REGISTRATION . O driver de minifiltro passa essa estrutura como um parâmetro para FltRegisterFilter em sua rotina DriverEntry .

Um driver de minifiltro pode registrar uma rotina de retorno de chamada pós-operação para um tipo específico de operação de E/S sem registrar uma rotina de retorno de chamada pré-operação (PFLT_PRE_OPERATION_CALLBACK) e vice-versa.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível no Pacote Cumulativo de Atualizações do Microsoft Windows 2000 1 para SP4, Windows XP SP2, Windows Server 2003 SP1 e sistemas operacionais Windows posteriores.
Plataforma de Destino Área de Trabalho
Cabeçalho fltkernel.h (inclua FltKernel.h)
IRQL Consulte a seção Comentários

Confira também

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK