Modification des paramètres d’une opération d’E/S
Un pilote de minifiltre peut modifier les paramètres d’une opération d’E/S. Par exemple, la routine de rappel de préopération d’un pilote minifiltre peut rediriger une opération d’E/S vers un autre volume en modifiant la instance cible pour l’opération. La nouvelle instance cible doit être un instance du même pilote de minifiltre à la même altitude sur un autre volume.
Les paramètres d’une opération d’E/S se trouvent dans la structure des données de rappel (FLT_CALLBACK_DATA) et la structure de blocs de paramètres d’E/S (FLT_IO_PARAMETER_BLOCK) pour l’opération. La routine de rappel de préopération et la routine de rappel post-opération du pilote minifiltre reçoivent un pointeur vers la structure de données de rappel pour l’opération dans le paramètre d’entrée de données Data . Le membre Iopb de la structure de données de rappel est un pointeur vers une structure de bloc de paramètres d’E/S qui contient les paramètres de l’opération.
Si la routine de rappel de préopération d’un pilote de minifiltre modifie les paramètres d’une opération d’E/S, tous les pilotes de minifiltre situés en dessous de ce pilote de minifiltre dans le pilote minifiltre instance pile recevront les paramètres modifiés dans leurs routines de rappel de préopération et de post-opération.
Les paramètres modifiés ne sont pas reçus par la routine de rappel post-opération du pilote minifiltre actuel ou par les pilotes de minifiltre au-dessus de ce pilote de minifiltre dans la pile du pilote minifiltre instance. Dans tous les cas, les routines de rappel de préopération et de post-opération d’un pilote minifiltre reçoivent les mêmes valeurs de paramètres d’entrée pour une opération d’E/S donnée.
Après avoir modifié les paramètres d’une opération d’E/S, la routine de rappel de préopération ou de post-opération doit indiquer qu’elle l’a fait en appelant FltSetCallbackDataDirty, sauf si elle a modifié le contenu du champ IoStatus de la structure de rappel. Sinon, le gestionnaire de filtres ignore les modifications apportées aux valeurs de paramètre. FltSetCallbackDataDirty définit l’indicateur FLTFL_CALLBACK_DATA_DIRTY dans la structure de données de rappel pour l’opération d’E/S. Les pilotes de minifiltre peuvent tester cet indicateur en appelant FltIsCallbackDataDirty ou l’effacer en appelant FltClearCallbackDataDirty.
Si la routine de rappel de préopération d’un pilote de minifiltre modifie les paramètres d’une opération d’E/S, tous les pilotes de minifiltre situés en dessous de ce pilote de minifiltre dans la pile instance pilote de minifiltre recevront les paramètres modifiés dans les paramètres d’entrée Data et FltObjects pour leurs routines de rappel de préopération et de post-opération. (Les pilotes de minifiltre ne peuvent pas modifier directement le contenu de la structure FLT_RELATED_OBJECTS vers laquelle pointe le paramètre FltObjects. Toutefois, si un pilote de minifiltre modifie le instance cible ou l’objet de fichier cible pour une opération d’E/S, le gestionnaire de filtres modifie la valeur du membre Instance ou FileObject correspondant de la structure FLT_RELATED_OBJECTS qui est passée aux pilotes de minifiltre inférieurs.)
Bien que les modifications de paramètre apportées par la routine de rappel de préopération d’un pilote minifiltre ne soient pas reçues par la propre routine de rappel post-opération du pilote minifiltre, une routine de rappel de préopération est en mesure de transmettre des informations sur les paramètres modifiés à la propre routine de rappel post-opération du pilote minifiltre. Si la routine de rappel de préopération transmet l’opération d’E/S dans la pile en retournant FLT_PREOP_SUCCESS_WITH_CALLBACK ou FLT_PREOP_SYNCHRONIZE, elle peut stocker des informations sur les valeurs de paramètre modifiées dans une structure définie par le pilote de minifiltre vers laquelle pointe le paramètre de sortie CompletionContext . Le gestionnaire de filtres transmet ce pointeur de structure dans le paramètre d’entrée CompletionContext à la routine de rappel post-opération.
Pour plus d’informations sur les paramètres d’une opération d’E/S, consultez FLT_CALLBACK_DATA et FLT_IO_PARAMETER_BLOCK.