IRP_MJ_CLOSE (pilotes FS et filtre)

Date d’envoi

Le Gestionnaire d’E/S envoie une demande de IRP_MJ_CLOSE pour indiquer que le nombre de références sur un objet de fichier a atteint zéro, généralement parce qu’un pilote de système de fichiers ou un autre composant en mode noyau a appelé ObDereferenceObject sur l’objet fichier. Cette demande suit normalement une demande de nettoyage. Toutefois, la demande de fermeture peut ne pas être reçue immédiatement après la demande de nettoyage.

Opération : Pilotes du système de fichiers

Si l’objet d’appareil cible est l’objet de périphérique de contrôle du système de fichiers, le pilote du système de fichiers doit terminer l’IRP après avoir effectué tout traitement nécessaire.

Sinon, le pilote de système de fichiers doit traiter la demande de fermeture.

Opération : Pilotes de filtre de système de fichiers hérités

Si l’objet d’appareil cible est l’objet de périphérique de contrôle du pilote de filtre, le pilote de filtre doit faire ce qui est nécessaire pour mettre fin à la communication avec l’objet de périphérique de contrôle, puis terminer l’IRP.

Sinon, le pilote de filtre doit effectuer tout traitement nécessaire, puis passer l’IRP au pilote inférieur suivant sur la pile. Le traitement peut inclure des opérations telles que la suppression des informations de contexte d’objet par fichier et par fichier que le filtre gère.

Les auteurs de pilotes de filtre de système de fichiers doivent noter qu’IoCreateStreamFileObject provoque l’envoi d’une demande de IRP_MJ_CLEANUP à la pile des pilotes du système de fichiers pour le volume. Étant donné que les systèmes de fichiers créent souvent des objets de fichier de flux en tant qu’effet secondaire d’opérations autres que IRP_MJ_CREATE, il est difficile pour les pilotes de filtre de détecter de manière fiable la création d’objets de fichier de flux. Par conséquent, un pilote de filtre doit s’attendre à recevoir des requêtes IRP_MJ_CLEANUP et IRP_MJ_CLOSE pour des objets fichier précédemment invisibles.

Les enregistreurs de pilotes de filtre doivent également noter que, contrairement à IoCreateStreamFileObject, IoCreateStreamFileObjectLite n’entraîne pas l’envoi d’une demande de IRP_MJ_CLEANUP à la pile des pilotes du système de fichiers. Pour cette raison, et étant donné que les systèmes de fichiers créent souvent des objets de fichier de flux en tant qu’effet secondaire d’opérations autres que IRP_MJ_CREATE, il est difficile pour les pilotes de filtre de détecter de manière fiable la création d’objets de fichier de flux. Par conséquent, les pilotes de filtre doivent s’attendre à recevoir IRP_MJ_CLOSE demandes pour des objets de fichier précédemment invisibles.

Paramètres

Un système de fichiers ou un pilote de filtre appelle IoGetCurrentIrpStackLocation avec l’IRP donné pour obtenir un pointeur vers son propre emplacement de pile dans l’IRP, indiqué dans la liste suivante en tant que IrpSp. (L’IRP s’affiche sous la forme Irp.) Le pilote peut utiliser les informations définies dans les membres suivants de l’IRP et de l’emplacement de pile IRP pour traiter une demande de fermeture.

  • DeviceObject

    Pointeur vers l’objet d’appareil cible.

  • Irp-Flags>

    Les indicateurs suivants sont définis pour cette demande :

    • IRP_CLOSE_OPERATION
    • IRP_SYNCHRONOUS_API
  • Irp-IoStatus>

    Pointeur vers une structure de IO_STATUS_BLOCK qui reçoit le status d’achèvement final et des informations sur l’opération demandée.

  • Irp-FileObject>

    Pointeur vers l’objet fichier associé à DeviceObject.

    Le paramètre Irp-FileObject> contient un pointeur vers le champ RelatedFileObject, qui est également une structure FILE_OBJECT. Le champ RelatedFileObject de la structure FILE_OBJECT n’est pas valide pendant le traitement de IRP_MJ_CLEANUP et ne doit pas être utilisé.

  • Irp-MajorFunction>

    Spécifie IRP_MJ_CLOSE.

Voir aussi

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLOSE (référence du noyau WDK)

IRP_MJ_CLEANUP

IRP_MJ_CREATE

ObDereferenceObject