Partager via


Structure IRP (wdm.h)

La structure de IRP est une structure partiellement opaque qui représente un paquet de requêtes d’E/S . Les membres non documentés de la structure IRP sont réservés, utilisés uniquement par le gestionnaire d’E/S ou dans certains cas, par les pilotes de système de fichiers (FSD).

Syntaxe

typedef struct _IRP {
  CSHORT                    Type;
  USHORT                    Size;
  PMDL                      MdlAddress;
  ULONG                     Flags;
  union {
    struct _IRP     *MasterIrp;
    __volatile LONG IrpCount;
    PVOID           SystemBuffer;
  } AssociatedIrp;
  LIST_ENTRY                ThreadListEntry;
  IO_STATUS_BLOCK           IoStatus;
  KPROCESSOR_MODE           RequestorMode;
  BOOLEAN                   PendingReturned;
  CHAR                      StackCount;
  CHAR                      CurrentLocation;
  BOOLEAN                   Cancel;
  KIRQL                     CancelIrql;
  CCHAR                     ApcEnvironment;
  UCHAR                     AllocationFlags;
  union {
    PIO_STATUS_BLOCK UserIosb;
    PVOID            IoRingContext;
  };
  PKEVENT                   UserEvent;
  union {
    struct {
      union {
        PIO_APC_ROUTINE UserApcRoutine;
        PVOID           IssuingProcess;
      };
      union {
        PVOID                 UserApcContext;
#if ...
        _IORING_OBJECT        *IoRing;
#else
        struct _IORING_OBJECT *IoRing;
#endif
      };
    } AsynchronousParameters;
    LARGE_INTEGER AllocationSize;
  } Overlay;
  __volatile PDRIVER_CANCEL CancelRoutine;
  PVOID                     UserBuffer;
  union {
    struct {
      union {
        KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
        struct {
          PVOID DriverContext[4];
        };
      };
      PETHREAD     Thread;
      PCHAR        AuxiliaryBuffer;
      struct {
        LIST_ENTRY ListEntry;
        union {
          struct _IO_STACK_LOCATION *CurrentStackLocation;
          ULONG                     PacketType;
        };
      };
      PFILE_OBJECT OriginalFileObject;
    } Overlay;
    KAPC  Apc;
    PVOID CompletionKey;
  } Tail;
} IRP;

Membres

Type

Réservé à une utilisation interne du système.

Size

Réservé à une utilisation interne du système.

MdlAddress

Pointeur vers un MDL décrivant une mémoire tampon utilisateur, si le pilote utilise des E/S directes et que le code de fonction principal IRP est l’un des éléments suivants :

  • IRP_MJ_READ

    Le MDL décrit une mémoire tampon vide que le périphérique ou le pilote remplit.

  • IRP_MJ_WRITE

    Le MDL décrit une mémoire tampon qui contient des données pour le périphérique ou le pilote.

  • IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL

    Si le code IOCTL spécifie le type de transfert METHOD_IN_DIRECT, le MDL décrit une mémoire tampon qui contient des données pour le périphérique ou le pilote.

Si le code IOCTL spécifie le type de transfert METHOD_OUT_DIRECT, le MDL décrit une mémoire tampon vide que le périphérique ou le pilote remplit.

Pour plus d’informations sur les mémoires tampons associées aux METHOD_IN_DIRECT et aux types de transfert METHOD_OUT_DIRECT dans les codes IOCTL, consultez Descriptions des mémoires tampons pour les codes de contrôle d’E/S.

Si le pilote n’utilise pas d’E/S directes, ce pointeur est NULL.

Flags

Les pilotes de système de fichiers utilisent ce champ, qui est en lecture seule pour tous les pilotes. Le réseau et, éventuellement, les pilotes de périphérique de niveau supérieur peuvent également lire ce champ. Ce champ est défini sur zéro ou sur le bit-OR d’un ou plusieurs des bits d’indicateur définis par le système suivants :

  • IRP_NOCACHE
  • IRP_PAGING_IO
  • IRP_MOUNT_COMPLETION
  • IRP_SYNCHRONOUS_API
  • IRP_ASSOCIATED_IRP
  • IRP_BUFFERED_IO
  • IRP_DEALLOCATE_BUFFER
  • IRP_INPUT_OPERATION
  • IRP_SYNCHRONOUS_PAGING_IO
  • IRP_CREATE_OPERATION
  • IRP_READ_OPERATION
  • IRP_WRITE_OPERATION
  • IRP_CLOSE_OPERATION
  • IRP_DEFER_IO_COMPLETION
  • IRP_OB_QUERY_NAME
  • IRP_HOLD_DEVICE_QUEUE
  • IRP_UM_DRIVER_INITIATED_IO

AssociatedIrp

Réservé à une utilisation interne du système.

AssociatedIrp.MasterIrp

Pointeur vers l’IRP maître dans un IRP créé par un appel de pilote de niveau supérieur pour IoMakeAssociatedIrp.

AssociatedIrp.IrpCount

Réservé à une utilisation interne du système.

AssociatedIrp.SystemBuffer

Pointeur vers une mémoire tampon d’espace système.

Si le pilote utilise des E/S mises en mémoire tampon, l’objectif de la mémoire tampon est déterminé par le code de fonction principal IRP, comme suit :

  • SystemBuffer.IRP_MJ_READ

    La mémoire tampon reçoit les données de l’appareil ou du pilote. La longueur de la mémoire tampon est spécifiée par Parameters.Read.Length dans la structure IO_STACK_LOCATION du pilote.

  • SystemBuffer.IRP_MJ_WRITE

    La mémoire tampon fournit des données pour l’appareil ou le pilote. La longueur de la mémoire tampon est spécifiée par Parameters.Write.Length dans la structure IO_STACK_LOCATION du pilote.

  • SystemBuffer.IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL

    La mémoire tampon représente les mémoires tampons d’entrée et de sortie fournies à DeviceIoControl et IoBuildDeviceIoControlRequest. Les données de sortie remplacent les données d’entrée.

Pour l’entrée, la longueur de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.InputBufferLength dans la structure IO_STACK_LOCATION du pilote.

Pour la sortie, la longueur de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.OutputBufferLength dans la structure IO_STACK_LOCATION du pilote.

Pour plus d’informations, consultez Descriptions de mémoire tampon pour les codes de contrôle d’E/S.

La mémoire tampon représente la mémoire tampon d’entrée fournie à DeviceIoControl et IoBuildDeviceIoControlRequest.

La longueur de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.InputBufferLength dans la structure IO_STACK_LOCATION du pilote.

Pour plus d’informations, consultez Descriptions de mémoire tampon pour les codes de contrôle d’E/S.

Si le pilote utilise des E/S directes, l’objectif de la mémoire tampon est déterminé par le code de fonction principal IRP, comme suit :

ThreadListEntry

Réservé à une utilisation interne du système.

IoStatus

Contient la structure IO_STATUS_BLOCK dans laquelle un pilote stocke l’état et les informations avant d’appeler IoCompleteRequest.

RequestorMode

Indique le mode d’exécution du demandeur d’origine de l’opération, l’un des UserMode ou KernelMode.

PendingReturned

Si la valeur est TRUE, un pilote a marqué l’IRP en attente. Chaque routine IoCompletion doit vérifier la valeur de cet indicateur. Si l’indicateur est TRUEet si la routine IoCompletion ne retourne pas STATUS_MORE_PROCESSING_REQUIRED, la routine doit appeler IoMarkIrpPending pour propager l’état en attente aux pilotes ci-dessus dans la pile d’appareils.

StackCount

Réservé à une utilisation interne du système.

CurrentLocation

Réservé à une utilisation interne du système.

Cancel

Si la valeur est TRUE, l’IRP est ou doit être annulé.

CancelIrql

Contient le runtime IRQL auquel un pilote s’exécute quand IoAcquireCancelSpinLock est appelé.

ApcEnvironment

Réservé à une utilisation interne du système.

AllocationFlags

Réservé à une utilisation interne du système.

UserIosb

Réservé à une utilisation interne du système.

IoRingContext

Réservé à une utilisation interne du système.

UserEvent

Réservé à une utilisation interne du système.

Overlay

Réservé à une utilisation interne du système.

Overlay.AsynchronousParameters

Réservé à une utilisation interne du système.

Overlay.AsynchronousParameters.UserApcRoutine

Réservé à une utilisation interne du système.

Overlay.AsynchronousParameters.IssuingProcess

Réservé à une utilisation interne du système.

Overlay.AsynchronousParameters.UserApcContext

Réservé à une utilisation interne du système.

Overlay.AsynchronousParameters.IoRing

Réservé à une utilisation interne du système.

Overlay.AllocationSize

Réservé à une utilisation interne du système.

CancelRoutine

Contient le point d’entrée d’un pilote fourni Annuler routine à appeler si l’IRP est annulé. NULL indique que l’IRP n’est pas actuellement annulable.

UserBuffer

Contient l’adresse d’une mémoire tampon de sortie si les deux conditions suivantes s’appliquent :

Pour METHOD_BUFFERED, le pilote doit utiliser la mémoire tampon pointée par Irp->AssociatedIrp.SystemBuffer comme mémoire tampon de sortie. Lorsque le pilote termine la requête, le gestionnaire d’E/S copie le contenu de cette mémoire tampon vers la mémoire tampon de sortie pointée par Irp->UserBuffer. Le pilote ne doit pas écrire directement dans la mémoire tampon vers laquelle pointe Irp->UserBuffer. Pour plus d’informations, consultez Descriptions de mémoire tampon pour les codes de contrôle d’E/S.

Tail

Réservé à une utilisation interne du système.

Tail.Overlay

Réservé à une utilisation interne du système.

Tail.Overlay.DeviceQueueEntry

Si les fournisseurs d’intégration sont mis en file d’attente dans la file d’attente de l’appareil associé à l’objet d’appareil du pilote, ce champ lie les irps dans la file d’attente de l’appareil. Ces liens ne peuvent être utilisés que lorsque le pilote traite l’IRP.

Tail.Overlay.DriverContext[4]

Si les fournisseurs d’intégration ne sont pas mis en file d’attente dans la file d’attente de l’appareil associé à l’objet de périphérique du pilote, ce champ peut être utilisé par le pilote pour stocker jusqu’à quatre pointeurs. Ce champ ne peut être utilisé que lorsque le pilote possède l’IRP.

Tail.Overlay.Thread

Pointeur vers le bloc de contrôle de thread de l’appelant (TCB). Pour les demandes qui proviennent du mode utilisateur, le gestionnaire d’E/S définit toujours ce champ pour qu’il pointe vers le TCB du thread qui a émis la requête.

Tail.Overlay.AuxiliaryBuffer

Réservé à une utilisation interne du système.

Tail.Overlay.ListEntry

Si un pilote gère ses propres files d’attente internes de fournisseurs d’intégration, il utilise ce champ pour lier un IRP à l’autre. Ces liens ne peuvent être utilisés que lorsque le pilote conserve l’IRP dans sa file d’attente ou traite l’IRP.

Tail.Overlay.CurrentStackLocation

Réservé à une utilisation interne du système.

Tail.Overlay.PacketType

Réservé à une utilisation interne du système.

Tail.Overlay.OriginalFileObject

Réservé à une utilisation interne du système.

Tail.Apc

Réservé à une utilisation interne du système.

Tail.CompletionKey

Réservé à une utilisation interne du système.

Remarques

Les membres non documentés de la structure IRP sont réservés, utilisés uniquement par le gestionnaire d’E/S ou dans certains cas, par les pilotes de système de fichiers (FSD).

Un IRP est la structure de gestionnaire d’E/S de base utilisée pour communiquer avec les pilotes et permettre aux pilotes de communiquer entre eux. Un paquet se compose de deux parties différentes :

  • d’en-tête, ou partie fixe du paquet: il est utilisé par le gestionnaire d’E/S pour stocker des informations sur la demande d’origine, telles que les paramètres indépendants de l’appareil de l’appelant, l’adresse de l’objet appareil sur lequel un fichier est ouvert, etc. Il est également utilisé par les pilotes pour stocker des informations telles que l’état final de la demande.

  • emplacements de pile d’E/S : suivant l’en-tête est un ensemble d’emplacements de pile d’E/S , un par pilote dans la chaîne de pilotes en couches pour lesquels la requête est liée. Chaque emplacement de pile contient les paramètres, les codes de fonction et le contexte utilisés par le pilote correspondant pour déterminer ce qu’il est censé faire. Pour plus d’informations, consultez la structure IO_STACK_LOCATION.

Si un pilote de niveau supérieur peut vérifier la valeur de l'Annuler booléen dans un IRP, ce pilote ne peut pas supposer que l’IRP est terminé avec STATUS_CANCELLED par un pilote de niveau inférieur même si la valeur est TRUE.

Exigences

Exigence Valeur
d’en-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

Voir aussi