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

[7.2.2.] Поля в Стеке размещения Ввода - вывода 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, который был только что сформирован;

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

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