Partager via


Échec d’une opération d’E/S dans une routine de rappel de post-opération

La routine de rappel de post-opération d’un pilote minifilter peut échouer lors d’une opération d’E/S réussie, mais le simple fait d’échouer une opération d’E/S n’annule pas l’effet de l’opération. Le pilote minifilter est chargé d’effectuer tout traitement nécessaire pour annuler l’opération.

Par exemple, la routine de rappel post-création d’un pilote minifilter peut échouer à une opération de IRP_MJ_CREATE réussie en effectuant les étapes suivantes :

  1. Appel de FltCancelFileOpen pour fermer le fichier qui a été créé ou ouvert par l’opération de création. Notez que FltCancelFileOpen n’annule aucune modification apportée au fichier. Par exemple, FltCancelFileOpen ne supprime pas un fichier nouvellement créé ou ne restaure pas un fichier tronqué à sa taille précédente.

  2. Définition du champ IoStatus.Status de la structure de données de rappel sur la valeur NTSTATUS finale de l’opération. Cette valeur doit être une valeur NTSTATUS d’erreur valide, telle que STATUS_ACCESS_DENIED.

  3. Définition du champ IoStatus.Information de la structure de rappel sur zéro.

  4. Retour FLT_POSTOP_FINISHED_PROCESSING.

Lorsque vous définissez le champ IoStatus.Status de la structure de données de rappel sur la valeur NTSTATUS finale pour l’opération, le pilote minifilter doit spécifier une valeur NTSTATUS d’erreur valide. Notez que les pilotes minifilter ne peuvent pas spécifier STATUS_FLT_DISALLOW_FAST_IO ; seul le gestionnaire de filtres peut utiliser cette valeur NTSTATUS.

Les appelants de FltCancelFileOpen doivent s’exécuter sur IRQL <= APC_LEVEL. Toutefois, un pilote minifilter peut appeler en toute sécurité cette routine à partir d’une routine de rappel post-création, car, pour les opérations de IRP_MJ_CREATE, la routine de rappel de postopération est appelée dans IRQL = PASSIVE_LEVEL, dans le contexte du thread à l’origine de l’opération de création.