Коды Функции Ввода - вывода

Описание Буфера Данных

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

· Прямой Ввод – вывод (Direct I/O). Буфер находится в виртуальном адресном пространстве инициатора запроса. Для передачи буфера драйверу Диспетчер в/в создает таблицу описания памяти (MDL), описывающую размещение буфера в физической памяти.

· Буферизированный Ввод – вывод (Buffered I/O). Для передачи буфера драйверу Диспетчер в/в создает в невыгружаемой системной памяти копию первоначального буфера. Драйверу передается указатель на этот новый буфер. Выделенная память будет освобождена Диспетчером в/в при завершении запроса в/в.

· Никакой Ввод – вывод (Neither I/O). В драйвер передается виртуальный адрес буфера инициатора запроса.

Для описания всех запросов чтения и записи, которые посылаются конкретному устройству, после создания объекта-устройство в его поле Flags Диспетчеру в/в должен быть указан единственный метод для использования.

Однако для каждого кода Управления Ввода-вывода Устройства (IOCTL), поддерживаемого драйвером, может использоваться любой другой метод. Коды функции Ввода - вывода и IOCTLs освещены более подробно позже.

Таблица 1. Характеристики Прямого в/в, Буферизованного в/в, и “никакого” в/в.

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

NT использует коды функции в/в для определения конкретной операции в/в, которая будет иметь место для конкретного объекта-файл. Коды функции в/в Windows NT разделены на коды главной и второстепенной функции в/в. Оба кода находятся в IRP в Стеке размещения Ввода - вывода драйвера. Главные функциональные коды определены символами, обозначенными IRP_MJ_. Перечислим некоторые из главных кодов функции в/в:

· IRP_MJ_CREATE. Этот главный функциональный код соответствует созданию нового объекта-файл, либо при обращении к существующему устройству или файлу, либо при создании нового файла. Этот функциональный код представляет запросы, идущие через функцию Win32 CreateFile() или базовый системный сервис NT NtCreateFile().

· IRP_MJ_CLOSE. Этот главный функциональный код соответствует уничтожению предварительно созданного объекта-файл. Этот функциональный код представляет запросы, идущие через функцию Win32 CloseHandle() или базовый системный сервис NT NtClose(). К появлению этого запроса в/в может привести не каждый вызов CloseHandle(), т.к. на соответствующий файловый объект могут ссылаться другие, еще не закрытые описатели. Объект не может быть уничтожен, пока для него есть описатели. Кроме того, для каждого объекта диспетчер объектов ведет подсчет ссылок, и объект не может быть уничтожен, пока его число ссылок не равно нулю.

· IRP_MJ_READ. Этот главный функциональный код выполняет операцию чтения для существующего объекта-файл. Этот функциональный код представляет запросы, идущие через функцию Win32 ReadFile() или базовый системный сервис NT NtReadFile().

· IRP_MJ_WRITE. Этот главный функциональный код выполняет операцию записи для существующего объекта-файл. Этот функциональный код представляет запросы, идущие через функцию Win32 WriteFile() или системный сервис NtWriteFile().

· IRP_MJ_DEVICE_CONTROL. Этот главный функциональный код выполняет определенную драйвером функцию для существующего объекта-файл. Этот функциональный код представляет запросы, идущие через функцию Win32 DeviceIoControl() или базовый системный сервис NT NtDeviceIoControlFile().

· IRP_MJ_INTERNAL_DEVICE_CONTROL. Этот главный функциональный код выполняет определенную драйвером функцию для существующего объекта-файл. Никаких API уровня пользователя, соответствующих этой функции, нет. Эта функция используется, когда один драйвер посылает запрос в/в другому драйверу.

· IRP_MJ_SHUTDOWN. Этот код направляется драйверу перед выгрузкой ОС.

· IRP_MJ_CLEANUP. Этот код направляется драйверу, когда

Замечание.

Законченный список кодов функции в/в представлен в NTDDK.H.

Второстепенные коды функции в/в в NT определены символами, которые начинаются с IRP_MN_. NT обычно избегает использование второстепенных функциональных кодов для перезагрузки главной функции для драйверов устройства, приветствуя вместо этого использование Кодов Управления вводом-выводом (I/O Control Сodes). Поэтому, почти все IRP, полученные драйверами устройства, имеют второстепенный функциональный код IRP_MN_NORMAL (который имеет значение 0x00). Вообще, второстепенные коды функции I/O используются исключительно файловыми системами и сетевыми транспортами. Например, одним из второстепенных кодов функции в/в, специфичным для файловой системы, является irp_mn_compressed, указывающий, что данные должны быть записаны на том в сжатом формате.

Главные и второстепенные коды функции в/в, связанные с конкретным IRP, сохранены в полях MajorFunction и MinorFunction текущего Стека размещения Ввода - вывода в IRP. На эти поля можно ссылаться, как показано в Примере 1.

Пример 1. Проверка главных и второстепенных функциональных кодов IRP.

IoStack = IoGetCurrentIrpStackLocation(Irp);

if (IoStack->MajorFunction == IRP_MJ_READ)

{

if (IoStack->MinorFunction == IRP_MN_NORMAL)

{

// что-то делать

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: