Estructura IRP (wdm.h)
La estructura IRP es una estructura parcialmente opaca que representa un paquete de solicitud de E/S. Los miembros no documentados de la estructura IRP están reservados, utilizados solo por el administrador de E/S o, en algunos casos, por controladores del sistema de archivos (FSD).
Sintaxis
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;
Miembros
Type
Reservado para uso interno del sistema.
Size
Reservado para uso interno del sistema.
MdlAddress
Puntero a una MDL que describe un búfer de usuario, si el controlador usa E/S directa y el código de función principal irP es uno de los siguientes:
IRP_MJ_READ
MdL describe un búfer vacío que el dispositivo o controlador rellena.
IRP_MJ_WRITE
MdL describe un búfer que contiene datos para el dispositivo o controlador.
IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL
Si el código IOCTL especifica el tipo de transferencia METHOD_IN_DIRECT, MDL describe un búfer que contiene datos para el dispositivo o controlador.
Si el código IOCTL especifica el tipo de transferencia METHOD_OUT_DIRECT, MDL describe un búfer vacío que el dispositivo o controlador rellena.
Para obtener más información sobre los búferes asociados a METHOD_IN_DIRECT y METHOD_OUT_DIRECT tipos de transferencia en códigos IOCTL, vea Descripciones del búfer para códigos de control de E/S.
Si el controlador no usa E/S directa, este puntero es NULL.
Flags
Los controladores del sistema de archivos usan este campo, que es de solo lectura para todos los controladores. La red y, posiblemente, los controladores de dispositivos de nivel superior también pueden leer este campo. Este campo se establece en cero o en el or bit a bit de uno o varios de los siguientes bits de marca definidos por el sistema:
- 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
Reservado para uso interno del sistema.
AssociatedIrp.MasterIrp
Puntero al IRP maestro en un IRP creado por una llamada de controlador de nivel superior a IoMakeAssociatedIrp.
AssociatedIrp.IrpCount
Reservado para uso interno del sistema.
AssociatedIrp.SystemBuffer
Puntero a un búfer de espacio del sistema.
Si el controlador usa E/S almacenada en búfer, el propósito del búfer viene determinado por el código de función principal de IRP, como se indica a continuación:
SystemBuffer.IRP_MJ_READ
El búfer recibe datos del dispositivo o controlador. Parameters.Read.Length especifica la longitud del búfer en la estructura IO_STACK_LOCATION del controlador.
SystemBuffer.IRP_MJ_WRITE
El búfer proporciona datos para el dispositivo o controlador. Parameters.Write.Length especifica la longitud del búfer en la estructura IO_STACK_LOCATION del controlador.
SystemBuffer.IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL
El búfer representa los búferes de entrada y salida que se proporcionan a DeviceIoControl e IoBuildDeviceIoControlRequest. Los datos de salida sobrescriben los datos de entrada.
Para la entrada, la longitud del búfer se especifica mediante Parameters.DeviceIoControl.InputBufferLength en la estructura de IO_STACK_LOCATION del controlador.
Para la salida, parameters.DeviceIoControl.OutputBufferLength especifica la longitud del búfer en la estructura IO_STACK_LOCATION del controlador.
Para obtener más información, vea Descripciones del búfer para códigos de control de E/S.
El búfer representa el búfer de entrada que se proporciona a DeviceIoControl e IoBuildDeviceIoControlRequest.
La longitud del búfer se especifica mediante Parameters.DeviceIoControl.InputBufferLength en la estructura de IO_STACK_LOCATION del controlador.
Para obtener más información, vea Descripciones del búfer para códigos de control de E/S.
Si el controlador usa E/S directa, el propósito del búfer viene determinado por el código de función principal irP, como se indica a continuación:
ThreadListEntry
Reservado para uso interno del sistema.
IoStatus
Contiene la estructura IO_STATUS_BLOCK en la que un controlador almacena el estado y la información antes de llamar a IoCompleteRequest.
RequestorMode
Indica el modo de ejecución del solicitante original de la operación, uno de UserMode o KernelMode.
PendingReturned
Si se establece en TRUE, un controlador ha marcado el IRP pendiente. Cada rutina de IoCompletion debe comprobar el valor de esta marca. Si la marca es TRUE y si la rutina IoCompletion no devolverá STATUS_MORE_PROCESSING_REQUIRED, la rutina debe llamar a IoMarkIrpPending para propagar el estado pendiente a los controladores situados encima de él en la pila de dispositivos.
StackCount
Reservado para uso interno del sistema.
CurrentLocation
Reservado para uso interno del sistema.
Cancel
Si se establece en TRUE, el IRP es o debe cancelarse.
CancelIrql
Contiene el IRQL en el que se ejecuta un controlador cuando se llama a IoAcquireCancelSpinLock .
ApcEnvironment
Reservado para uso interno del sistema.
AllocationFlags
Reservado para uso interno del sistema.
UserIosb
Reservado para uso interno del sistema.
IoRingContext
Reservado para uso interno del sistema.
UserEvent
Reservado para uso interno del sistema.
Overlay
Reservado para uso interno del sistema.
Overlay.AsynchronousParameters
Reservado para uso interno del sistema.
Overlay.AsynchronousParameters.UserApcRoutine
Reservado para uso interno del sistema.
Overlay.AsynchronousParameters.IssuingProcess
Reservado para uso interno del sistema.
Overlay.AsynchronousParameters.UserApcContext
Reservado para uso interno del sistema.
Overlay.AsynchronousParameters.IoRing
Reservado para uso interno del sistema.
Overlay.AllocationSize
Reservado para uso interno del sistema.
CancelRoutine
Contiene el punto de entrada de una rutina Cancel proporcionada por el controlador a la que se llamará si se cancela el IRP. NULL indica que el IRP no se puede cancelar actualmente.
UserBuffer
Contiene la dirección de un búfer de salida si se aplican las dos condiciones siguientes:
El código de función principal de la ubicación de la pila de E/S es IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL.
El código de control de E/S se definió con METHOD_NEITHER o METHOD_BUFFERED.
Para METHOD_BUFFERED, el controlador debe usar el búfer al que apunta Irp-AssociatedIrp.SystemBuffer> como búfer de salida. Cuando el controlador completa la solicitud, el administrador de E/S copia el contenido de este búfer en el búfer de salida al que apunta Irp-UserBuffer>. El controlador no debe escribir directamente en el búfer al que apunta Irp-UserBuffer>. Para obtener más información, vea Descripciones del búfer para códigos de control de E/S.
Tail
Reservado para uso interno del sistema.
Tail.Overlay
Reservado para uso interno del sistema.
Tail.Overlay.DeviceQueueEntry
Si los IRP se ponen en cola en la cola de dispositivos asociada al objeto de dispositivo del controlador, este campo vincula los IRP en la cola del dispositivo. Estos vínculos solo se pueden usar mientras el controlador está procesando el IRP.
Tail.Overlay.DriverContext[4]
Si los IRP no se ponen en cola en la cola de dispositivos asociada al objeto de dispositivo del controlador, el controlador puede usar este campo para almacenar hasta cuatro punteros. Este campo solo se puede usar mientras el controlador posee el IRP.
Tail.Overlay.Thread
Puntero al bloque de control de subprocesos (TCB) del autor de la llamada. En el caso de las solicitudes que se originan en modo de usuario, el administrador de E/S siempre establece este campo para que apunte al TCB del subproceso que emitió la solicitud.
Tail.Overlay.AuxiliaryBuffer
Reservado para uso interno del sistema.
Tail.Overlay.ListEntry
Si un controlador administra sus propias colas internas de IRP, usa este campo para vincular un IRP a la siguiente. Estos vínculos solo se pueden usar mientras el controlador mantiene el IRP en su cola o está procesando el IRP.
Tail.Overlay.CurrentStackLocation
Reservado para uso interno del sistema.
Tail.Overlay.PacketType
Reservado para uso interno del sistema.
Tail.Overlay.OriginalFileObject
Reservado para uso interno del sistema.
Tail.Apc
Reservado para uso interno del sistema.
Tail.CompletionKey
Reservado para uso interno del sistema.
Comentarios
Los miembros no documentados de la estructura IRP están reservados, usados solo por el administrador de E/S o, en algunos casos, por controladores de sistema de archivos (FSD).
IrP es la estructura básica del administrador de E/S que se usa para comunicarse con los controladores y para permitir que los controladores se comuniquen entre sí. Un paquete consta de dos partes diferentes:
Encabezado, o parte fija del paquete: lo usa el administrador de E/S para almacenar información sobre la solicitud original, como los parámetros independientes del dispositivo del autor de la llamada, la dirección del objeto de dispositivo en el que está abierto un archivo, etc. También lo usan los controladores para almacenar información como el estado final de la solicitud.
Ubicaciones de pila de E/S: después del encabezado es un conjunto de ubicaciones de pila de E/S, una por controlador en la cadena de controladores en capas para las que está enlazada la solicitud. Cada ubicación de pila contiene los parámetros, los códigos de función y el contexto utilizados por el controlador correspondiente para determinar lo que se supone que está haciendo. Para obtener más información, consulte la estructura IO_STACK_LOCATION .
Aunque un controlador de nivel superior podría comprobar el valor de Cancel Boolean en un IRP, ese controlador no puede suponer que irP se completará con STATUS_CANCELLED por un controlador de nivel inferior incluso si el valor es TRUE.
Requisitos
Requisito | Valor |
---|---|
Header | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |