Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect7_8.doc
Скачиваний:
0
Добавлен:
15.09.2019
Размер:
181.76 Кб
Скачать

[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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]