Struttura IRP (wdm.h)

La struttura IRP è una struttura parzialmente opaca che rappresenta un pacchetto di richiesta di I/O. I membri non documentati della struttura IRP sono riservati, usati solo dal gestore di I/O o, in alcuni casi, dai driver del file system (FSD).

Sintassi

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;

Members

Type

Riservato per l'uso interno del sistema.

Size

Riservato per l'uso interno del sistema.

MdlAddress

Puntatore a un MDL che descrive un buffer utente, se il driver usa I/O diretto e il codice della funzione principale di IRP è uno dei seguenti:

  • IRP_MJ_READ

    Il linguaggio MDL descrive un buffer vuoto compilato dal dispositivo o dal driver.

  • IRP_MJ_WRITE

    MDL descrive un buffer che contiene dati per il dispositivo o il driver.

  • IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL

    Se il codice IOCTL specifica il tipo di trasferimento METHOD_IN_DIRECT, MDL descrive un buffer che contiene dati per il dispositivo o il driver.

Se il codice IOCTL specifica il tipo di trasferimento METHOD_OUT_DIRECT, MDL descrive un buffer vuoto compilato dal dispositivo o dal driver.

Per altre informazioni sui buffer associati a METHOD_IN_DIRECT e METHOD_OUT_DIRECT tipi di trasferimento nei codici IOCTL, vedere Descrizioni dei buffer per i codici di controllo I/O.

Se il driver non usa I/O diretto, questo puntatore è NULL.

Flags

I driver del file system usano questo campo, che è di sola lettura per tutti i driver. Anche la rete e, possibilmente, i driver di dispositivo di livello più alto potrebbero leggere questo campo. Questo campo viene impostato su zero o sull'OR bit per bit di uno o più dei bit di flag definiti dal sistema seguenti:

  • 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

Riservato per l'uso interno del sistema.

AssociatedIrp.MasterIrp

Puntatore all'IRP master in un IRP creato da una chiamata del driver di livello più alto a IoMakeAssociatedIrp.

AssociatedIrp.IrpCount

Riservato per l'uso interno del sistema.

AssociatedIrp.SystemBuffer

Puntatore a un buffer dello spazio di sistema.

Se il driver usa operazioni di I/O memorizzate nel buffer, lo scopo del buffer è determinato dal codice della funzione principale di IRP, come indicato di seguito:

  • SystemBuffer.IRP_MJ_READ

    Il buffer riceve i dati dal dispositivo o dal driver. La lunghezza del buffer viene specificata da Parameters.Read.Length nella struttura IO_STACK_LOCATION del driver.

  • SystemBuffer.IRP_MJ_WRITE

    Il buffer fornisce i dati per il dispositivo o il driver. La lunghezza del buffer viene specificata da Parameters.Write.Length nella struttura IO_STACK_LOCATION del driver.

  • SystemBuffer.IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL

    Il buffer rappresenta sia i buffer di input che di output forniti a DeviceIoControl e IoBuildDeviceIoControlRequest. I dati di output sovrascrivono i dati di input.

Per l'input, la lunghezza del buffer viene specificata da Parameters.DeviceIoControl.InputBufferLength nella struttura IO_STACK_LOCATION del driver.

Per l'output, la lunghezza del buffer viene specificata da Parameters.DeviceIoControl.OutputBufferLengthnella struttura IO_STACK_LOCATION del driver.

Per altre informazioni, vedere Descrizioni del buffer per i codici di controllo di I/O.

Il buffer rappresenta il buffer di input fornito a DeviceIoControl e IoBuildDeviceIoControlRequest.

La lunghezza del buffer viene specificata da Parameters.DeviceIoControl.InputBufferLength nella struttura IO_STACK_LOCATION del driver.

Per altre informazioni, vedere Descrizioni del buffer per i codici di controllo di I/O.

Se il driver usa operazioni di I/O dirette, lo scopo del buffer è determinato dal codice della funzione principale di IRP, come indicato di seguito:

ThreadListEntry

Riservato per l'uso interno del sistema.

IoStatus

Contiene la struttura IO_STATUS_BLOCK in cui un driver archivia lo stato e le informazioni prima di chiamare IoCompleteRequest.

RequestorMode

Indica la modalità di esecuzione del richiedente originale dell'operazione, uno di UserMode o KernelMode.

PendingReturned

Se è impostata su TRUE, un driver ha contrassegnato l'IRP in sospeso. Ogni routine IoCompletion deve controllare il valore di questo flag. Se il flag è TRUE e se la routine IoCompletion non restituirà STATUS_MORE_PROCESSING_REQUIRED, la routine deve chiamare IoMarkIrpPending per propagare lo stato in sospeso ai driver sopra di esso nello stack di dispositivi.

StackCount

Riservato per l'uso interno del sistema.

CurrentLocation

Riservato per l'uso interno del sistema.

Cancel

Se è impostato su TRUE, l'IRP è o deve essere annullato.

CancelIrql

Contiene l'IRQL in cui viene eseguito un driver quando viene chiamato IoAcquireCancelSpinLock .

ApcEnvironment

Riservato per l'uso interno del sistema.

AllocationFlags

Riservato per l'uso interno del sistema.

UserIosb

Riservato per l'uso interno del sistema.

IoRingContext

Riservato per l'uso interno del sistema.

UserEvent

Riservato per l'uso interno del sistema.

Overlay

Riservato per l'uso interno del sistema.

Overlay.AsynchronousParameters

Riservato per l'uso interno del sistema.

Overlay.AsynchronousParameters.UserApcRoutine

Riservato per l'uso interno del sistema.

Overlay.AsynchronousParameters.IssuingProcess

Riservato per l'uso interno del sistema.

Overlay.AsynchronousParameters.UserApcContext

Riservato per l'uso interno del sistema.

Overlay.AsynchronousParameters.IoRing

Riservato per l'uso interno del sistema.

Overlay.AllocationSize

Riservato per l'uso interno del sistema.

CancelRoutine

Contiene il punto di ingresso per una routine Cancel fornita dal driver da chiamare se l'IRP viene annullato. NULL indica che l'IRP non è attualmente annullabile.

UserBuffer

Contiene l'indirizzo di un buffer di output se si applicano entrambe le condizioni seguenti:

Per METHOD_BUFFERED, il driver deve usare il buffer a cui punta Irp-AssociatedIrp.SystemBuffer> come buffer di output. Quando il driver completa la richiesta, il gestore di I/O copia il contenuto di questo buffer nel buffer di output a cui punta Irp-UserBuffer>. Il driver non deve scrivere direttamente nel buffer a cui punta Irp-UserBuffer>. Per altre informazioni, vedere Descrizioni del buffer per i codici di controllo di I/O.

Tail

Riservato per l'uso interno del sistema.

Tail.Overlay

Riservato per l'uso interno del sistema.

Tail.Overlay.DeviceQueueEntry

Se i runtime di integrazione vengono accodati nella coda del dispositivo associata all'oggetto dispositivo del driver, questo campo collega i provider di integrazione nella coda del dispositivo. Questi collegamenti possono essere usati solo durante l'elaborazione dell'IRP da parte del driver.

Tail.Overlay.DriverContext[4]

Se i runtime di integrazione non vengono accodati nella coda del dispositivo associata all'oggetto dispositivo del driver, questo campo può essere usato dal driver per archiviare fino a quattro puntatori. Questo campo può essere usato solo mentre il driver è proprietario dell'IRP.

Tail.Overlay.Thread

Puntatore al blocco di controllo thread (TCB) del chiamante. Per le richieste che hanno origine in modalità utente, il gestore di I/O imposta sempre questo campo in modo che punti al TCB del thread che ha emesso la richiesta.

Tail.Overlay.AuxiliaryBuffer

Riservato per l'uso interno del sistema.

Tail.Overlay.ListEntry

Se un driver gestisce le proprie code interne di provider di integrazione, usa questo campo per collegare un IRP alla successiva. Questi collegamenti possono essere usati solo quando il driver mantiene l'IRP nella coda o elabora l'IRP.

Tail.Overlay.CurrentStackLocation

Riservato per l'uso interno del sistema.

Tail.Overlay.PacketType

Riservato per l'uso interno del sistema.

Tail.Overlay.OriginalFileObject

Riservato per l'uso interno del sistema.

Tail.Apc

Riservato per l'uso interno del sistema.

Tail.CompletionKey

Riservato per l'uso interno del sistema.

Commenti

I membri non documentati della struttura IRP sono riservati, usati solo dal gestore di I/O o, in alcuni casi, dai driver del file system (FSD).

Un IRP è la struttura di gestione di I/O di base usata per comunicare con i driver e consentire ai driver di comunicare tra loro. Un pacchetto è costituito da due parti diverse:

  • Intestazione o parte fissa del pacchetto: viene usata dal gestore di I/O per archiviare informazioni sulla richiesta originale, ad esempio i parametri indipendenti dal dispositivo del chiamante, l'indirizzo dell'oggetto dispositivo su cui è aperto un file e così via. Viene usato anche dai driver per archiviare informazioni come lo stato finale della richiesta.

  • Percorsi dello stack di I/O : seguendo l'intestazione è presente un set di percorsi dello stack di I/O, uno per ogni driver nella catena di driver a più livelli per cui è associata la richiesta. Ogni posizione dello stack contiene i parametri, i codici di funzione e il contesto usati dal driver corrispondente per determinare cosa deve fare. Per altre informazioni, vedere la struttura IO_STACK_LOCATION .

Anche se un driver di livello superiore potrebbe controllare il valore di Annulla valore booleano in un IRP, tale driver non può presupporre che L'IRP venga completato con STATUS_CANCELLED da un driver di livello inferiore anche se il valore è TRUE.

Requisiti

Requisito Valore
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

Vedi anche