- •Лекция №7-8. Подсистема в/в. Пакеты запросов ввода/вывода (irp). [7.1] Подсистема в/в и её характеристики.
- •[7.2] Структура irp
- •[7.2.1] Поля в Фиксированной части irp.
- •[7.2.2.] Поля в Стеке размещения Ввода - вывода irp.
- •[7.3] Описание Буфера Данных
- •[7.4] Коды Функции Ввода - вывода
- •[8.1] Передача данных посредством irp и диспетчерские точки входа драйвера
- •[8.1.1] Запросы чтения и записи irp_mj_read и irp_mj_write [8.1.1.1] Определение метода передачи буфера для запросов чтения-записи
- •[8.1.1.2] Получение буфера
- •[8.1.1.3] Завершение запроса в/в
- •[8.1.1.4] Пример обработки запросов чтения/записи
- •[8.1.2.1] Пояснения по использованию
- •[8.1.2.2] Задание кода управления вводом/выводом (ioctl)
- •[8.1.2.3] Получение буфера
- •[8.1.2.4] Завершение запроса в/в
- •[8.1.2.5] Пример обработки
[7.2.1] Поля в Фиксированной части irp.
Как было уже сказано, фиксированная часть IRP содержит информацию, которая или не изменяется от драйвера к драйверу или не должна сохраняться, когда IRP передается от одного драйвера к другому. Особенно интересные или полезные поля в фиксированной части IRP являются следующими:
MdlAddress. Это поле указывает на Таблицу Описания Памяти (MDL), которая описывает буфер запроса, когда драйвер использует Прямой в/в (Direct I/O – далее в этой лекции).
Flags. Как подразумевает название, это поле содержит флаги, которые (обычно) описывают запрос Ввода - вывода. Например, если в этом поле установлен флаг IRP_PAGING_IO, это указывает на то, что операция чтения или операция записи, описанная IRP, есть страничный запрос. Точно так же бит IRP_NOCACHE указывает, что запрос должен быть обработан без промежуточной буферизации. Поле Flags обычно представляют интерес только для файловых систем.
AssociatedIrp.MasterIrp. В связанном (associated) IRP, это указатель на главный (master) IRP, с которым связан этот запрос. Это поле представляет интерес только драйверам верхнего уровня, типа драйверов файловых систем.
AssociatedIrp.SystemBuffer. Это место указывает на промежуточный буфер в невыгружаемой памяти, содержащий данных запроса в случае, когда драйвер использует буферизированный Ввод – вывод (Buffered I/O).
IoStatus. Это Блок Состояния Ввода - вывода, который описывает состояние завершения обработки IRP. Когда IRP завершен, драйвер помещает в поле IoStatus.Status состояние завершения операции в/в, а в поле IoStatus.Information - любую дополнительную информацию, которую нужно передать обратно инициатору запроса Ввода - вывода. Как правило, поле IoStatus.Information содержит фактическое число байтов, прочитанных или записанных запросом передачи данных.
RequestorMode. Это поле указывает режим работы процессора (режим ядра или пользовательский режим), из которого был инициирован запрос в/в.
Cancel, CancelIrql и CancelRoutine. Эти поля используются, если IRP может быть отменен в процессе обработки. Cancel – поле типа BOOLEAN, значение которого устанавливается Диспетчером в/в. Установка в TRUE указывает, что была запрошена отмена операции в/в, описанной этим IRP. CancelRoutine - это указатель на функцию драйвера (точка входа драйвера), вызываемую Диспетчером Ввода – вывода для того, чтобы драйвер мог корректно отменить IRP. Точка входа CancelRoutine вызывается на IRQL DISPATCH_LEVEL, CancelIrql является тем уровнем IRQL, к которому драйвер должен возвратиться. Более подробно обработка отмены запроса в/в будет обсуждаться на лекции по сериализации.
UserBuffer. Это поле содержит виртуальный адрес буфера данных инициатора запроса, связанного с запросом Ввода - вывода, если такой буфер имеется.
Tail.Overlay.DeviceQueueEntry. Это поле используется Диспетчером Ввода - вывода для постановки IRP в очередь в случае использования системной очереди (System Queuing). Системная очередь будет обсуждаться на лекции по сериализации.
Tail.Overlay.Thread. Это поле является указателем на управляющий блок потока инициатора запроса (ETHREAD).
TailOverlay.ListEntry. Когда драйвер сам создал IRP, он может использовать это поле для соединения одного IRP с другим.
