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 |
---|---|
|
Le instance du pilote minifilter est en cours d’arrêt. Il s’agit d’un code d’erreur. |
|
FltRequestOperationStatusCallback a rencontré un échec d’allocation de pool. Il s’agit d’un code d’erreur. |
|
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 |