Поля в Стеке размещения Ввода - вывода IRP

Каждый Стек размещения Ввода - вывода в IRP содержит информацию для конкретного драйвера относительно запроса Ввода - вывода. Стек размещения Ввода - вывода определяется структурой IO_STACK_LOCATION. Для определения местонахождения текущего Стека Размещения Ввода - вывода внутри данного IRP, драйвер должен использовать функцию IoGetCurrentIrpStackLocation(). Единственным параметром при вызове является указатель на IRP. Возвращаемым значением будет указатель на текущий Стек размещения Ввода - вывода.

Когда Диспетчер Ввода - вывода создает IRP и инициализирует его фиксированную часть, он также инициализирует в IRP первый Стек размещения Ввода - вывода. В него помещается информация, которую нужно передать первому драйверу в стеке драйверов, которые будут обрабатывать этот запрос. Поля в Стеке размещения Ввода - вывода включают следующее:

· MajorFunction. Это поле указывает главный код функции в/в, связанный запросом в/в. Тем самым указывается тип операции в/в, которая должна быть выполнена.

· MinorFunction. Это поле указывает второстепенный код функции в/в, связанный с запросом. При использовании, это поле переопределяет главный функциональный код. Второстепенные функции используются почти исключительно сетевыми транспортными драйверами и файловыми системами и игнорируются большинством драйверов устройств.

· Flags. Это поле содержит флаги обработки, определенные для выполняемой функции в/в. Это поле представляет интерес главным образом для драйверов файловых систем.

· Control. Это поле является набором флагов, которые устанавливаются и читаются Диспетчером Ввода - вывода, указывая, как надо обработать данный пакет IRP. Например, в этом поле (обращением драйвера к функции IoMarkIrpPending()) может быть установлен бит SL_PENDING, указывающий Диспетчеру Ввода - вывода, что завершение обработки пакета IRP отложено на неопределенное время. Точно так же флажки sl_invoke_on_cancel, sl_invoke_on_error и sl_invoke_on_success указывают, когда для этого IRP должна быть вызвана Подпрограмма Завершения Ввода - вывода драйвера.

· Parameters. Это поле включает несколько подполей, каждое из которых зависит от главной функции Ввода – вывода, которая будет выполняться.

· DeviceObject. Это поле содержит указатель на объект-устройство, который является получателем запроса Ввода - вывода.

· FileObject. Это поле содержит указатель на объект-файл, связанный с запросом Ввода - вывода.

После того, как фиксированная часть IRP и первый Стек размещения Ввода - вывода в IRP инициализированы, Диспетчер Ввода - вывода вызывает верхний драйвер в стеке драйверов в его точке входа dispatch, которая соответствует главному функциональному коду для запроса. Таким образом, если Диспетчер Ввода - вывода сформировал IRP для описания запроса чтения, он вызовет первый драйвер в стеке драйверов в его диспетчерской точке входа для чтения (IRP_MJ_READ). При этом Диспетчер Ввода - вывода передает следующие параметры:

· указатель на IRP, который был только что сформирован;

· указатель на обьект-устройство, который соответствует устройству, для которого драйвер должен обработать запрос.


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



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