Compartilhar via


Função FltRequestOperationStatusCallback (fltkernel.h)

FltRequestOperationStatusCallback retorna status informações para a operação de E/S fornecida.

Sintaxe

NTSTATUS FLTAPI FltRequestOperationStatusCallback(
  [in]           PFLT_CALLBACK_DATA                 Data,
  [in]           PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
  [in, optional] PVOID                              RequesterContext
);

Parâmetros

[in] Data

Um ponteiro para a estrutura de dados de retorno de chamada (FLT_CALLBACK_DATA) para a operação de E/S. Esse parâmetro é necessário e não pode ser NULL.

[in] CallbackRoutine

Um ponteiro para uma rotina de retorno de chamada que o Gerenciador de Filtros chama após o retorno de IoCallDriver . Esse parâmetro é necessário e não pode ser NULL.

[in, optional] RequesterContext

Um ponteiro de contexto a ser passado para a CallbackRoutine. Esse parâmetro é opcional e pode ser NULL.

Retornar valor

FltRequestOperationStatusCallback retorna STATUS_SUCCESS ou um valor NTSTATUS apropriado, como um dos seguintes:

Código de retorno Descrição
STATUS_FLT_DELETING_OBJECT
A instância do driver de minifiltro está sendo interrompida. Este é um código de erro.
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback encontrou uma falha de alocação de pool. Este é um código de erro.
STATUS_INVALID_PARAMETER
FltRequestOperationStatusCallback foi chamado de uma rotina que não era uma rotina de retorno de chamada de pré-operação (PFLT_PRE_OPERATION_CALLBACK) ou a operação de E/S era uma solicitação de IRP_MJ_CLOSE. Este é um código de erro.

Comentários

Um driver de minifiltro pode chamar FltRequestOperationStatusCallback para uma operação de E/S baseada em IRP para obter o valor de status que IoCallDriver retornou para a operação.

A maioria dos drivers de minifiltro nunca precisa chamar FltRequestOperationStatusCallback. Normalmente, um driver de minifiltro só chama essa rotina para determinar se um oplock solicitado foi concedido.

FltRequestOperationStatusCallback só pode ser chamado da rotina de retorno de chamada de pré-operação (PFLT_PRE_OPERATION_CALLBACK) de um driver de minifiltro.

FltRequestOperationStatusCallback só pode ser chamado para operações não baseadas em IRP IRP_MJ_CLOSE. Para determinar se a operação é baseada em IRP, use a macro FLT_IS_IRP_OPERATION .

Se a operação baseada em IRP for uma solicitação IRP_MJ_CLOSE, STATUS_INVALID_PARAMETER será retornado.

FltRequestOperationStatusCallback copia o conteúdo do bloco de parâmetros de E/S (FLT_IO_PARAMETER_BLOCK) para o membro Iopb dos dados de retorno de chamada (FLT_CALLBACK_DATA), e esses são os dados de retorno de chamada que o Gerenciador de Filtros passará para a rotina especificada no parâmetro CallbackRoutine . Os dados copiados representam um instantâneo do bloco de parâmetros de E/S no momento em que a rotina de retorno de chamada de pré-operação (PFLT_PRE_OPERATION_CALLBACK) chama FltRequestOperationStatusCallback. Se a rotina de retorno de chamada de pré-operação alterar o bloco de parâmetros de E/S depois de chamar FltRequestOperationStatusCallback, o bloco de parâmetros de E/S que o Gerenciador de Filtro passa para CallbackRoutine será diferente do bloco de parâmetros de E/S que o driver de filtro passa para baixo na pilha do driver quando chama IoCallDriver.

O código de exemplo a seguir de uma rotina de retorno de chamada de pré-operação ilustra como isso pode acontecer:

PFLT_CALLBACK_DATA Data;
PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine;
PVOID RequesterContext;
...
if (iopb->MajorFunction == IRP_MJ_READ) {
    FltRequestOperationStatusCallback (Data, CallbackRoutine, RequesterContext);
 Data->Iopb->Parameters.Read.ReadBuffer = newBuffer;
    ...
}

No exemplo, o buffer de leitura é alterado após a chamada para FltRequestOperationStatusCallback, portanto, quando o Gerenciador de Filtros chama CallbackRoutine, ele passa um ponteiro para o buffer antigo em vez do novo.

O Gerenciador de Filtros chama a CallbackRoutine fornecida no contexto do thread de origem em IRQL <= APC_LEVEL.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho fltkernel.h (inclua Fltkernel.h)
Biblioteca Fltmgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Confira também

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

IoCallDriver

PFLT_GET_OPERATION_STATUS_CALLBACK

PFLT_PRE_OPERATION_CALLBACK