Поделиться через


Структура 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

Указатель на главный 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

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

Tail.Overlay.DriverContext[4]

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

Tail.Overlay.Thread

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

Tail.Overlay.AuxiliaryBuffer

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

Tail.Overlay.ListEntry

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

Tail.Overlay.CurrentStackLocation

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

Tail.Overlay.PacketType

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

Tail.Overlay.OriginalFileObject

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

Tail.Apc

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

Tail.CompletionKey

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

Замечания

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

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

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

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

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

Требования

Требование Ценность
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

См. также