IRP_MJ_WRITE (pilotes FS et filtre)

Date d’envoi

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

Opération : Pilotes du système de fichiers

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

Pour les demandes d’écriture MDL, 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 secondaire valides, qui peuvent être utilisés uniquement 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 l’exemple 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, selon la nature du filtre, effectuer l’une des actions suivantes :

  • Terminer ou échouer l’IRP, ou
  • Transmettez 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 l’IRP donné afin d’obtenir 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 pile IRP pour traiter une demande de création :

  • 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 est défini sur 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. Si la demande de IRP_MJ_WRITE échoue, la routine de distribution d’écriture du système de fichiers retourne une valeur NTSTATUS d’erreur, et la valeur de Irp-IoStatus.Information> n’est pas définie et ne doit pas être utilisée.

  • Irp->MdlAddress est l’adresse d’une liste de descripteurs mémoire (MDL) qui décrit les pages dans lesquelles les données doivent être écrites.

  • IrpSp->FileObject pointe vers l’objet file associé à DeviceObject. Si l’indicateur FO_SYNCHRONOUS_IO est défini dans IrpSp-FileObject-Flags>>, l’objet file 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_WRITE et ne doit pas être utilisé.

  • IrpSp->Indicateurs : si l’indicateur SL_FORCE_DIRECT_WRITE est défini, les pilotes en mode noyau peuvent écrire dans des zones de volume qu’ils ne peuvent normalement pas écrire en raison d’un blocage direct de l’écriture. Le blocage des écritures directes a été implémenté pour des raisons de sécurité dans Windows Vista et les systèmes d’exploitation ultérieurs. Cet indicateur est vérifié à la fois au niveau de la couche du système de fichiers et de la couche de pile de stockage. Pour plus d’informations sur le blocage des écritures directes, consultez Blocage des opérations d’écriture directe sur des volumes et des disques. L’indicateur SL_FORCE_DIRECT_WRITE est disponible dans Windows Vista et les versions ultérieures de Windows.

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

  • IrpSp->MinorFunction spécifie l’opération demandée et contient l’un des éléments suivants :

    • 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.Write.ByteOffset est une variable LARGE_INTEGER qui spécifie le décalage d’octets de départ dans le fichier des données à écrire.

    Dans certaines circonstances, ce paramètre peut contenir une valeur spéciale. Par exemple, si la valeur est true, la condition suivante indique que la fin actuelle du fichier doit être utilisée à la place d’une valeur de décalage de fichier explicite : IrpSp-Parameters.Write.ByteOffset.LowPart> == FILE_WRITE_TO_END_OF_FILE et IrpSp-Parameters.Write.ByteOffset.HighPart> == -1

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

  • IrpSp->Parameters.Write.Length est la longueur en octets des données à écrire. Si l’opération d’écriture réussit, le nombre d’octets écrits 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 d’é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épasse 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

CcMdlWriteComplete

CcPrepareMdlWrite

FLT_IO_PARAMETER_BLOCK

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ

IRP_MJ_WRITE (référence du noyau WDK)

ZwWriteFile