I/O request packet
В этой статье может быть слишком много ссылок на другие статьи, и, возможно, их количество нужно сократить. |
IRP-Пакет (англ. I/O request packet) — структура данных ядра Windows, обеспечивающая обмен данными между приложениями и драйвером, а также между драйверами.
Общий обзор механизма IRP
[править | править код]С точки зрения архитектуры любой драйвер выступает как участник процесса ввода-вывода. Причём независимо от того, является ли он драйвером устройства ввода-вывода на самом деле. Также в архитектуре Windows запрещено прямое взаимодействие программы пользовательского уровня и драйвера. Оно сводится к тому, что программа посылает код IOCTL, который уже приводит к тому, что диспетчер ввода-вывода формирует на основе неё IRP-пакет. В самом драйвере определены функции, реагирующие на определённый тип запроса в IRP-пакете.
Как правило, ZwReadFile/ZwWriteFile/ZwDeviceIoControlFile реализованы, как формирование и заполнение IRP и отправка IRP требуемому объекту «устройство» (device object). Единственное исключение — так называемый механизм FastIo, используемый в реализации TCP/IP стека и в файловых системах, использующих Cache Manager. FastIo не требует создания и заполнения IRP, но не поддерживает остановку нити с ожиданием — в этом случае реализация обработчика FastIo обязана вернуть FALSE, что означает «FastIo не поддерживается для данной операции, требуется IRP». Также FastIo не поддерживает асинхронный ввод-вывод (негде хранить контекст).
Механизм IRP немедленно дает поддержку асинхронного ввода-вывода. Если операция не может быть исполнена немедленно без ожидания — то, согласно рекомендациям Microsoft, драйвер обязан пометить данный IRP как «в процессе выполнения», сохранить его в некоем контейнере (обычно списке, в IRP для этого есть поле Tail.Overlay.ListEntry) до тех пор, пока операция сможет быть исполнена, и вернуть STATUS_PENDING. В IRP есть массив из четырех указателей PVOID DriverContext[4], который может при этом использоваться для хранения контекста исполнения запроса в данном драйвере.
Таким образом, для драйвера любой (кроме FastIo) ввод-вывод является асинхронным.
В некоторых случаях, а именно:
- файл, открытый без флага overlapped — все операции превращаются в синхронные ожиданием в ZwRead/Write/DeviceIoControlFile
- inherently synchronous operations, то есть операции, для которых в Win32 не предусмотрен асинхронный режим
— можно разрешить драйверу останавливать нить (KeWaitForSingleObject и все то, что вызывает данный вызов внутри себя) в обработчике ввода-вывода. Для проверки, можно ли останавливаться, драйвер должен вызвать IoIsOperationSynchronous (проверяет на два выше приведенных случая).
Структура IRP-пакета
[править | править код]IRP-пакет включает в себя две части: постоянную и стек ввода-вывода. В первой части хранится та информация, которая не меняется при передаче по стеку устройств или не требует своего сохранения при передаче[1]. Стек устройств — это набор устройств, которые обработают данный IRP-пакет. Причём по стеку этот пакет передается последовательно от устройства к устройству.
Примечания
[править | править код]- ↑ Структура пакета запроса ввода-вывода (IRP) | Общая архитектура Windows NT | Статьи | Программирование Realcoding.Net — Программирование C++, Delphi, C#, .NET, базы данных, ст … Дата обращения: 31 июля 2010. Архивировано из оригинала 9 марта 2011 года.
Это заготовка статьи о Windows. Помогите Википедии, дополнив её. |