Exécution d’une opération d’E/S dans une routine de rappel de préopération
Pour terminer une opération d’E/S, vous devez arrêter le traitement de l’opération, lui attribuer une valeur NTSTATUS finale et la renvoyer au gestionnaire de filtres.
Lorsqu’un pilote de minifiltre effectue une opération d’E/S, le gestionnaire de filtres effectue les opérations suivantes :
N’envoie pas l’opération aux pilotes de minifiltre sous le pilote de minifiltre actuel, aux filtres hérités ou au système de fichiers.
Appelle les routines de rappel post-opération des pilotes de minifiltre au-dessus du pilote de minifiltre actuel dans le pilote de minifiltre instance pile.
N’appelle pas la routine de rappel de post-opération du pilote minifiltre actuel pour l’opération, le cas échéant.
La routine de rappel de préopération d’un pilote minifiltre effectue une opération d’E/S en effectuant les étapes suivantes :
Définition du champ IoStatus.Status de la structure de données de rappel sur la valeur NTSTATUS finale pour l’opération.
Retour FLT_PREOP_COMPLETE.
Une routine de rappel de préopération qui termine une opération d’E/S ne peut pas définir un contexte d’achèvement non NULL (dans le paramètre de sortie CompletionContext ).
Un pilote de minifiltre peut également effectuer une opération dans la routine de travail pour une opération d’E/S précédemment suspendu en effectuant les étapes suivantes :
Définition du champ IoStatus.Status de la structure de données de rappel sur la valeur NTSTATUS finale pour l’opération.
La transmission FLT_PREOP_COMPLETE dans le paramètre CallbackStatus lorsque la routine de travail appelle FltCompletePendedPreOperation.
Lorsque vous terminez une opération d’E/S, un pilote de minifiltre doit définir le champ IoStatus.Status de la structure de données de rappel sur la valeur NTSTATUS finale pour l’opération, mais cette valeur NTSTATUS ne peut pas être STATUS_PENDING ou STATUS_FLT_DISALLOW_FAST_IO. Pour une opération de nettoyage ou de fermeture, le champ doit être STATUS_SUCCESS. Ces opérations ne peuvent pas être effectuées avec une autre valeur NTSTATUS.
L’exécution d’une opération d’E/S est souvent appelée réussite ou échec de l’opération, en fonction de la valeur NTSTATUS :
Pour réussir une opération d’E/S, vous devez la compléter avec une valeur NTSTATUS de réussite ou d’information, telle que STATUS_SUCCESS.
L’échec d’une opération d’E/S signifie la terminer avec une valeur NTSTATUS d’erreur ou d’avertissement, telle que STATUS_INVALID_DEVICE_REQUEST ou STATUS_BUFFER_OVERFLOW.
Les valeurs NTSTATUS sont définies dans ntstatus.h. Ces valeurs se répartissent en quatre catégories : réussite, information, avertissement et erreur. Pour plus d’informations sur ces valeurs, consultez Utilisation de valeurs NTSTATUS.