Partager via


FltRequestOperationStatusCallback, fonction (fltkernel.h)

FltRequestOperationStatusCallback retourne des informations d’état pour l’opération d’E/S donnée.

Syntaxe

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

Paramètres

[in] Data

Pointeur vers la structure des données de rappel (FLT_CALLBACK_DATA) pour l’opération d’E/S. Ce paramètre est obligatoire et ne peut pas être NULL.

[in] CallbackRoutine

Pointeur vers une routine de rappel que le Gestionnaire de filtre appelle après IoCallDriver. Ce paramètre est obligatoire et ne peut pas être NULL.

[in, optional] RequesterContext

Pointeur de contexte à passer au CallbackRoutine. Ce paramètre est facultatif et peut être NULL.

Valeur de retour

FltRequestOperationStatusCallback retourne STATUS_SUCCESS ou une valeur NTSTATUS appropriée, comme l’une des valeurs suivantes :

Retourner le code Description
STATUS_FLT_DELETING_OBJECT
L’instance du pilote minifilter est détruite. Il s’agit d’un code d’erreur.
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback a rencontré un échec d’allocation de pool. Il s’agit d’un code d’erreur.
STATUS_INVALID_PARAMETER
FltRequestOperationStatusCallback a été appelé à partir d’une routine qui n’était pas une routine de rappel de préopération (PFLT_PRE_OPERATION_CALLBACK) ou l’opération d’E/S était une requête IRP_MJ_CLOSE. Il s’agit d’un code d’erreur.

Remarques

Un pilote minifilter peut appeler FltRequestOperationStatusCallback pour une opération d’E/S basée sur IRP pour obtenir la valeur d’état qui IoCallDriver retourné pour l’opération.

La plupart des pilotes minifilter n’ont jamais besoin d’appeler FltRequestOperationStatusCallback. Normalement, un pilote minifilter appelle uniquement cette routine pour déterminer si un oplock demandé a été accordé.

FltRequestOperationStatusCallback ne peut être appelé qu’à partir d’une routine de rappel de préopération (PFLT_PRE_OPERATION_CALLBACK) d’un pilote minifilter.

FltRequestOperationStatusCallback ne peut être appelé que pour des opérations non IRP_MJ_CLOSE basées sur IRP. Pour déterminer si l’opération est une opération basée sur IRP, utilisez la macro FLT_IS_IRP_OPERATION.

Si l’opération basée sur IRP est une demande de IRP_MJ_CLOSE, STATUS_INVALID_PARAMETER est retournée.

FltRequestOperationStatusCallback copie le contenu du bloc de paramètres d’E/S (FLT_IO_PARAMETER_BLOCK) au membre Iopb des données de rappel (FLT_CALLBACK_DATA), et il s’agit des données de rappel que le Gestionnaire de filtres transmet à la routine spécifiée dans le paramètre CallbackRoutine. Les données copiées représentent un instantané du bloc de paramètres d’E/S au moment où la routine de rappel de préopération (PFLT_PRE_OPERATION_CALLBACK) appelle FltRequestOperationStatusCallback. Si la routine de rappel de préopération modifie le bloc de paramètres d’E/S après avoir appelé FltRequestOperationStatusCallback, le bloc de paramètres d’E/S transmis par le Gestionnaire de filtres à CallbackRoutine sera différent du bloc de paramètres d’E/S que le pilote de filtre transmet la pile des pilotes lorsqu’il appelle IoCallDriver.

L’exemple de code suivant à partir d’une routine de rappel de préopération illustre comment cela peut se produire :

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

Dans l’exemple, la mémoire tampon de lecture est modifiée après l’appel à FltRequestOperationStatusCallback. Par conséquent, lorsque le Gestionnaire de filtre appelle CallbackRoutine, il passe un pointeur vers l’ancienne mémoire tampon au lieu du nouveau.

Le Gestionnaire de filtre appelle le callbackRoutine donné dans le contexte du thread d’origine à IRQL <= APC_LEVEL.

Exigences

Exigence Valeur
plateforme cible Universel
d’en-tête fltkernel.h (include Fltkernel.h)
bibliothèque Fltmgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Voir aussi

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

IoCallDriver

PFLT_GET_OPERATION_STATUS_CALLBACK

PFLT_PRE_OPERATION_CALLBACK