FltRequestOperationStatusCallback function

FltRequestOperationStatusCallback returns status information for the given I/O operation.

Syntax


NTSTATUS FltRequestOperationStatusCallback(
  _In_     PFLT_CALLBACK_DATA                 Data,
  _In_     PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
  _In_opt_ PVOID                              RequesterContext
);

Parameters

Data [in]

A pointer to the callback data (FLT_CALLBACK_DATA) structure for the I/O operation. This parameter is required and cannot be NULL.

CallbackRoutine [in]

A pointer to a callback routine that the Filter Manager calls after IoCallDriver returns. This parameter is required and cannot be NULL.

RequesterContext [in, optional]

A context pointer to be passed to the CallbackRoutine. This parameter is optional and can be NULL.

Return value

FltRequestOperationStatusCallback returns STATUS_SUCCESS or an appropriate NTSTATUS value such as one of the following:

Return codeDescription
STATUS_FLT_DELETING_OBJECT

The minifilter driver's instance is being torn down. This is an error code.

STATUS_INSUFFICIENT_RESOURCES

FltRequestOperationStatusCallback encountered a pool allocation failure. This is an error code.

STATUS_INVALID_PARAMETER

FltRequestOperationStatusCallback was called from a routine that was not a preoperation callback (PFLT_PRE_OPERATION_CALLBACK) routine, or the I/O operation was an IRP_MJ_CLOSE request. This is an error code.

 

Remarks

A minifilter driver can call FltRequestOperationStatusCallback for an IRP-based I/O operation to obtain the status value that IoCallDriver returned for the operation.

Most minifilter drivers never need to call FltRequestOperationStatusCallback. Normally, a minifilter driver only calls this routine to determine whether a requested oplock was granted.

FltRequestOperationStatusCallback can only be called from a minifilter driver's preoperation callback (PFLT_PRE_OPERATION_CALLBACK) routine.

FltRequestOperationStatusCallback can only be called for non-IRP_MJ_CLOSE IRP-based operations. To determine whether the operation is an IRP-based operation, use the FLT_IS_IRP_OPERATION macro.

If the IRP-based operation is an IRP_MJ_CLOSE request, STATUS_INVALID_PARAMETER is returned.

FltRequestOperationStatusCallback copies the contents of the I/O parameter block (FLT_IO_PARAMETER_BLOCK) to the Iopb member of the callback data (FLT_CALLBACK_DATA), and this is the callback data that the Filter Manager will pass to the routine specified in the CallbackRoutine parameter. The copied data represents a snapshot of the I/O parameter block at the time that the preoperation callback (PFLT_PRE_OPERATION_CALLBACK) routine calls FltRequestOperationStatusCallback. If the preoperation callback routine changes the I/O parameter block after calling FltRequestOperationStatusCallback, the I/O parameter block that the Filter Manager passes to CallbackRoutine will be different from the I/O parameter block that the filter driver passes down the driver stack when it calls IoCallDriver.

The following example code from a preoperation callback routine illustrates how this might happen:


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;
    ...
}

In the example, the read buffer is changed after the call to FltRequestOperationStatusCallback, so when the Filter Manager calls CallbackRoutine, it will pass in a pointer to the old buffer instead of the new one.

The Filter Manager calls the given CallbackRoutine in the context of the originating thread at IRQL <= APC_LEVEL.

Requirements

Target platform

Universal

Header

Fltkernel.h (include Fltkernel.h)

Library

Fltmgr.lib

DLL

Fltmgr.sys

IRQL

<= APC_LEVEL

See also

FLT_CALLBACK_DATA
FLT_IO_PARAMETER_BLOCK
FLT_IS_IRP_OPERATION
FLT_RELATED_OBJECTS
IoCallDriver
PFLT_PRE_OPERATION_CALLBACK
PFLT_GET_OPERATION_STATUS_CALLBACK

 

 

Send comments about this topic to Microsoft

Show: