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) |