- •Лекция №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.2.2] Задание кода управления вводом/выводом (ioctl)
Формат кода управления в/в показан на рис. .
Для задания кода в таком формате в заголовочных файлах ntddk.h и windows.h определен специальный макрос CTL_CODE:
CTL_CODE( DeviceType, Function, Method, Access )
Рис. 2. Формат кода
управления в/в
Рассмотрим составляющие кода управления в/в:
Поле DeviceType определяет тип объекта-устройство, которому предназначен запрос. Это тот самый тип устройства, который передается функции IoCreateDevice() при создании устройства. Как уже говорилось, существует два диапазона значений типов устройств: 0-32767 – зарезервированные значения для стандартных типов устройств, 32768-65535 – диапазон значений типов устройств для выбора разработчиком. Следует отметить, что несколько разных устройств могут иметь одинаковое значение типа устройства. Поскольку каждый запрос в/в предназначен конкретному устройству, совпадение типов устройств не приводит к неприятностям. Также необходимо отметить, что тип устройства в коде управления в/в может не совпадать с типом устройства объекта-устройство и это не будет являться ошибкой.
Поле Function идентифицирует конкретные действия, которые должно предпринять устройство при получении запроса. Значения поля Function должны быть уникальны внутри устройства. Как и для типов устройств, существует два диапазона значений поля Function: 0-2047 – зарезервированный диапазон значений, и 2048-4095 – диапазон значений, доступный разработчикам устройств.
Поле Method указывает метод передачи буферов данных. Для понимания этого поля вернемся к функции DeviceIoControl(). Функция передает два буфера – InBuffer и OutBuffer. Буфер InBuffer передает данные драйверу, буфер OutBuffer может передавать данные в обоих направлениях (к драйверу и от драйвера). В следующей таблице приведены возможные значения поля Method и методы передачи буферов InBuffer и OutBuffer.
-
Значение поля Method
Использование OutBuffer
Используемый метод передачи буфера
InBuffer
OutBuffer
METHOD_BUFFERED
Буферизованный в/в (Buffered I/O)
METHOD_IN_DIRECT
Передача данных к драйверу
Буферизованный в/в
Прямой в/в.
Осуществляется проверка буфера на доступ по чтению
METHOD_OUT_DIRECT
Приема данных от драйвера
Буферизованный в/в
Прямой в/в.
Осуществляется проверка буфера на доступ по записи
METHOD_NEITHER
Neither I/O
Местоположение буферов данных в пакете IRP будет рассмотрено в следующем разделе (“Получение буфера”).
Поле Access указывает тип доступа, который должен был быть запрошен (и предоставлен) при открытии объекта-файл, для которого передается данный код Управления вводом-выводом. Возможные значения для этого параметра следующие:
file_any_access. Это значение указывает, что при вызове CreateFile() мог быть запрошен любой доступ.
file_read_access. Это значение указывает, что должен был быть запрошен доступ для чтения.
file_write_access. Это значение указывает, что должен был быть запрошен доступ для записи.
Заметим, что file_read_access и file_write_access могут быть указаны одновременно, чтобы указать, при открытии устройства должен быть предоставлен и доступ на чтение, и доступ на запись.
Параметр Access требуется потому, что операции управления в/в, по своей сути не есть операция чтения или записи. , Прежде, чем будет разрешена запрашиваемая операция в/в, Диспетчер Ввода - вывода должен знать, какой режим доступа нужно проверить в таблице описателей.