Freigeben über


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:

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)

Siehe auch