Обработка IRP_MN_SET_POWER для состояний питания устройства

IRP с установленной мощностью устройства запрашивает изменение состояния для одного устройства и отправляется всем драйверам в стеке устройства. Такой IRP указывает DevicePowerState в элементе Power.Type расположения стека ввода-вывода.

Водители обрабатывают irp с выключением питания, когда они перемещаются вниз по стеку. Для irP с выключением питания драйверы устанавливают процедуры IoCompletion по мере перемещения irp вниз по стеку, а затем обрабатывают irp в подпрограммах IoCompletion , когда IRP перемещаются обратно вверх по стеку. Драйверы в типичном стеке устройств обрабатывают IRP с установленной мощностью устройства следующим образом:

  • Большинство драйверов фильтров должны просто вызывать IoMarkIrpPending, передавать IRP в драйвер следующего уровня (см. раздел Передача irP питания) и возвращать STATUS_PENDING из подпрограммы DispatchPower . Однако некоторым драйверам фильтров может потребоваться выполнить задачи, относящиеся к конкретному устройству, такие как постановка в очередь входящих irP или экономия состояния питания устройства.

  • Драйвер функции вызывает IoMarkIrpPending, выполняет задачи, относящиеся к устройству (например, выполнение ожидающих запросов ввода-вывода, постановку в очередь входящих запросов ввода-вывода, сохранение контекста устройства или изменение питания устройства), при необходимости задает процедуру IoCompletion и передает IRP устройства следующему более низкому драйверу (см. раздел Передача irPs питания). Он возвращает STATUS_PENDING из подпрограммы DispatchPower .

  • Драйвер шины изменяет питание устройства, если он способен сделать это, а затем вызывает PoSetPowerState , чтобы уведомить диспетчер питания о новом состоянии питания устройства. Только в Windows Server 2003, Windows XP и Windows 2000 драйвер также должен вызвать PoStartNextPowerIrp , чтобы запустить следующий IRP питания после установки состояния питания. Затем драйвер завершает IRP, указывая IO_NO_INCREMENT. Если драйвер не может завершить IRP немедленно, он вызывает IoMarkIrpPending, возвращает STATUS_PENDING из своей подпрограммы DispatchPower и завершает IRP позже.

Даже если целевое устройство уже находится в запрошенном состоянии питания, каждый драйвер функции или фильтра должен передавать IRP в следующий драйвер ниже. Каждый IRP set-power должен пройти весь путь вниз по стеку устройства до водителя автобуса, который завершает его.

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

Каждый драйвер (драйвер функции, фильтра и шины) в стеке драйверов должен вызывать PoSetPowerState , чтобы сообщить диспетчеру питания об изменении состояния питания соответствующего объекта устройства.

Как и другие задачи драйвера, связанные с включением и выключением питания устройства, вызов PoSetPowerState должен выполняться после включения устройства (если новое состояние — D0) или перед выключением устройства (если новое состояние — любое другое).

Каждый драйвер должен отслеживать состояние питания своего устройства. Диспетчер питания не предоставляет эти сведения драйверам.

При обработке IRP_MN_SET_POWER запроса на состояние питания устройства драйвер должен как можно быстрее вернуться из подпрограммы DispatchPower . Драйвер не должен ждать в своей подпрограмме DispatchPower события ядра, сигнализируют кодом, который обрабатывает тот же IRP. Так как поставщики интеграции питания синхронизируются по всей системе, может возникнуть взаимоблокировка.

Чтобы обеспечить наивысший уровень производительности системы, особенно для мультимедийных приложений, драйвер должен выполнять трудоемкие операции на уровне запроса прерывания (IRQL), равном PASSIVE_LEVEL. Для выполнения операций в PASSIVE_LEVEL IRQL= драйвер может использовать выделенный поток или рабочий поток системы. Рекомендации по оптимизации производительности драйверов для мультимедийных платформ см. в руководстве по проектированию устройств потоковой передачи мультимедиа.

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

Обработка irP Power-Down устройств

Обработка irP Power-Up устройств