Поля в Фиксированной части 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 с другим.


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



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