Partager via


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

La routine de rappel de préopération d’un pilote minifiltre peut mettre en attente une opération d’E/S en publiant l’opération dans une file d’attente de travail système et en retournant FLT_PREOP_PENDING. Le renvoi de cette valeur status indique que le pilote de minifiltre conserve le contrôle de l’opération d’E/S jusqu’à ce qu’il appelle FltCompletePendedPreOperation pour reprendre le traitement de l’opération d’E/S.

La routine de rappel de préopération d’un pilote minifiltre met en attente une opération d’E/S en effectuant les étapes suivantes :

  1. Publication de l’opération d’E/S dans une file d’attente de travail système en appelant une routine telle que FltQueueDeferredIoWorkItem.

  2. Retour FLT_PREOP_PENDING.

Un pilote de minifiltre qui doit bloquer toutes (ou la plupart) les opérations d’E/S entrantes ne doit pas utiliser des routines telles que FltQueueDeferredIoWorkItem pour les opérations d’arrêt, car l’appel de cette routine peut entraîner l’inondation des files d’attente de travail système. Au lieu de cela, un tel pilote de minifiltre doit utiliser une file d’attente cancel-safe. Pour plus d’informations sur l’utilisation des files d’attente cancel-safe, consultez FltCbdqInitialize.

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.)

  • Le instance cible de l’opération d’E/S est en cours de suppression.

Si la routine de rappel de préopération du pilote minifiltre retourne FLT_PREOP_PENDING, elle doit retourner null dans le paramètre de sortie CompletionContext .

Un pilote de minifiltre peut retourner FLT_PREOP_PENDING uniquement pour les opérations D’E/S basées sur IRP. Pour déterminer si une opération est une opération d’E/S basée sur IRP, utilisez la macro FLT_IS_IRP_OPERATION .

La routine de travail qui effectue la file d’attente et traite l’opération d’E/S doit appeler FltCompletePendedPreOperation pour reprendre le traitement de l’opération.