Структура IRP (wdm.h)

Структура IRP — это частично непрозрачная структура, представляющая пакет запроса ввода-вывода. Незарегистрированные элементы структуры IRP зарезервированы и используются только диспетчером ввода-вывода или в некоторых случаях драйверами файловой системы (FSD).

Синтаксис

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;

Члены

Type

Зарезервировано для внутреннего использования системой.

Size

Зарезервировано для внутреннего использования системой.

MdlAddress

Указатель на MDL, описывающий буфер пользователя, если драйвер использует прямой ввод-вывод, а основной код функции IRP является одним из следующих:

  • IRP_MJ_READ

    MDL описывает пустой буфер, который заполняет устройство или драйвер.

  • IRP_MJ_WRITE

    MDL описывает буфер, содержащий данные для устройства или драйвера.

  • IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL

    Если код IOCTL указывает тип передачи METHOD_IN_DIRECT, MDL описывает буфер, содержащий данные для устройства или драйвера.

Если код IOCTL указывает тип передачи METHOD_OUT_DIRECT, MDL описывает пустой буфер, который заполняет устройство или драйвер.

Дополнительные сведения о буферах, связанных с METHOD_IN_DIRECT и METHOD_OUT_DIRECT типами передачи в кодах IOCTL, см. в разделе Описания буферов для кодов управления вводом-выводом.

Если драйвер не использует прямой ввод-вывод, этот указатель имеет значение NULL.

Flags

Драйверы файловой системы используют это поле, которое доступно только для чтения для всех драйверов. Сетевые и, возможно, высокоуровневые драйверы устройств также могут прочитать это поле. Для этого поля задано значение ноль или побитовое значение ИЛИ одного или нескольких из следующих системных битов флагов:

  • 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

Зарезервировано для внутреннего использования системой.

AssociatedIrp.MasterIrp

Указатель на master IRP в IRP, созданном вызовом драйвера самого высокого уровня к IoMakeAssociatedIrp.

AssociatedIrp.IrpCount

Зарезервировано для внутреннего использования системой.

AssociatedIrp.SystemBuffer

Указатель на буфер системного пространства.

Если драйвер использует буферный ввод-вывод, назначение буфера определяется основным кодом функции IRP следующим образом:

  • SystemBuffer.IRP_MJ_READ

    Буфер получает данные от устройства или драйвера. Длина буфера задается параметром Parameters.Read.Length в структуре IO_STACK_LOCATION драйвера.

  • SystemBuffer.IRP_MJ_WRITE

    Буфер предоставляет данные для устройства или драйвера. Длина буфера задается параметром Parameters.Write.Length в структуре IO_STACK_LOCATION драйвера.

  • SystemBuffer.IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL

    Буфер представляет входные и выходные буферы, предоставляемые DeviceIoControl и IoBuildDeviceIoControlRequest. Выходные данные перезаписывают входные данные.

Для входных данных длина буфера задается параметром Parameters.DeviceIoControl.InputBufferLength в структуре IO_STACK_LOCATION драйвера.

Для выходных данных длина буфера задается параметром Parameters.DeviceIoControl.OutputBufferLength в структуре IO_STACK_LOCATION драйвера.

Дополнительные сведения см. в разделе Описания буфера для кодов управления вводом-выводом.

Буфер представляет входной буфер, предоставляемый DeviceIoControl и IoBuildDeviceIoControlRequest.

Длина буфера задается параметром Parameters.DeviceIoControl.InputBufferLength в структуре IO_STACK_LOCATION драйвера.

Дополнительные сведения см. в разделе Описания буфера для кодов управления вводом-выводом.

Если драйвер использует прямой ввод-вывод, назначение буфера определяется основным кодом функции IRP следующим образом:

ThreadListEntry

Зарезервировано для внутреннего использования системой.

IoStatus

Содержит структуру IO_STATUS_BLOCK , в которой драйвер сохраняет состояние и сведения перед вызовом IoCompleteRequest.

RequestorMode

Указывает режим выполнения исходного инициатора запроса операции( UserMode или KernelMode).

PendingReturned

Если задано значение TRUE, драйвер помечает ожидание IRP. Каждая подпрограмма IoCompletion должна проверка значение этого флага. Если флаг имеет значение TRUE и подпрограмма IoCompletion не возвращает STATUS_MORE_PROCESSING_REQUIRED, подпрограмма должна вызывать IoMarkIrpPending , чтобы распространить состояние ожидания на драйверы, находящиеся над ним в стеке устройств.

StackCount

Зарезервировано для внутреннего использования системой.

CurrentLocation

Зарезервировано для внутреннего использования системой.

Cancel

Если задано значение TRUE, IRP имеет значение или должно быть отменено.

CancelIrql

Содержит IRQL, в котором выполняется драйвер при вызове IoAcquireCancelSpinLock .

ApcEnvironment

Зарезервировано для внутреннего использования системой.

AllocationFlags

Зарезервировано для внутреннего использования системой.

UserIosb

Зарезервировано для внутреннего использования системой.

IoRingContext

Зарезервировано для внутреннего использования системой.

UserEvent

Зарезервировано для внутреннего использования системой.

Overlay

Зарезервировано для внутреннего использования системой.

Overlay.AsynchronousParameters

Зарезервировано для внутреннего использования системой.

Overlay.AsynchronousParameters.UserApcRoutine

Зарезервировано для внутреннего использования системой.

Overlay.AsynchronousParameters.IssuingProcess

Зарезервировано для внутреннего использования системой.

Overlay.AsynchronousParameters.UserApcContext

Зарезервировано для внутреннего использования системой.

Overlay.AsynchronousParameters.IoRing

Зарезервировано для внутреннего использования системой.

Overlay.AllocationSize

Зарезервировано для внутреннего использования системой.

CancelRoutine

Содержит точку входа для предоставленной драйвером процедуры отмены , вызываемой при отмене IRP. Значение NULL указывает, что IRP в настоящее время не может быть отменен.

UserBuffer

Содержит адрес выходного буфера, если применяются оба следующих условия:

  • Основной код функции в расположении стека ввода-вывода — это IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL.

  • Код элемента управления вводом-выводом был определен с помощью METHOD_NEITHER или METHOD_BUFFERED.

Для METHOD_BUFFERED драйвер должен использовать буфер, на который указывает Irp-AssociatedIrp.SystemBuffer>, в качестве выходного буфера. Когда драйвер завершает запрос, диспетчер ввода-вывода копирует содержимое этого буфера в выходной буфер, на который указывает Irp-UserBuffer>. Драйвер не должен выполнять запись непосредственно в буфер, на который указывает Irp-UserBuffer>. Дополнительные сведения см. в разделе Описания буфера для кодов управления вводом-выводом.

Tail

Зарезервировано для внутреннего использования системой.

Tail.Overlay

Зарезервировано для внутреннего использования системой.

Tail.Overlay.DeviceQueueEntry

Если поставщики irP помещаются в очередь устройств, связанную с объектом устройства драйвера, это поле связывает IRP в очереди устройств. Эти ссылки можно использовать только во время обработки драйвером IRP.

Tail.Overlay.DriverContext[4]

Если поставщики irP не помещаются в очередь устройств, связанной с объектом устройства драйвера, это поле может использоваться драйвером для хранения до четырех указателей. Это поле можно использовать только в том случае, если драйвер является владельцем IRP.

Tail.Overlay.Thread

Указатель на блок управления потоком (TCB) вызывающего абонента. Для запросов, которые исходят в пользовательском режиме, диспетчер ввода-вывода всегда задает это поле так, чтобы оно указывало на TCB потока, выдавшего запрос.

Tail.Overlay.AuxiliaryBuffer

Зарезервировано для использования во внутренней системе.

Tail.Overlay.ListEntry

Если драйвер управляет собственными внутренними очередями IRP, он использует это поле для связывания одного IRP со следующим. Эти ссылки можно использовать, только когда драйвер держит IRP в очереди или обрабатывает IRP.

Tail.Overlay.CurrentStackLocation

Зарезервировано для использования во внутренней системе.

Tail.Overlay.PacketType

Зарезервировано для использования во внутренней системе.

Tail.Overlay.OriginalFileObject

Зарезервировано для использования во внутренней системе.

Tail.Apc

Зарезервировано для использования во внутренней системе.

Tail.CompletionKey

Зарезервировано для использования во внутренней системе.

Комментарии

Незарегистрированные элементы структуры IRP зарезервированы и используются только диспетчером ввода-вывода или в некоторых случаях драйверами файловой системы (FSD).

IRP — это базовая структура диспетчера ввода-вывода, используемая для взаимодействия с водителями и предоставления водителям возможности взаимодействия друг с другом. Пакет состоит из двух разных частей:

  • Заголовок или фиксированная часть пакета— используется диспетчером ввода-вывода для хранения сведений об исходном запросе, таких как независимые от устройства параметры вызывающего объекта, адрес объекта устройства, на котором открыт файл, и т. д. Он также используется драйверами для хранения сведений, таких как окончательное состояние запроса.

  • Расположения стека ввода-вывода . За заголовком следует набор расположений стека ввода-вывода, по одному на каждый драйвер в цепочке многоуровневых драйверов, к которым привязан запрос. Каждое расположение стека содержит параметры, коды функций и контекст, используемые соответствующим драйвером для определения того, что он должен делать. Дополнительные сведения см. в разделе структура IO_STACK_LOCATION .

Хотя драйвер более высокого уровня может проверка значение логического значения Cancel в IRP, этот драйвер не может предполагать, что IRP будет завершен с STATUS_CANCELLED драйвером более низкого уровня, даже если значение true.

Требования

Требование Значение
Заголовок wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)

См. также раздел