IRP_MN_SET_POWER

Этот IRP уведомляет драйвер об изменении состояния питания системы или задает состояние питания устройства.

Основной код

IRP_MJ_POWER

При отправке

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

Диспетчер питания отправляет этот IRP для уведомления драйверов об изменении состояния питания системы. Если драйвер зарегистрировал устройство для обнаружения бездействия, диспетчер питания отправляет этот IRP для изменения состояния питания неактивного устройства.

Драйвер, которому принадлежит политика управления питанием, отправляет этот IRP для установки состояния питания устройства. Драйвер должен вызвать PoRequestPowerIrp для отправки этого IRP.

Диспетчер питания отправляет этот IRP в IRQL = PASSIVE_LEVEL в стеки устройств, которые устанавливают флаг DO_POWER_PAGABLE в PDO. Драйверы в таких стеках могут касаться страничного кода или данных для выполнения запроса.

Диспетчер питания может отправить IRP по адресу IRQL = DISPATCH_LEVEL, если установлен флаг DO_POWER_INRUSH. Такие драйверы не могут напрямую или косвенно получить доступ к какому-либо страничном коду или данным.

Входные параметры

Элемент Parameters.Power.Type указывает тип настраиваемого состояния питания : SystemPowerState или DevicePowerState.

Элемент Parameters.Power.State указывает само состояние питания следующим образом:

  • Если параметр Parameters.Power.Type имеет значение SystemPowerState, значение является перечислителем типа SYSTEM_POWER_STATE .

  • Если параметр Parameters.Power.Type имеет значение DevicePowerState, значение является перечислителем типа DEVICE_POWER_STATE .

Элемент Parameters.Power.ShutdownType указывает дополнительные сведения о запрашиваемом переходе. Возможные значения для этого элемента — POWER_ACTION значения перечисления. Дополнительные сведения см. в разделе System Power Actions.

Начиная с Windows Vista, элемент Parameters.Power.SystemPowerStateContext является доступной только для чтения, частично непрозрачной структурой SYSTEM_POWER_STATE_CONTEXT , которая содержит сведения о предыдущих состояниях питания системы компьютера. Если параметр Parameters.Power.Type имеет значение SystemPowerState , а Parameters.Power.StatePowerSystemWorking, два бита флага в этой структуре указывают, привел ли компьютер к быстрому запуску или выходу из спящего режима. Дополнительные сведения см. в разделе Отличие быстрого запуска от пробуждения от гибернации.

В следующей таблице показано содержимое IRP_MN_SET_POWER. Parameters.Power. {State| ShutdownType} и битовые поля CurrentSystemState, TargetSystemState и EffectiveSystemState в структуре SYSTEM_POWER_STATE_CONTEXT для каждого перехода на питание системы. Каждая строка представляет один IRP_MN_SET_POWER.

Переход Состояние Тип завершения работы Current SystemState Целевое состояние системы Эффективное состояние системы Комментарии
Спать, чтобы... S3 Сон S0 S3 S3
... Разбудить S0 Сон S3 S0 S0
Гибридный спящий режим для... S4 Режим гибернации S0 S3 S4 Спящий режим с файлом гибернации (Fast S4)
... Разбудить S0 Сон S3 S0 S0
... Wake/PwrLost S0 Сон S4 S0 S0
Гибернации в... S4 Режим гибернации S0 S4 S4
... Разбудить S0 Сон S4 S0 S0
Гибридное завершение работы для... S4 Режим гибернации S0 S5 S4 Приложения закрыты, пользователь выключился, как при завершении работы (загрузка Hiber)
... Быстрый запуск S0 Сон S4 S0 S0
Завершение работы до... S5 Завершение работы, сброс или отключение S0 S5 S5
... Загрузка системы Нет S-IRP для загрузки

Выходные параметры

Parameters.Power.SystemContext зарезервирован для системного использования.

Блок состояния ввода-вывода

Драйвер задает Irp-IoStatus.Status> значение STATUS_SUCCESS, чтобы указать, что устройство перешло в запрошенное состояние.

Драйвер не должен завершать запрос на настройку состояния питания системы.

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

Операция

Диспетчер питания или драйвер может запросить IRP_MN_SET_POWER IRP. Диспетчер управления питанием отправляет этот IRP по одной из следующих причин:

  • Уведомление драйверов об изменении состояния питания системы

  • Изменение состояния питания устройства, для которого диспетчер питания выполняет обнаружение простоя

  • Чтобы подтвердить текущее состояние системы после сбоя драйвера IRP_MN_QUERY_POWER запрос на состояние питания системы. Дополнительные сведения см. в разделе IRP_MN_QUERY_POWER.

Драйвер, владеющий политикой управления питанием устройства, отправляет IRP_MN_SET_POWER для изменения состояния питания устройства.

В любой момент времени система разрешает только один такой IRP быть активным для каждого объекта устройства.

Каждый драйвер должен передавать каждый IRP питания следующему более низкому драйверу, вызвав IoCallDriver (начиная с Windows Vista) или PoCallDriver (Windows Server 2003, Windows XP и Windows 2000). Интерфейс PoCallDriver аналогичен интерфейсу IoCallDriver, за исключением того, что подсистема управления питанием может отложить IRP перед передачей его следующему драйверу. Например, в запросе PowerDeviceD0 могут возникать задержки, если устройству требуется включаемый поток и, следовательно, его необходимо последовательно включить с другим таким устройством.

После того как драйвер получает запрос IRP_MN_SET_POWER в Windows Server 2003, Windows XP или Windows 2000, драйвер должен вызвать PoStartNextPowerIrp, как описано в разделе Вызов PoStartNextPowerIrp. Начиная с Windows Vista вызов PoStartNextPowerIrp не требуется, и такой вызов не выполняет никаких операций управления питанием.

IRP_MN_SET_POWER для системных состояний питания

Только диспетчер управления питанием системы может отправить IRP набора системных наборов.

Драйвер не должен завершать запрос на настройку состояния питания системы.

По возможности диспетчер питания отправляет IRP_MN_QUERY_POWER перед отправкой IRP_MN_SET_POWER для запроса состояния спящего режима системы. Однако при некоторых условиях (например, когда пользователь нажимает кнопку выключения питания или истекает срок действия батареи) диспетчер питания может выдавать IRP_MN_SET_POWER без предварительного запроса. Диспетчер питания запрашивает только состояния спящего режима; он никогда не запрашивает перед выключением.

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

Драйверу фильтра, как правило, не требуется действовать с системным набором питания IRP, кроме как для его передачи.

Однако владелец политики управления питанием устройства устанавливает процедуру IoCompletion перед передачей IRP. В процедуре IoCompletion она отправляет запрос IRP_MN_SET_POWER для устройства power IRP. Дополнительные сведения см. в разделе Обработка системного Set-Power IRP в владельце политики управления питанием устройства.

IRP установки питания системы информирует водителей о том, что изменение состояния питания системы неминуемо, и драйверы должны подготовиться к этому. Однако драйвер не должен изменять состояние питания своего устройства, пока не получит IRP_MN_SET_POWER для состояния питания устройства .

Значение Parameters.Power.ShutdownType предоставляет дополнительные сведения об ожидающих действиях. Если в IRP указано значение PowerSystemShutdown (S5), драйвер может определить, сбрасывается ли система (PowerActionShutdownReset) или отключается на неопределенный срок для последующей перезагрузки (PowerActionShutdownOff). Для драйверов большинства устройств разница незначима. Однако для некоторых устройств, таких как устройства потоковой передачи видео, драйвер может отключить устройство, чтобы остановить ввод-вывод при сбросе системы.

В Windows 2000 и более поздних версиях операционной системы значение ShutdownType также может иметь значение PowerActionShutdown. В этом случае драйвер не может определить, какой тип завершения работы запрашивается, и поэтому он должен перейти к сбросу.

Состояния питания устройства

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

Драйвер должен установить устройство в запрошенное состояние перед завершением IRP.

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

  • Сохраняет любой контекст, необходимый драйверу для восстановления устройства до рабочего состояния.

  • Устанавливает для устройства запрошенное состояние питания.

  • Вызывает PoSetPowerState для уведомления диспетчера питания.

  • Вызывает PoStartNextPowerIrp для запуска следующего IRP питания (только Для Windows Server 2003, Windows XP и Windows 2000).

  • Завершает IRP питания устройства.

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

В Windows 2000 и более поздних версиях операционной системы, если IRP указывает PowerDeviceD1, PowerDeviceD2 или PowerDeviceD3 и активен IRP с набором питания системы, значение Parameters.Power.ShutdownType предоставляет сведения о системном IRP.

Драйверы устройств в пути гибернации должны проверять это значение. Если IRP запрашивает PowerDeviceD3 , а ShutdownTypePowerActionHibernate, такой драйвер должен сохранить контекст, необходимый для восстановления устройства, но не должен отключать устройство; устройство перейдет в состояние D3 при потере питания компьютера.

В Windows 2000 и более поздних версиях операционной системы драйверы не должны полагаться на значение ShutdownType , если запрошенное состояние питания — PowerDeviceD0.

В Windows 98/Me, если IRP запрашивает состояние питания устройства, shutdownType всегда имеет значение PowerActionNone.

Драйвер, определяющий, когда выключать устройство, зависит от класса устройства.

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

Когда драйвер получает IRP с заданным питанием для состояния устройства D0, он устанавливает подпрограмму IoCompletion и передает IRP следующему более низкому драйверу.

Когда IRP достигает драйвера шины, этот драйвер применяет (или сбрасывает) питание к устройству, вызывает PoStartNextPowerIrp (только Windows Server 2003, Windows XP и Windows 2000) и вызывает PoSetPowerState , чтобы сообщить диспетчеру питания о новом состоянии питания для устройства.

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

Дополнительные сведения см. в разделе Обработка IRP_MN_SET_POWER для состояний питания устройства.

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также раздел

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT