IRP_MJ_READ (pilotes FS et filtre)

Date d’envoi

Le Gestionnaire d’E/S ou un pilote de système de fichiers envoie la requête IRP_MJ_READ. Cette demande peut être envoyée, par exemple, lorsqu’une application en mode utilisateur a appelé une fonction Win32 telle que ReadFile, ou lorsqu’un composant en mode noyau a appelé ZwReadFile.

Opération : Pilotes de système de fichiers

Le pilote de système de fichiers doit extraire et décoder l’objet de fichier pour déterminer les paramètres et le code de fonction secondaire.

Pour les demandes de lecture mdl (memory descriptor list), le système de fichiers doit case activée le code de fonction secondaire pour déterminer l’opération demandée. Voici les codes de fonction mineurs valides, qui ne peuvent être utilisés que pour les E/S de fichiers mis en cache :

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Pour plus d’informations sur la gestion de cette IRP, étudiez les exemples CDFS et FASTFAT inclus dans le Kit de pilotes Windows (WDK).

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

Le pilote de filtre doit effectuer tout traitement nécessaire et, en fonction de la nature du filtre, doit effectuer l’une des actions suivantes :

  • Terminer ou échouer l’IRP, ou
  • Passez l’IRP au pilote inférieur suivant sur la pile.

Paramètres

Un système de fichiers ou un pilote de filtre appelle IoGetCurrentIrpStackLocation pour que l’IRP donné obtienne un pointeur vers son propre emplacement de pile dans l’IRP. Dans les paramètres suivants, Irp pointe vers l’IRP et IrpSp pointe vers le IO_STACK_LOCATION. Le pilote peut utiliser les informations définies dans les membres suivants de l’IRP et de l’emplacement de la pile IRP pour traiter une demande de lecture :

  • DeviceObject est un pointeur vers l’objet d’appareil cible.

  • Irp->AssociatedIrp.SystemBuffer pointe vers une mémoire tampon fournie par le système à utiliser comme mémoire tampon système intermédiaire, si l’indicateur DO_BUFFERED_IO est défini dans DeviceObject-Flags>. Sinon, ce membre a la valeur NULL.

  • Irp->IoStatus pointe vers une structure IO_STATUS_BLOCK qui reçoit la status d’achèvement finale et des informations sur l’opération demandée. Pour plus d’informations, consultez la description du paramètre IoStatusBlock pour ZwReadFile.

  • Irp->MdlAddress est l’adresse d’une liste de descripteurs mémoire (MDL) décrivant les pages qui contiennent les données à lire.

  • *Irp->UserBuffer pointe vers une mémoire tampon de sortie fournie par l’appelant qui reçoit les données lues à partir du fichier.

  • IrpSp->FileObject pointe vers l’objet de fichier associé à DeviceObject. Si l’indicateur FO_SYNCHRONOUS_IO est défini dans IrpSp-FileObject-Flags>>, l’objet fichier a été ouvert pour les E/S synchrones.

    Le paramètre IrpSp-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_READ et ne doit pas être utilisé.

  • IrpSp->MajorFunction est défini sur IRP_MJ_READ.

  • IrpSp->MinorFunction spécifie l’opération demandée et contient l’une des valeurs suivantes :

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset est une variable LARGE_INTEGER qui spécifie le décalage d’octet de début dans le fichier des données à lire.

  • IrpSp->Parameters.Read.Keyest la valeur de clé associée à un verrou de plage d’octets sur le fichier cible.

  • IrpSp->Parameters.Read.Length est la longueur en octets des données à lire. Si l’opération de lecture réussit, le nombre d’octets lus est retourné dans le membre Information de la structure IO_STATUS_BLOCK pointée par Irp-IoStatus>.

Remarques

Les systèmes de fichiers arrondissent les opérations d’écriture et de lecture à la fin du fichier jusqu’à un multiple de la taille de secteur du périphérique de stockage de fichiers sous-jacent. Lorsque les filtres traitent des opérations de pré-lecture ou de préécriture, les filtres qui allouent et échangent des mémoires tampons doivent arrondir la taille d’une mémoire tampon allouée à un multiple de la taille de secteur de l’appareil associé. Si ce n’est pas le cas, la longueur des données transférées à partir du système de fichiers sous-jacent dépassera la longueur allouée de la mémoire tampon. Pour plus d’informations sur l’échange de mémoires tampons, consultez exemple de minifiltre swapBuffers.

Voir aussi

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (référence du noyau WDK)

IRP_MJ_WRITE

ZwReadFile