IRP-Struktur (wdm.h)
Die IRP--Struktur ist eine teilweise undurchsichtige Struktur, die ein E/A-Anforderungspaketdarstellt. Nicht dokumentierte Member der IRP--Struktur sind reserviert, die nur vom I/O-Manager oder in einigen Fällen von Dateisystemtreibern (FSDs) verwendet werden.
Syntax
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;
Angehörige
Type
Reserviert für die interne Systemverwendung.
Size
Reserviert für die interne Systemverwendung.
MdlAddress
Zeiger auf eine MDL, die einen Benutzerpuffer beschreibt, wenn der Treiber direkte E/A verwendet, und der Hauptfunktionscode für IRP ist einer der folgenden:
IRP_MJ_READ
Die MDL beschreibt einen leeren Puffer, den das Gerät oder der Treiber ausfüllt.
IRP_MJ_WRITE
Die MDL beschreibt einen Puffer, der Daten für das Gerät oder den Treiber enthält.
IRP_MJ_DEVICE_CONTROL oder IRP_MJ_INTERNAL_DEVICE_CONTROL
Wenn der IOCTL-Code den METHOD_IN_DIRECT Übertragungstyp angibt, beschreibt die MDL einen Puffer, der Daten für das Gerät oder den Treiber enthält.
Wenn der IOCTL-Code den METHOD_OUT_DIRECT Übertragungstyp angibt, beschreibt die MDL einen leeren Puffer, den das Gerät oder treiber einfüllt.
Weitere Informationen zu den Puffern, die METHOD_IN_DIRECT zugeordnet sind, und METHOD_OUT_DIRECT Transfertypen in IOCTL-Codes finden Sie unter Pufferbeschreibungen für E/A-Steuerungscodes.
Wenn der Treiber keine direkte E/A verwendet, ist dieser Zeiger NULL-.
Flags
Dateisystemtreiber verwenden dieses Feld, das für alle Treiber schreibgeschützt ist. Netzwerk- und möglicherweise Gerätetreiber der höchsten Ebene können auch dieses Feld lesen. Dieses Feld wird entweder auf Null oder auf das bitweise ODER eines oder mehrerer der folgenden vom System definierten Flagbits festgelegt:
- 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
Reserviert für die interne Systemverwendung.
AssociatedIrp.MasterIrp
Zeiger auf den Master-IRP in einem IRP, der von einem Aufruf des höchsten Treibers an IoMakeAssociatedIrperstellt wurde.
AssociatedIrp.IrpCount
Reserviert für die interne Systemverwendung.
AssociatedIrp.SystemBuffer
Zeiger auf einen Systemraumpuffer.
Wenn der Treiber gepufferte E/A verwendet, wird der Zweck des Puffers wie folgt vom IRP-Hauptfunktionscode bestimmt:
SystemBuffer.IRP_MJ_READ
Der Puffer empfängt Daten vom Gerät oder Treiber. Die Länge des Puffers wird durch Parameters.Read.Length- in der IO_STACK_LOCATION Struktur des Treibers angegeben.
SystemBuffer.IRP_MJ_WRITE
Der Puffer stellt Daten für das Gerät oder den Treiber bereit. Die Länge des Puffers wird durch Parameters.Write.Length in der IO_STACK_LOCATION Struktur des Treibers angegeben.
SystemBuffer.IRP_MJ_DEVICE_CONTROL oder IRP_MJ_INTERNAL_DEVICE_CONTROL
Der Puffer stellt sowohl die Eingabe- als auch ausgabepuffer dar, die für DeviceIoControl- und IoBuildDeviceIoControlRequestbereitgestellt werden. Ausgabedaten überschreiben Eingabedaten.
Für die Eingabe wird die Länge des Puffers durch Parameters.DeviceIoControl.InputBufferLength- in der IO_STACK_LOCATION Struktur des Treibers angegeben.
Für die Ausgabe wird die Länge des Puffers durch Parameters.DeviceIoControl.OutputBufferLength- in der IO_STACK_LOCATION Struktur des Treibers angegeben.
Weitere Informationen finden Sie unter Pufferbeschreibungen für E/A-Steuercodes.
Der Puffer stellt den Eingabepuffer dar, der für DeviceIoControl- und IoBuildDeviceIoControlRequest-bereitgestellt wird.
Die Länge des Puffers wird durch Parameters.DeviceIoControl.InputBufferLength- in der IO_STACK_LOCATION Struktur des Treibers angegeben.
Weitere Informationen finden Sie unter Pufferbeschreibungen für E/A-Steuercodes.
Wenn der Treiber direkte E/A verwendet, wird der Zweck des Puffers wie folgt durch den IRP-Hauptfunktionscode bestimmt:
ThreadListEntry
Reserviert für die interne Systemverwendung.
IoStatus
Enthält die IO_STATUS_BLOCK Struktur, in der ein Treiber Status und Informationen speichert, bevor IoCompleteRequestaufgerufen wird.
RequestorMode
Gibt den Ausführungsmodus des ursprünglichen Anforderers des Vorgangs an, einer von UserMode oder KernelMode-.
PendingReturned
Wenn dieser Wert auf TRUEfestgelegt ist, hat ein Treiber das ausstehende IRP markiert. Jede IoCompletion- Routine sollte den Wert dieses Flags überprüfen. Wenn das Flag TRUEist und wenn die IoCompletion-Routine STATUS_MORE_PROCESSING_REQUIRED nicht zurückgibt, sollte die Routine IoMarkIrpPending aufrufen, um den ausstehenden Status an Treiber darüber im Gerätestapel weiterzuverbreiten.
StackCount
Reserviert für die interne Systemverwendung.
CurrentLocation
Reserviert für die interne Systemverwendung.
Cancel
Wenn dieser Wert auf TRUEfestgelegt ist, wird der IRP entweder abgebrochen oder abgebrochen.
CancelIrql
Enthält die IRQL, bei der ein Treiber ausgeführt wird, wenn IoAcquireCancelSpinLock aufgerufen wird.
ApcEnvironment
Reserviert für die interne Systemverwendung.
AllocationFlags
Reserviert für die interne Systemverwendung.
UserIosb
Reserviert für die interne Systemverwendung.
IoRingContext
Reserviert für die interne Systemverwendung.
UserEvent
Reserviert für die interne Systemverwendung.
Overlay
Reserviert für die interne Systemverwendung.
Overlay.AsynchronousParameters
Reserviert für die interne Systemverwendung.
Overlay.AsynchronousParameters.UserApcRoutine
Reserviert für die interne Systemverwendung.
Overlay.AsynchronousParameters.IssuingProcess
Reserviert für die interne Systemverwendung.
Overlay.AsynchronousParameters.UserApcContext
Reserviert für die interne Systemverwendung.
Overlay.AsynchronousParameters.IoRing
Reserviert für die interne Systemverwendung.
Overlay.AllocationSize
Reserviert für die interne Systemverwendung.
CancelRoutine
Enthält den Einstiegspunkt für eine vom Treiber bereitgestellte Cancel Routine, die aufgerufen werden soll, wenn das IRP abgebrochen wird. NULL- gibt an, dass der IRP zurzeit nicht abgebrochen werden kann.
UserBuffer
Enthält die Adresse eines Ausgabepuffers, wenn beide der folgenden Bedingungen zutreffen:
Der Hauptfunktionscode an der E/A-Stapelposition ist IRP_MJ_DEVICE_CONTROL oder IRP_MJ_INTERNAL_DEVICE_CONTROL.
Der E/A-Steuerelementcode wurde mit METHOD_NEITHER oder METHOD_BUFFERED definiert.
Für METHOD_BUFFERED sollte der Treiber den Puffer verwenden, auf den Irp->AssociatedIrp.SystemBuffer als Ausgabepuffer verweist. Wenn der Treiber die Anforderung abgeschlossen hat, kopiert der E/A-Manager den Inhalt dieses Puffers in den Ausgabepuffer, auf den Irp->UserBuffer-verweist. Der Treiber sollte nicht direkt in den Puffer schreiben, auf den Irp->UserBuffer-verweist. Weitere Informationen finden Sie unter Pufferbeschreibungen für E/A-Steuercodes.
Tail
Reserviert für die interne Systemverwendung.
Tail.Overlay
Reserviert für die interne Systemverwendung.
Tail.Overlay.DeviceQueueEntry
Wenn IRPs in die Gerätewarteschlange eingereiht werden, die dem Geräteobjekt des Treibers zugeordnet ist, verknüpft dieses Feld IRPs in der Gerätewarteschlange. Diese Verknüpfungen können nur verwendet werden, wenn der Treiber das IRP verarbeitet.
Tail.Overlay.DriverContext[4]
Wenn IRPs in der Gerätewarteschlange, die dem Geräteobjekt des Treibers zugeordnet ist, nicht in die Warteschlange eingereiht werden, kann dieses Feld vom Treiber verwendet werden, um bis zu vier Zeiger zu speichern. Dieses Feld kann nur verwendet werden, wenn der Treiber das IRP besitzt.
Tail.Overlay.Thread
Ein Zeiger auf den Threadsteuerungsblock des Aufrufers (TCB). Bei Anforderungen, die im Benutzermodus stammen, legt der E/A-Manager dieses Feld immer so fest, dass es auf den TCB des Threads verweist, der die Anforderung ausgegeben hat.
Tail.Overlay.AuxiliaryBuffer
Reserviert für die interne Systemverwendung.
Tail.Overlay.ListEntry
Wenn ein Treiber seine eigenen internen Warteschlangen von IRPs verwaltet, wird dieses Feld verwendet, um ein IRP mit dem nächsten zu verknüpfen. Diese Verknüpfungen können nur verwendet werden, wenn der Treiber das IRP in der Warteschlange hält oder das IRP verarbeitet.
Tail.Overlay.CurrentStackLocation
Reserviert für die interne Systemverwendung.
Tail.Overlay.PacketType
Reserviert für die interne Systemverwendung.
Tail.Overlay.OriginalFileObject
Reserviert für die interne Systemverwendung.
Tail.Apc
Reserviert für die interne Systemverwendung.
Tail.CompletionKey
Reserviert für die interne Systemverwendung.
Bemerkungen
Nicht dokumentierte Member der IRP-Struktur werden nur vom I/O-Manager oder in einigen Fällen von Dateisystemtreibern (FSDs) verwendet.
Ein IRP ist die grundlegende I/O-Manager-Struktur, die für die Kommunikation mit Treibern verwendet wird, und um treibern die Kommunikation miteinander zu ermöglichen. Ein Paket besteht aus zwei verschiedenen Teilen:
Header-oder fester Teil des Pakets– Dies wird vom E/A-Manager verwendet, um Informationen über die ursprüngliche Anforderung zu speichern, z. B. geräteunabhängige Parameter des Aufrufers, die Adresse des Geräteobjekts, auf dem eine Datei geöffnet ist usw. Es wird auch von Treibern verwendet, um Informationen wie den endgültigen Status der Anforderung zu speichern.
E/A-Stapelspeicherorte – Nach dem Header handelt es sich um eine Reihe von E/A-Stapelspeicherorten, eine pro Treiber in der Kette von layerierten Treibern, für die die Anforderung gebunden ist. Jeder Stapelspeicherort enthält die Parameter, Funktionscodes und den Kontext, der vom entsprechenden Treiber verwendet wird, um zu bestimmen, was er tun soll. Weitere Informationen finden Sie in der IO_STACK_LOCATION Struktur.
Während ein Treiber auf höherer Ebene den Wert der Cancel Boolean in einem IRP überprüfen kann, kann dieser Treiber nicht davon ausgehen, dass der IRP mit STATUS_CANCELLED durch einen Treiber auf niedrigerer Ebene abgeschlossen wird, auch wenn der Wert TRUEist.
Anforderungen
Anforderung | Wert |
---|---|
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |