Поделиться через


Когда следует проверять расположение стека ввода-вывода драйвера

Основной код функции ввода-вывода задается в расположении стека ввода-вывода драйвера для каждого входящего IRP.

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

  • Подпрограмма диспетчеризации обрабатывает более одного основного кода функции ввода-вывода.

  • Подпрограмма диспетчеризации должна обрабатывать набор дополнительных кодов функций для некоторых основных кодов функций. IrP с незначительными кодами функций включают IRP_MJ_PNP и IRP_MJ_POWER, а также некоторые IRP, которые должны обрабатываться драйвером портов SCSI и драйверами файловой системы.

  • Подпрограмма диспетчеризации драйвера устройства или тесно связанного драйвера более высокого уровня обрабатывает IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL запросы, которые имеют связанный набор кодов управления вводом-выводом.

Чтобы получить указатель на расположение стека ввода-вывода драйвера, его подпрограмма диспетчеризации вызывает IoGetCurrentIrpStackLocation.

Подпрограммы диспетчеризации драйверов более высокого уровня всегда вызывают IoGetCurrentIrpStackLocation , а также вызывают IoGetNextIrpStackLocation , чтобы получить указатель на расположение стека ввода-вывода следующего ниже драйвера для IRP, которые они настроили для следующего ниже драйвера, при передаче IRP вниз по стеку драйверов.

Подпрограмма DispatchDeviceControl или подпрограмма DispatchInternalDeviceControl драйвера устройства или, возможно, его тесно связанных драйверов классов должны определять, какой код управления вводом-выводом задается в расположении стека ввода-вывода драйвера в Parameters.DeviceIoControl.IoControlCode для каждого запроса. Код элемента управления вводом-выводом содержится в расположении стека ввода-вывода драйвера.

В большинстве случаев подпрограмма DispatchDeviceControl или DispatchInternalDeviceControl драйвера более высокого уровня просто передает IRP_MJ_DEVICE_CONTROL или IRP_MJ_INTERNAL_DEVICE_CONTROL запрос на следующий ниже драйвер после настройки расположения стека в IRP. Однако драйверы класса SCSI должны проверка для определенных кодов элементов управления портом SCSI, чтобы они могли правильно настроить расположение стека ввода-вывода драйвера портов SCSI перед передачей этих запросов.