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:
Il codice della funzione principale nella posizione dello stack di I/O è IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL.
Il codice di controllo di I/O è stato definito con METHOD_NEITHER o METHOD_BUFFERED.
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) |