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:

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)

Consulte también