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

A rotina de PFLT_PRE_OPERATION_CALLBACK do driver de minifiltro executa o processamento de pré-operação para operações de E/S.

Sintaxe

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

Parâmetros

[in, out] Data

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

[in] FltObjects

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

[out] CompletionContext

Se essa rotina de retorno de chamada retornar FLT_PREOP_SUCCESS_WITH_CALLBACK ou FLT_PREOP_SYNCHRONIZE, esse parâmetro será um ponteiro de contexto opcional a ser passado para a rotina de retorno de chamada pós-operação correspondente. Caso contrário, ele deve ser NULL.

Valor retornado

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

Código de retorno Descrição
FLT_PREOP_COMPLETE O driver de minifiltro está concluindo a operação de E/S. O gerenciador de filtros não envia a operação de E/S para nenhum driver de minifiltro abaixo do chamador na pilha de driver ou para o sistema de arquivos. Nesse caso, o gerenciador de filtros chama apenas as rotinas de retorno de chamada pós-operação dos drivers de minifiltro acima do chamador na pilha de driver.
FLT_PREOP_DISALLOW_FASTIO A operação é uma operação de E/S rápida e o driver de minifiltro não está permitindo que o caminho de E/S rápido seja usado para essa operação. O gerenciador de filtros não envia a operação de E/S rápida para nenhum minifiltro de drivers abaixo do chamador na pilha do driver ou para o sistema de arquivos. Nesse caso, o gerenciador de filtros chama apenas as rotinas de retorno de chamada pós-operação dos drivers de minifiltro acima do chamador na pilha de driver.
FLT_PREOP_PENDING O driver de minifiltro tem a operação de E/S pendente e a operação ainda está pendente. O gerenciador de filtros não processa ainda mais a operação de E/S até que o driver de minifiltro chame FltCompletePendedPreOperation.
FLT_PREOP_SUCCESS_NO_CALLBACK O driver de minifiltro está retornando a operação de E/S para o gerenciador de filtros para processamento adicional. Nesse caso, o gerenciador de filtros não chamará o retorno de chamada pós-operação do driver de minifiltro, se houver, durante a conclusão da E/S.
FLT_PREOP_SUCCESS_WITH_CALLBACK O driver de minifiltro está retornando a operação de E/S para o gerenciador de filtros para processamento adicional. Nesse caso, o gerenciador de filtros chama o retorno de chamada pós-operação do driver de minifiltro durante a conclusão da E/S.
FLT_PREOP_SYNCHRONIZE O driver de minifiltro está retornando a operação de E/S para o gerenciador de filtros para processamento adicional, mas não está concluindo a operação. Nesse caso, o gerenciador de filtros chama o retorno de chamada pós-operação do minifiltro no contexto do thread atual em IRQL <= APC_LEVEL.
FLT_PREOP_DISALLOW_FSFILTER_IO O driver de minifiltro está não permitindo uma operação queryOpen rápida e forçando a operação pelo caminho lento. Isso faz com que o gerenciador de E/S ate a solicitação executando uma consulta/fechamento do arquivo. Os drivers de minifiltro só devem retornar esse status para QueryOpen.

Comentários

A rotina de retorno de chamada pré-operação de um minifiltro processa um ou mais tipos de operações de E/S. Essa rotina de retorno de chamada é semelhante a uma rotina de expedição no modelo de filtro herdado.

Um driver de minifiltro registra uma rotina de retorno de chamada pré-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 pré-operação para um determinado tipo de operação de E/S sem registrar uma rotina de retorno de chamada pós-operação (PFLT_POST_OPERATION_CALLBACK) e vice-versa.

Se essa rotina retornar FLT_PREOP_COMPLETE, ela deverá definir o campo IoStatus.Status da estrutura de dados de retorno de chamada como o valor final de NTSTATUS para a operação de E/S. Esse valor NTSTATUS não pode ser STATUS_PENDING. Para uma operação de limpeza ou fechamento, deve ser um valor NTSTATUS de sucesso diferente de STATUS_PENDING porque as operações de limpeza e fechamento não podem falhar.

Se essa rotina retornar FLT_PREOP_DISALLOW_FASTIO, ela não deverá definir o campo IoStatus.Status da estrutura de dados de retorno de chamada porque o gerenciador de filtros define automaticamente esse campo como STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO só pode ser retornado para uma operação de E/S rápida. Para determinar se uma determinada estrutura de dados de retorno de chamada representa uma operação de E/S rápida, use a macro FLT_IS_FASTIO_OPERATION .

FLT_PREOP_PENDING só pode ser retornado para operações de E/S baseadas em IRP porque somente operações de E/S baseadas em IRP podem ser pendentes. 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 .

Se a rotina de retorno de chamada pré-operação de um minifiltro retornar FLT_PREOP_SYNCHRONIZE, o driver de minifiltro deverá ter registrado um retorno de chamada pós-operação correspondente para a operação.

FLT_PREOP_SYNCHRONIZE só deve ser retornado para operações de E/S baseadas em IRP. Se ele for retornado para uma operação de E/S que não seja uma operação baseada em IRP, o gerenciador de filtros tratará esse valor retornado como se fosse FLT_PREOP_SUCCESS_WITH_CALLBACK.

Os drivers de minifiltro não devem retornar FLT_PREOP_SYNCHRONIZE para criar operações, pois essas operações já estão sincronizadas pelo gerenciador de filtros.

Os drivers de minifiltro nunca devem retornar FLT_PREOP_SYNCHRONIZE para operações assíncronas de leitura e gravação. Fazer isso pode degradar severamente o desempenho do driver de minifiltro e do sistema.

A rotina de retorno de chamada de pré-operação ou pós-operação de um minifiltro pode modificar o conteúdo da estrutura de dados de retorno de chamada para a operação. Se isso acontecer, ele deverá chamar FltSetCallbackDataDirty, a menos que tenha alterado o conteúdo do campo IoStatus da estrutura de dados de retorno de chamada.

O IRQL para essa rotina genérica de retorno de chamada depende de seus caminhos de E/S específicos.

Sistemas de arquivos arredondam operações de gravação e leitura no final do arquivo até um múltiplo do tamanho do setor do dispositivo de armazenamento de arquivos subjacente. Ao processar operações de pré-leitura ou pré-gravação, os filtros que alocam e trocam buffers precisam arredondar o tamanho de um buffer alocado até um múltiplo do tamanho do setor do dispositivo associado. Se não o fizerem, o comprimento dos dados transferidos do sistema de arquivos subjacente excederá o comprimento alocado do buffer. Para obter mais informações sobre a troca de buffers, consulte o Exemplo de Minifiltro SwapBuffers.

Começando com Windows 8, CompletionContext usa a anotação Flt_CompletionContext_Outptr que define valores de contexto válidos com base no resultado da operação. Veja a seguir um exemplo de uso para o retorno de chamada com a anotação de CompletionContext.

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Requisitos

   
Cliente mínimo com suporte 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 Desktop
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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr