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