IRP_MJ_DEVICE_CONTROL (pilotes FS et filtre)

Date d’envoi

Le Gestionnaire d’E/S, d’autres composants du système d’exploitation et d’autres pilotes en mode noyau envoient des requêtes IRP_MJ_DEVICE_CONTROL. Normalement, cette IRP est envoyée pour le compte d’une application en mode utilisateur qui a appelé la fonction Win32 DeviceIoControl ou pour le compte d’un composant en mode noyau qui a appelé ZwDeviceIoControlFile.

Opération : Pilotes du système de fichiers

Le pilote de système de fichiers doit extraire et décoder l’objet fichier pour déterminer si la demande a été émise sur un handle qui est un volume ouvert. Dans ce cas, le pilote du système de fichiers doit passer l’IRP au pilote de périphérique pour le périphérique de stockage sur lequel le volume est monté. Si ce n’est pas le cas, le pilote doit échouer l’IRP.

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, terminer l’IRP ou le transmettre 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 la pile IRP pour traiter une demande de contrôle d’appareil.

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

  • Irp->AssociatedIrp.SystemBuffer pointe vers une mémoire tampon d’entrée fournie par le système à passer au pilote de périphérique pour l’appareil cible. Utilisé pour METHOD_BUFFERED ou METHOD_DIRECT E/S. Le fait que ce paramètre soit requis dépend du code de contrôle d’E/S spécifique.

  • 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 ZwDeviceIoControlFile.

  • Irp->MdlAddress est l’adresse d’une liste de descripteurs mémoire (MDL) décrivant une mémoire tampon de sortie à passer au pilote de périphérique pour l’appareil cible. Utilisé pour METHOD_DIRECT E/S. Le fait que ce paramètre soit requis dépend du code de contrôle d’E/S spécifique.

  • Irp->RequestorMode indique le mode d’exécution du processus qui a demandé l’opération, KernelMode ou UserMode.

  • Irp->UserBuffer pointe vers une mémoire tampon de sortie fournie par l’appelant à passer au pilote de périphérique pour l’appareil cible. Utilisé pour METHOD_BUFFERED ou METHOD_NEITHER E/S. Le fait que ce paramètre soit facultatif ou obligatoire dépend du code de contrôle d’E/S spécifique.

  • IrpSp->FileObject pointe vers l’objet file associé à DeviceObject.

    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_DEVICE_CONTROL et ne doit pas être utilisé.

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

  • IrpSp->Parameters.DeviceIoControl.InputBufferLength est la taille en octets de la mémoire tampon pointée par Irp-AssociatedIrp.SystemBuffer>.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode est le code de fonction IOCTL à transmettre au pilote de périphérique pour l’appareil cible.

    Pour plus d’informations sur les demandes IOCTL, consultez Utilisation des codes de contrôle d’E/S et « Codes de contrôle d’entrée et de sortie de l’appareil » dans la documentation du SDK Windows.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength est la taille en octets de la mémoire tampon pointée par Irp-UserBuffer>.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer est la mémoire tampon d’entrée pour les requêtes en mode noyau qui utilisent METHOD_NEITHER.

Voir aussi

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (référence du noyau WDK)

Utilisation de codes de contrôle d’E/S

ZwDeviceIoControlFile