Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect7_8.doc
Скачиваний:
5
Добавлен:
15.09.2019
Размер:
181.76 Кб
Скачать

[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 с другим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]