Подпрограммы DispatchPower

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

Подпрограмма DispatchPower каждого драйвера выполняет следующие задачи:

  • Обработайте IRP, если это возможно.

  • Передайте IRP следующему нижнему драйверу в стеке устройств с помощью PoCallDriver.

  • Если водитель шины, выполните запрошенную операцию питания на устройстве и завершите IRP.

Все драйверы для устройства должны иметь возможность обрабатывать irps питания для устройства, за исключением нескольких случаев, когда драйвер функции или фильтра может завершать ошибку IRP. Большинство драйверов функций и фильтров либо выполняют некоторую обработку, либо устанавливают подпрограмму IoCompletion для каждой IRP питания, а затем передают IRP к следующему более низкому драйверу, не завершая ее. В конечном итоге IRP достигает водителя шины, который физически изменяет состояние питания устройства при необходимости и завершает IRP.

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

IrP питания, которые активируют устройство, должны обрабатываться сначала самым низким драйвером в стеке устройств (базовый драйвер шины), а затем каждым последующим драйвером в стеке. IrP питания, которые выключили устройство, должны обрабатываться сначала драйвером в верхней части стека устройств, а затем каждым последовательным драйвером, который идет вниз по стеку.

Специальная обработка съемных устройств

В подпрограммах DispatchPower драйверы съемных устройств должны проверка, чтобы узнать, присутствует ли устройство. Если устройство было удалено, драйвер не должен передавать IRP ниже. Вместо этого драйвер должен выполнить следующие действия:

  • Вызовите PoStartNextPowerIrp , чтобы начать обработку следующего IRP питания.

  • Задайте для Irp-IoStatus.Status> значение STATUS_DELETE_PENDING.

  • Вызовите IoCompleteRequest, указав IO_NO_INCREMENT, чтобы завершить IRP.

  • Возврат STATUS_DELETE_PENDING.