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


Процедуры DispatchPower

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

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

  • По возможности обработайте IRP.

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

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

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

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

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

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

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

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

  • Установите Irp-IoStatus.Status> в STATUS_DELETE_PENDING.

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

  • Возвращает STATUS_DELETE_PENDING.