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 |
---|---|
|
A instância do driver de minifiltro está sendo interrompida. Este é um código de erro. |
|
FltRequestOperationStatusCallback encontrou uma falha de alocação de pool. Este é um código de erro. |
|
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 |