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

Пакет запроса ввода/вывода (IRP)

Описание буфера данных

Описатель для буфера данных инициатора запроса находится в фиксированной части IRP. Для осуществления операции ввода/вывода NT предусматривает три различных метода передачи буфера данных, принадлежащего инициатору запроса:

  • Прямой Ввод/вывод (Direct I/O).
    Буфер находится в виртуальном адресном пространстве инициатора запроса. Для передачи буфера драйверу Диспетчер ввода/вывода создает таблицу описания памяти (MDL), описывающую размещение буфера в физической памяти.
  • Буферизированный Ввод/вывод (Buffered I/O).
    Для передачи буфера драйверу Диспетчер ввода/вывода создает в невыгружаемой системной памяти копию первоначального буфера. Драйверу передается указатель на этот новый буфер. Выделенная память будет освобождена Диспетчером ввода/вывода при завершении запроса ввода/вывода.
  • Никакой" Ввод/вывод (Neither I/O).
    В драйвер передается виртуальный адрес буфера инициатора запроса.

Коды функции Ввода/вывода и lOCTLs освещены более подробно ниже.

Таблица 6. Характеристики Прямого ввода/вывода, Буферизованного ввода/вывода i и "никакого" ввода/вывода.

  Прямой ввод/вывод (Direct I/O) Буферизованный ввод/вывод (Buffered I/O) "Никакой" ввод/вывод (Neither I/O)
Буфер инициатора запроса Описывается с помощью MDL Скопирован во временный буфер в невыгружаемой системной памяти Описывается виртуальным адресом инициатора запроса
Состояние буфера инициатора запроса в процессе обработки запроса ввода/вывода Буфер блокирован в памяти Диспетчером ввода/вывода Буфер не блокирован Буфер не блокирован
Описание буфе ра в IRP Irp › MdlAddress содержит указатель Irp › Associate – dlrp.SystemBuffer содержит виртуальный адрес временного буфера в системной области памяти в области невыгружаемой памяти (nonpaged pool) Irp › UserBuffer содержит не проверенный на доступность виртуальный адрес буфера инициатора запроса ввода/вывода
Контекст, при котором буфер может быть использован Случайный контекст Случайный контекст Только контекст потока – инициатора запроса
Уровень IRQL, в котором буфер может быть использован IRQL<DISPATCH_LEVEL Любой IRQL < DISPATCH_LEVEL

Для описания всех запросов чтения и записи, которые посылаются конкретному устройству, после создания объекта-устройства в его поле Flags Диспетчеру ввода/вывода должен быть указан единственный метод для использования. Однако для каждого кода Управления Вводом/выводом Устройства (I/O Control Code, IOCTL), поддерживаемого драйвером, может использоваться любой другой метод.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.