IRP_MJ_CREATE (filtres FS et FS)

Date d’envoi

Le Gestionnaire d’E/S envoie une demande de IRP_MJ_CREATE dans les cas suivants :

  • Un nouveau fichier ou répertoire est en cours de création.
  • Un fichier, un appareil, un répertoire ou un volume existant est ouvert.

Normalement, cette IRP est envoyée pour le compte d’une application en mode utilisateur qui a appelé une fonction Microsoft Win32 telle que CreateFile ou pour le compte d’un composant en mode noyau qui a appelé une fonction telle que IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile ou ZwOpenFile.

Si la demande de création est terminée correctement, l’application ou le composant en mode noyau reçoit un handle pour l’objet fichier.

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, la routine de répartition du pilote de système de fichiers doit terminer l’IRP et retourner une valeur NTSTATUS appropriée, après avoir défini Irp-IoStatus.Status> et Irp-IoStatus.Information> sur les valeurs appropriées.

Sinon, le pilote du système de fichiers doit traiter la demande de création.

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, la routine de répartition du pilote de filtre doit terminer l’IRP et retourner une valeur NTSTATUS appropriée, après avoir définiIrp-IoStatus.Status> et Irp-IoStatus.Information> sur les valeurs appropriées.

Sinon, le pilote de filtre doit effectuer tout traitement nécessaire. Ensuite, selon la nature du filtre, il doit terminer l’IRP ou le transmettre au pilote inférieur suivant sur la pile.

En règle générale, les pilotes de filtre ne doivent pas retourner STATUS_PENDING en réponse à IRP_MJ_CREATE. Toutefois, si un pilote de niveau inférieur retourne STATUS_PENDING, le pilote de filtre doit transmettre cette valeur status jusqu’à la chaîne de pilotes.

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. Pour IoCreateStreamFileObjectLite, une demande de IRP_MJ_CLEANUP n’est pas envoyée.

Lorsque les pilotes de filtre hérités rééditent une demande de création dans un rappel post-création, ils doivent libérer et définir la mémoire tampon associée à leur point d’analyse (la mémoire tampon auxiliaire) sur NULL. Si un pilote de filtre hérité ne libère pas cette mémoire tampon et la définit sur NULL, la mémoire du pilote est divulguée. Les pilotes Minifilter n’ont pas besoin de le faire, car le Gestionnaire de filtres le fait pour eux.

Paramètres

Un système de fichiers ou un pilote de filtre hérité appelle IoGetCurrentIrpStackLocation avec l’IRP donné pour 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 FILE_FULL_EA_INFORMATION structurée, si l’objet file représente un fichier avec des attributs étendus. Sinon, ce membre est défini sur NULL.

  • Irp->Indicateurs est défini sur les indicateurs suivants pour cette demande :

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode indique le mode d’exécution du processus qui a demandé l’opération, KernelMode ou UserMode. Si l’indicateur SL_FORCE_ACCESS_CHECK est défini, des vérifications d’accès doivent être effectuées, même si Irp-RequestorMode> est KernelMode.

  • 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. Le système de fichiers définit le membre Information de cette structure sur l’une des valeurs suivantes :

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize est la taille d’allocation initiale, en octets, pour le fichier. Une valeur différente de zéro n’a aucun effet, sauf si le fichier est en cours de création, de remplacement ou de remplacement.

  • IrpSp->FileObject pointe vers un objet fichier créé par le Gestionnaire d’E/S pour représenter le fichier à créer ou à ouvrir. Lorsque le système de fichiers traite la demande de IRP_MJ_CREATE, il définit les champs FsContext et éventuellement FsContext2 de cet objet de fichier sur des valeurs spécifiques au système de fichiers. Ainsi, les valeurs des champs FsContext et FsContext2 ne peuvent pas être considérées comme valides tant que le système de fichiers n’a pas traité la demande de création. Pour plus d’informations, consultez Flux de fichiers, contextes de flux et contextes de Per-Stream.

    FltCancelFileOpen et IoCancelFileOpen définissent l’indicateur FO_FILE_OPEN_CANCELLED dans le champ Indicateurs de l’objet file. La définition de cet indicateur indique que la demande de IRP_MJ_CREATE a été annulée et qu’une demande de IRP_MJ_CLOSE sera émise pour cet objet de fichier. Une fois la demande de création annulée, elle ne peut pas être rééditée.

    Le paramètre IrpSp-FileObject> contient un pointeur vers le champ RelatedFileObject, qui est également une structure FILE_OBJECT. Le champ RelatedFileObject d’une structure FILE_OBJECT est utilisé pour indiquer qu’un fichier donné a été ouvert par rapport à un objet fichier déjà ouvert. Cela indique généralement que le fichier relatif est un répertoire, mais que des fichiers basés sur des flux peuvent être ouverts par rapport à un flux déjà existant d’un fichier. Le champ RelatedFileObject de la structure FILE_OBJECT est valide uniquement pendant le traitement de IRP_MJ_CREATE.

  • IrpSp->Les indicateurs peuvent être définis sur une ou plusieurs des valeurs suivantes :

    Indicateur Signification
    SL_FORCE_ACCESS_CHECK 0x01 Si cet indicateur est défini, des vérifications d’accès doivent être effectuées même si la valeur de IRP-RequestorMode> est KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Si cet indicateur est défini, le fichier est un fichier de pagination.
    SL_OPEN_TARGET_DIRECTORY 0x04 Si cet indicateur est défini, le répertoire parent du fichier doit être ouvert.
    SL_STOP_ON_SYMLINK 0x08 Si cet indicateur est défini, la traversée automatique des jonctions et des liens symboliques du gestionnaire d’E/S est supprimée, ce qui entraîne le retour des ouvertures de jonctions et des liens symboliques STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Si cet indicateur est défini, il autorise la création d’un fichier en lecture seule avec l’option FILE_DELETE_ON_CLOSE. Cette option entraîne la suppression du fichier lorsque le handle est fermé.
    SL_CASE_SENSITIVE 0x80 Si elles sont définies, les comparaisons de noms de fichiers doivent respecter la casse.
  • IrpSp->MajorFunction est défini sur IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength est la taille en octets de la mémoire tampon sur Irp-AssociatedIrp.SystemBuffer>. Si la valeur de Irp*->AssociatedIrp.SystemBuffer est NULL, ce membre doit être égal à zéro.

  • IrpSp->Parameters.Create.FileAttributes est un masque de bits d’indicateurs d’attribut à appliquer lors de la création ou de l’ouverture du fichier. Les attributs explicitement spécifiés sont appliqués uniquement lorsque le fichier est créé, remplacé ou, dans certains cas, remplacé. Par défaut, cette valeur est FILE_ATTRIBUTE_NORMAL, que n’importe quel autre indicateur ou combinaison d’indicateurs compatibles peut remplacer. Ce membre correspond au paramètre FileAttributes de IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options est un masque de bits d’indicateurs qui spécifient les options à appliquer lors de la création ou de l’ouverture du fichier, ainsi que l’action à entreprendre si le fichier existe déjà.

    Les 8 bits élevés de ce paramètre correspondent au paramètre Disposition de IoCreateFileSpecifyDeviceObjectHint.

    Les 24 bits inférieurs de ce membre correspondent au paramètre CreateOptions à IoCreateFileSpecifyDeviceObjectHint. Les pilotes de filtre de système de fichiers et de minifiltre qui effectuent l’analyse des fichiers (tels que les programmes antivirus) doivent accorder une attention particulière à l’indicateur FILE_COMPLETE_IF_OPLOCKED. Si cet indicateur est défini, le filtre ne doit pas bloquer ou retarder l’opération de IRP_MJ_CREATE.

    Si l’indicateur FILE_COMPLETE_IF_OPLOCKED est défini dans le chemin d’accès de précréer (créer un dispatch), le filtre ne doit lancer aucun des types d’opérations suivants, car ils peuvent provoquer des blocages d’opération :

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    Si un filtre ou un minifiltre ne peut pas respecter l’indicateur de FILE_COMPLETE_IF_OPLOCKED, il doit terminer la demande IRP_MJ_CREATE avec STATUS_SHARING_VIOLATION.

    Si l’indicateur de FILE_COMPLETE_IF_OPLOCKED est défini dans le chemin d’accès d’achèvement (post-création), le filtre doit case activée si le système de fichiers a défini Irp-IoStatus.Status> sur la valeur STATUS_OPLOCK_BREAK_IN_PROGRESS status. Si cette valeur status n’est pas définie, il est sûr que le filtre lance l’une des opérations ci-dessus sur le fichier. Si cette valeur status est définie, l’oplock n’a pas encore été rompu et le filtre ne doit pas lancer d’opération susceptible de provoquer un arrêt d’opération. Par conséquent, le filtre doit reporter toutes les opérations ci-dessus sur le fichier jusqu’à ce que l’une des conditions suivantes soit remplie :

    • Le propriétaire de l’oplock envoie une requête FSCTL_OPLOCK_BREAK_ACKNOWLEDGE au système de fichiers.
    • Un composant système autre que le filtre ou le minifiltre envoie au système de fichiers une demande d’E/S qui doit attendre la fin du blocage d’opération (par exemple, IRP_MJ_READ ou IRP_MJ_WRITE). Le filtre ou le minifiltre peut lancer l’une des opérations ci-dessus à partir de sa routine de distribution (ou de rappel de préopération) pour cette nouvelle opération, car la routine de rappel de répartition ou de préopération est placée dans un état d’attente jusqu’à la fin de l’arrêt d’opération.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> pointe vers une structure ACCESS_STATE contenant le contexte d’objet de l’objet, les types d’accès accordés et les types d’accès souhaités restants.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> est une structure ACCESS_MASK spécifiant les droits d’accès demandés pour le fichier. Pour plus d’informations, consultez la description du paramètre DesiredAccess dans IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess est un masque de bits des droits d’accès au partage demandés pour le fichier. Si ce membre est égal à zéro, l’accès exclusif est demandé. Pour plus d’informations, consultez la description du paramètre ShareAccess dans IoCreateFileSpecifyDeviceObjectHint.

Voir aussi

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileOpen

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE (référence du noyau WDK)

ZwCreateFile

ZwOpenFile