Partager via


Fonction FltRequestOperationStatusCallback (fltkernel.h)

FltRequestOperationStatusCallback retourne status informations 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 de 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 filtres appelle après qu’IoCallDriver retourne. Ce paramètre est obligatoire et ne peut pas être NULL.

[in, optional] RequesterContext

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

Valeur retournée

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

Code de retour Description
STATUS_FLT_DELETING_OBJECT
Le instance du pilote minifilter est en cours d’arrêt. 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 demande 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 afin d’obtenir la valeur status retournée par IoCallDriver 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 les 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 requête 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 transmettra à la routine spécifiée dans le paramètre CallbackRoutine . Les données copiées représentent une 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 l’appel de FltRequestOperationStatusCallback, le bloc de paramètres d’E/S que le Gestionnaire de filtres transmet à CallbackRoutine sera différent du bloc de paramètres d’E/S que le pilote de filtre transmet à la pile de pilotes lorsqu’il appelle IoCallDriver.

L’exemple de code suivant 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 filtres appelle CallbackRoutine, il passe un pointeur vers l’ancienne mémoire tampon au lieu de la nouvelle.

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

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête fltkernel.h (inclure 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