- •Лекция №7-8. Подсистема в/в. Пакеты запросов ввода/вывода (irp). [7.1] Подсистема в/в и её характеристики.
- •[7.2] Структура irp
- •[7.2.1] Поля в Фиксированной части irp.
- •[7.2.2.] Поля в Стеке размещения Ввода - вывода irp.
- •[7.3] Описание Буфера Данных
- •[7.4] Коды Функции Ввода - вывода
- •[8.1] Передача данных посредством irp и диспетчерские точки входа драйвера
- •[8.1.1] Запросы чтения и записи irp_mj_read и irp_mj_write [8.1.1.1] Определение метода передачи буфера для запросов чтения-записи
- •[8.1.1.2] Получение буфера
- •[8.1.1.3] Завершение запроса в/в
- •[8.1.1.4] Пример обработки запросов чтения/записи
- •[8.1.2.1] Пояснения по использованию
- •[8.1.2.2] Задание кода управления вводом/выводом (ioctl)
- •[8.1.2.3] Получение буфера
- •[8.1.2.4] Завершение запроса в/в
- •[8.1.2.5] Пример обработки
[8.1] Передача данных посредством 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.
[8.1.1] Запросы чтения и записи irp_mj_read и irp_mj_write [8.1.1.1] Определение метода передачи буфера для запросов чтения-записи
Метод передачи буфера, используемый в запросах чтения и записи, контролируется полем Flags объекта-устройство. После создания объекта-устройство с помощью функции IoCreateDevice() необходимо инициализировать это поле. Поле может иметь установленными несколько флагов, при этом применяются следующие правила:
Если установлены флаги DO_BUFFERED_IO или DO_DIRECT_IO, метод передачи буфера будет соответственно буферизованным или прямым
Если поле флагов не инициализировано (никакие флаги не установлены), используется метод передачи буфера Neither (никакой в/в).
Одновременная установка флагов DO_BUFFERED_IO и DO_DIRECT_IO запрещена и будет являться ошибкой.
Установленный полем Flags метод передачи будет использован и запросом чтения, и запросом записи.
[8.1.1.2] Получение буфера
Расположение буфера в зависимости от метода его передачи для запросов чтения и записи полностью определяется таблицей 1.