Função FltRequestOperationStatusCallback (fltkernel.h)
FltRequestOperationStatusCallback retorna informações de status 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 IoCallDriver retorna. Esse parâmetro é necessário e não pode ser NULL.
[in, optional] RequesterContext
Um ponteiro de contexto a ser passado para o CallbackRoutine . Esse parâmetro é opcional e pode ser NULL.
Valor de retorno
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 demolida. 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 IRP_MJ_CLOSE. Este é um código de erro. |
Observações
Um driver de minifiltro pode chamar FltRequestOperationStatusCallback para uma operação de E/S baseada em IRP para obter o valor de status que do IoCallDriver retornado 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 minifiltro driver.
FltRequestOperationStatusCallback só pode ser chamado para operações baseadas em IRP não IRP_MJ_CLOSE. Para determinar se a operação é uma 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 Filtros passa para callbackRoutine será diferente do bloco de parâmetros de E/S que o driver de filtro passa para baixo na pilha de 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 o CallbackRoutine fornecido no contexto do thread de origem em IRQL <= APC_LEVEL.
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino | Universal |
cabeçalho | fltkernel.h (inclua Fltkernel.h) |
biblioteca | Fltmgr.lib |
de DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |