Partager via


En attente d’une opération d’E/S dans une routine de rappel de post-opération

La routine de rappel post-opération d’un pilote minifilter peut mettre en attente une opération d’E/S en effectuant les étapes suivantes :

  1. Appel de FltAllocateDeferredIoWorkItem pour allouer un élément de travail pour l’opération d’E/S.

  2. Appel de FltQueueDeferredIoWorkItem pour publier l’opération d’E/S dans une file d’attente de travail système.

  3. Retour FLT_POSTOP_MORE_PROCESSING_REQUIRED.

Notez que l’appel à FltQueueDeferredIoWorkItem échoue si l’une des conditions suivantes est remplie :

  • L’opération n’est pas une opération d’E/S basée sur IRP.

  • L’opération est une opération d’E/S de pagination.

  • Le champ TopLevelIrp du thread actuel n’est pas NULL. (Pour plus d’informations sur la recherche de la valeur de ce champ, consultez IoGetTopLevelIrp.)

  • La instance cible pour l’opération d’E/S est détruite. (Le gestionnaire de filtres indique cette situation en définissant l’indicateur de FLTFL_POST_OPERATION_DRAINING dans le paramètre d’entrée Flags sur la routine de rappel postopération.)

Les pilotes Minifilter doivent être prêts à gérer cette défaillance. Si votre pilote minifilter ne peut pas gérer de tels échecs, vous devez envisager d’utiliser la technique décrite dans Retour FLT_PREOP_SYNCHRONIZE au lieu d’attendre l’opération d’E/S.

Une fois la routine de rappel de post-opération du pilote minifilter retournée FLT_POSTOP_MORE_PROCESSING_REQUIRED, le gestionnaire de filtres n’effectue plus de traitement d’achèvement pour l’opération d’E/S jusqu’à ce que la routine de travail du pilote minifilter appelle FltCompletePendedPostOperation pour renvoyer le contrôle de l’opération au gestionnaire de filtres. Le gestionnaire de filtres n’effectue aucun traitement supplémentaire dans cette situation, même si la routine de travail définit une valeur NTSTATUS d’échec dans le champ IoStatus.Status de la structure de données de rappel pour l’opération.

La routine de travail qui supprime la file d’attente et effectue le traitement d’achèvement pour l’opération d’E/S doit appeler FltCompletePendedPostOperation pour renvoyer le contrôle de l’opération au gestionnaire de filtres.