Запросы чтения и записи IRP_MJ_READ и IRP_MJ_WRITE
Передача данных посредством IRP и диспетчерские точки входа драйвера
Информация, требуемая для выполнения запроса в/в содержится в различных элементах как фиксированной части IRP, так и стека размещения в/в. Рассмотрим эти элементы.
В стеке размещения в/в в поле Parameters передается
Структура поля Parameters зависит от кода главной и второстепенной функции в/в. Нас в основном будет интересовать структура поля Parameters для запросов чтения, записи и пользовательских запросов в/в:
· irp_mj_read. Параметры для этого функционального кода содержат следующее:
· Parameters.Read.Length. ULONG, содержит размер в байтах буфера инициатора запроса.
· Parameters.Read.Key. ULONG, содержит ключевое значение, которое нужно использовать при чтении. Обычно представляет интерес только для драйверов файловой системы.
· Parameters.Read.ByteOffset. LARGE_INTEGER, содержит смещение (обычно в файле), с которого должна начаться операция чтения.
· irp_mj_write. Параметры для этого функционального кода следующие:
|
|
· Parameters.Write.Length. ULONG, содержит размер в байтах буфера инициатора запроса.
· Parameters.Write.Key. ULONG, содержит ключевое значение, которое нужно использовать при записи. Обычно представляет интерес только для драйверов файловой системы.
· Parameters.Write.ByteOffset. LARGE_INTEGER, содержит смещение (обычно в файле) с которого должна начаться операция записи.
· irp_mj_device_control. Параметры для этого функционального кода следующие:
· Parameters.DeviceIoControl.OutputBufferLength. ULONG, содержит длину в байтах буфера OutBuffer.
· Parameters.DeviceIoControl.InputBufferLength. ULONG, содержит длину в байтах буфера InBuffer.
· Parameters. DeviceIoControl.ControlCode. ULONG, содержит код управления вводом-выводом, идентифицирующий запрашиваемую функцию управления устройством. Этот управляющий код обычно предварительно определен драйвером с использованием макрокоманды ctl_code.
· Parameters.DeviceIoControl.Type3InputBuffer. PVOID, содержит виртуальный адрес буфера инициатора запроса InBuffer (см. функцию Win32 API DeviceIoControl()). Адрес обычно используется только тогда, когда IOCTL использует method_neither.
Метод передачи буфера, используемый в запросах чтения и записи, контролируется полем Flags объекта-устройство. После создания объекта-устройство с помощью функции IoCreateDevice() необходимо инициализировать это поле. Поле может иметь установленными несколько флагов, при этом применяются следующие правила:
· Если установлены флаги DO_BUFFERED_IO или DO_DIRECT_IO, метод передачи буфера будет соответственно буферизованным или прямым
· Если поле флагов не инициализировано (никакие флаги не установлены), используется метод передачи буфера Neither (никакой в/в).
· Одновременная установка флагов DO_BUFFERED_IO и DO_DIRECT_IO запрещена и будет являться ошибкой.
· Установленный полем Flags метод передачи будет использован и запросом чтения, и запросом записи.