Partager via


Structure IRP (wdm.h)

La structure IRP est une structure partiellement opaque qui représente un paquet de requête 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 une mdL décrivant une mémoire tampon utilisateur, si le pilote utilise des E/S directes et que le code de la fonction principale IRP est l’un des éléments suivants :

  • IRP_MJ_READ

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

  • IRP_MJ_WRITE

    La 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, la 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, la 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 types de transfert METHOD_IN_DIRECT et METHOD_OUT_DIRECT dans les codes IOCTL, consultez Descriptions des tampons pour les codes de contrôle d’E/S.

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

Flags

Les pilotes de système de fichiers utilisent ce champ, qui est en lecture seule pour tous les pilotes. Les pilotes de périphérique réseau et, éventuellement, de plus haut niveau 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 le master IRP dans un IRP créé par un appel de pilote de niveau supérieur à 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 la fonction principale IRP, comme suit :

  • SystemBuffer.IRP_MJ_READ

    La mémoire tampon reçoit les données du périphérique 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 le périphérique 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 des tampons 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 des tampons 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 la fonction principale IRP, comme suit :

ThreadListEntry

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

IoStatus

Contient la structure IO_STATUS_BLOCK dans laquelle un pilote stocke des status et des informations avant d’appeler IoCompleteRequest.

RequestorMode

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

PendingReturned

Si la valeur est TRUE, un pilote a marqué l’IRP en attente. Chaque routine IoCompletion doit case activée la valeur de cet indicateur. Si l’indicateur a la valeur TRUE et si la routine IoCompletion ne retourne pas STATUS_MORE_PROCESSING_REQUIRED, la routine doit appeler IoMarkIrpPending pour propager les status en attente aux pilotes au-dessus d’elle dans la pile de périphériques.

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 l’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 pour qu’une routine Cancel fournie par le pilote soit appelée si l’IRP est annulé. NULL indique que l’IRP n’est actuellement pas annulable.

UserBuffer

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

  • Le code de fonction principal dans l’emplacement de la pile d’E /S est IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL.

  • Le code de contrôle d’E/S a été défini avec METHOD_NEITHER ou METHOD_BUFFERED.

Pour METHOD_BUFFERED, le pilote doit utiliser la mémoire tampon pointée vers Irp-AssociatedIrp.SystemBuffer> comme mémoire tampon de sortie. Lorsque le pilote termine la demande, le gestionnaire d’E/S copie le contenu de cette mémoire tampon dans la mémoire tampon de sortie vers laquelle Irp-UserBuffer> pointe. Le pilote ne doit pas écrire directement dans la mémoire tampon pointée par Irp-UserBuffer>. Pour plus d’informations, consultez Descriptions des tampons 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 IRP sont mis en file d’attente dans la file d’attente des appareils associée à l’objet de périphérique du pilote, ce champ lie les IRP dans la file d’attente d’appareils. Ces liens peuvent être utilisés uniquement pendant que le pilote traite l’IRP.

Tail.Overlay.DriverContext[4]

Si les irps ne sont pas mis en file d’attente dans la file d’attente de périphériques associée à 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 est propriétaire de l’IRP.

Tail.Overlay.Thread

Pointeur vers le bloc de contrôle de thread (TCB) de l’appelant. 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 demande.

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 IRP, il utilise ce champ pour lier un IRP au suivant. Ces liens peuvent être utilisés uniquement pendant que 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 pour permettre aux pilotes de communiquer entre eux. Un paquet se compose de deux parties différentes :

  • 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 d’appareil sur lequel un fichier est ouvert, etc. Il est également utilisé par les pilotes pour stocker des informations telles que la status finale de la demande.

  • Emplacements de la pile d’E/ S : l’en-tête suivant se trouve un ensemble d’emplacements de pile d’E/S, un par pilote dans la chaîne de pilotes en couches pour lesquels la demande 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 .

Alors qu’un pilote de niveau supérieur peut case activée la valeur de l’élément Boolean Cancel dans un IRP, ce pilote ne peut pas supposer que l’IRP sera effectué avec STATUS_CANCELLED par un pilote de niveau inférieur, même si la valeur est TRUE.

Configuration requise

Condition requise Valeur
En-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

Voir aussi