Программирование драйверов Windows



Рабочие процедуры обслуживания IOCTL запросов


Запросы данного типа формулируются в рамках двух более гибких типов запросов на ввод/вывод (IRP пакетах). Значение основного кода IRP_MJ_Xxx драйвер может найти в соответствующей ему ячейке стека IRP пакета, a IOCTL код размещен в Parameters.DeviceIoControl.IoControlCode той же ячейки стека IRP пакета.

  • IRP_MJ_DEVICE_CONTROL позволяет получать расширенные запросы от клиентов пользовательского режима посредством их действий через API вызов DeviceIoControl.
  • IRP_MJ_INTERNAL_DEVICE_CONTROL позволяет получать расширенные запросы от кода (клиента), функционирующего на уровне режиме ядра. Доступ к этим операциям из кода пользовательского режима не разрешается. Эта возможность используется, главным образом, другими драйверами в многоуровневом драйверном стеке для передачи специальных запросов. С другой стороны, версия для внутреннего пользования идентична стандартной версии. Значение IoControlCode помещается в IRP пакет инициатором запроса.
  • Следует отметить, что реализация процедуры разборки таких IRP запросов в драйвере требует вторичной диспетчеризации &#8212 в соответствии со значением IoControlCode. Это значение известно еще со времен MS DOS под именем IOCTL

    &#8212 Input/Output ConTroL code.

    Значения IOCTL, передаваемые в драйвер, могут быть определены разработчиком драйвера и имеют фиксированную внутреннюю организацию. Рисунок 8.2 демонстрирует поля 32-битной структуры IOCTL кода. Пакет DDK имеет в своем составе макроопределение CTL_CODE, которое обеспечивает приемлемый механизм генерации значений IOCTL, уже использованный в главе 3. Таблица 8.8 описывает аргументы этого макроопределения.

    Рис. 8.2.

    Структура блока данных IOCTL

    Таблица 8.8. Аргументы макроопределения CTL_CODE

    Параметры Описание
    DeviceType FILE_DEVICE_XXX значения передаваемые в IoCreateDevice

    • 0x0000 &#8212 0x7FFF &#8212 зарезервировано Microsoft

    • 0x8000 &#8212 0xFFFF &#8212 определяется пользователем

    ControlCode Определяемые драйвером IOCTL значения

    • 0x000 &#8212 0x7FF &#8212 зарезервировано Microsoft (public)

    • 0x800 &#8212 0xFFF &#8212 определяется пользователем

    TransferType Способ получения доступа к буферу

    • METHOD_BUFFERED

    • METHOD_IN_DIRECT

    • METHOD_OUT_DIRECT

    • METHOD_NEITHER

    RequiredAccess

    Требования инициатора относительно типа доступа

    • FILE_ANY_ACCESS

    • FILE_READ_DATA

    • FILE_WRITE_DATA

    • FILE_READ_DATA | FILE_WRITE_DATA

    <


    Содержание  Назад  Вперед