Определение метода передачи буфера для запросов чтения-записи

Запросы чтения и записи 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 метод передачи будет использован и запросом чтения, и запросом записи.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: