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 |
---|---|
|
L’instance du pilote minifilter est détruite. 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 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 |