Самоучитель по программированию систем защиты

       

Формат кода управления вводом/выводом



Рисунок 11. Формат кода управления вводом/выводом


CTL_CODE( DeviceType, Function, Method, Access ) - специальный макрос, определенный в заголовочных файлах ntddk.h и windows.h, для задания кода в формате, представленном на Рисунок 11.

Рассмотрим составляющие кода управления вйода/вывода:

  • 1. Поле DeviceType определяет тип объекта-устройства, которому предназначен запрос. Это тот самый тип устройства, который передается функции IoCreateDevice()

    при создании устройства. Как уже говорилось, существует два диапазона значений типов устройств: 0-32767 - зарезервированные значения для стандартных типов устройств, 32768-65535 — диапазон значений типов устройств для выбора разработчиком. Следует отметить, что несколько разных устройств могут иметь одинаковое значение типа устройства. Поскольку каждый запрос ввода/вывода предназначен конкретному устройству, совпадение типов устройств не приводит к неприятностям. Также необходимо отметить, что тип устройства в коде управления ввода/вывода может не совпадать с типом устройства объекта-устройства, и это не будет являться ошибкой.

    2. Поле Function идентифицирует конкретные действия, которые должно предпринять устройство при получении запроса/Значения поля Function должны быть уникальны внутри устройства. Как и для типов устройств, существует два диапазона значений поля Function: 0-2047 — зарезервированный диапазон значений, и 2048-4095 — диапазон значений, доступный разработчикам устройств.

    3. Поле Method указывает метод передачи буферов данных. Для понимания этого поля вернемся к функции DeviceloControl(). Функция передает два буфера - InBuffer и OutBuffer. Буфер InBuffer передает данные драйверу, буфер OutBuffer может передавать данные в обоих направлениях (к драйверу и от драйвера).

  • В следующей таблице приведены возможные значения поля Method и методы пе-J редачи буферов InBuffer и OutBuffer:

    Значение поля Method

    Использование OutBuffer



    Используемый метод передачи буфера

    InBuffer

    OutBuffer

    METHOD BUFFERED

    Буферизованный ввод/вывод (Buffered I/O)

    METHOD_IN_DIRECT

    Передача данных к драйверу

    Буферизованный ввод/вывод

    Прямой ввод/вывод. Осуществляется про- верка буфера на дос- туп по чтению

    METHODJDUTJDIRECT

    Приема данных от драйвера

    Буферизованный ввод/вывод

    Прямой ввод/вывод. Осуществляется про- верка буфера на дос- туп по записи

    METHOD NEITHER

    Neither I/O

    <

    Содержание раздела