Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000377.doc
Скачиваний:
29
Добавлен:
30.04.2022
Размер:
2.52 Mб
Скачать

Объект пакет запроса ввода-вывода

Объект пакет запроса ввода-вывода представлен в системе экземпляром структуры IRP. Отметим некоторые поля этой структуры:

  • PMDL MdlAddress – указатель на список MDL (Memory Descriptor List), описывающий размещение буфера данных в физической памяти;

  • union { struct _IRP *MasterIrp; LONG IrpCount; PVOID SystemBuffer; } AssociatedIrp – объединение, трактуемое следующим образом: если это ассоциированный запрос ввода-вывода (обсуждается далее) – поле MasterIrp ссылается на главный запрос; если это главный запрос, имеющий ассоциированные запросы – поле IrpCount счетчик незавершенных ассоциированных запросов; если это запрос ввода-вывода использующий метод буферизированного ввода-вывода (обсуждается далее) – поле SystemBuffer адрес буфера данных в системной области памяти;

  • LIST_ENTRY ThreadListEntry – элемент списка незавершенных запросов ввода-вывода, сопоставленного с потоком, инициировавшим запрос;

  • IO_STATUS_BLOCK IoStatus – финальный статус операции ввода-вывода, устанавливаемый драйвером для диспетчера ввода-вывода при завершении запроса;

  • CHAR StackCount – количество уровней обработки при многоуровневой обработке запроса ввода-вывода;

  • CHAR CurrentLocation – текущий уровень обработки запроса при многоуровневой обработке запроса ввода-вывода;

  • PDRIVER_CANCEL CancelRoutine – указатель на функцию драйвера, которая должна быть вызвана, если диспетчер ввода-вывода отменит данный запрос до его завершения;

  • PVOID UserBuffer – адрес буфера данных в пользовательском адресном пространстве;

  • union { struct { … LIST_ENTRY ListEntry PIO_STACK_LOCATION CurrentStackLocation … PFILE_OBJECT OriginalFileObject } Overlay … } Tail – поле ListEntry используется для организации очереди запросов, поле CurrentStackLocation ссылается на данные, включая код операции, относящиеся к текущему уровню обработки запроса; поле OriginalFileObject ссылается на объект файл, через который был инициирован запрос.

Объект пакет запроса ввода-вывода содержит наиболее общую информацию о запросе и существует до завершения обработки запроса или до его отмены.

Пока обработка запроса ввода-вывода не завершена, указатель на IRP хранится в списке незавершенных запросов ввода-вывода потока, который инициировал запрос. Для этого в структуре IRP предусмотрено поле ThreadListEntry, а в структуре потока ETHREAD – поле IrpList.

Объект блок стека запросов ввода-вывода

Объект блок стека запросов ввода-вывода служит для реализации возможности обработки одного запроса ввода-вывода более, чем одним драйвером, когда запросы ввода-вывода последовательно проходят через цепочку драйверов, каждый из которых реализует свою часть в общей процедуре обработки. В результате запрос ввода-вывода последовательно преобразуется из высокоуровневого запроса прикладной программы в низкоуровневые команды внешнего устройства.

Например, запрос на чтение данных файла на диске последовательно обрабатывается драйвером файловой системы, драйвером диска, драйвером шины, а еще, возможно, драйверами фильтрами, включенными между ними.

Такую цепочку взаимодействующих драйверов принято называть стеком обработки запросов ввода-вывода.

Для поддержки стека обработки запросов ввода-вывода, с каждым объектом IRP может быть сопоставлен массив блоков стека запросов ввода-вывода, представленных экземплярами структуры IO_STACK_LOCATION. Отметим некоторые поля этой структуры:

  • UCHAR MajorFunction – номер (код) запроса, определяющий вызываемую функцию драйвера;

  • UCHAR MinorFunction – дополнительный код запроса, уточняющий основной код, например, основной код IRP_MJ_PNP приведет к вызову диспетчерской функции запросов PnP, уточняющий код IRP_MN_START_DEVICE – команда на запуск устройства от диспетчера PnP;

  • union Parameters – содержит перекрывающиеся определения структур, описывающих параметры запроса, например, для запроса IRP_MJ_CREATE параметры передаются в структуре Create, для запроса IRP_MJ_DEVICE_CONTROL – в структуре DeviceIoControl и т.д.; определение полей каждой такой структуры различно и зависит от запроса;

  • PDEVICE_OBJECT DeviceObject – указатель на устройство, к которому адресован запрос;

  • PFILE_OBJECT FileObject – указатель на файл, через который передан запрос;

  • PIO_COMPLETION_ROUTINE CompletionRoutine – указатель на функцию, которая будет вызвана при обратном прохождении запроса через стек обработки запроса ввода-вывода; эта функция может быть установлена драйвером на прямом проходе запроса через стек;

Массив блоков стека запроса ввода-вывода располагается в памяти сразу же за IRP, как показано на рис. .17. Таким образом, можно считать, что каждый запрос ввода-вывода определяется совокупностью структур IRP и IO_STACK_LOCATION, где IRP играет роль заголовка запроса.

Рис.17 Запрос ввода-вывода.