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


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

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

Драйверы обрабатывают IRP на понижение мощности по мере их прохождения по стеку. Для power-up IRPs драйверы устанавливают подпрограммы IoCompletion по мере того, как IRPs проходят вниз по стеку, а затем обрабатывают IRPs в подпрограммах IoCompletion, когда IRPs возвращаются вверх по стеку. Драйверы в типичном стеке устройств обрабатывают запрос установки питания (IRP) для устройства следующим образом:

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

  • Драйвер функции вызывает IoMarkIrpPending, выполняет задачи, связанные с устройством (например, выполнение ожидающих запросов ввода-вывода, постановка в очередь входящих запросов ввода-вывода, сохранение контекста устройства или изменение питания устройства), устанавливает подпрограмму IoCompletion при необходимости и передает IRP устройства следующему нижнему драйверу (см. раздел "Передача Power 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, устанавливающий мощность, должен пройти весь путь вниз по стеку устройств до драйвера шины, который завершает его.

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

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

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

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

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

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

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

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

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