Описание буфера данных
Описатель для буфера данных инициатора запроса находится
в фиксированной части 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 содержит виртуальный адрес временно- го буфера
в системной области памяти в области невыгру жаемой памяти (non-
paged pool)
|
Irp->UserBuffer
содержит не проверенный на доступ- ность виртуальный адрес буфера
ини- циатора запроса ввода/вывода
|
Контекст,
при котором буфер может быть ис- пользован
|
Случайный
кон текст
|
Случайный
контекст
|
Только
контекст потока - инициатора запроса
|
Уровень
IRQL, ipn котором буфер может быть использован
|
IRQL<DIS-
PATCH_LEVEL
|
Любой
|
IRQL <
DIS- PATCH_LEVEL
|
Для описания всех запросов чтения и записи, которые посылаются конкретному
устройству, после создания объекта-устройства в его поле Flags Диспетчеру
ввода/
вывода должен быть указан единственный метод для использования. Однако
для каждого кода Управления Вводом/выводом Устройства (I/O Control Code,
IOCTL), поддерживаемого драйвером, может использоваться любой другой метод.
|