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


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.TypeSystemPowerState, это значение является перечислителем типа SYSTEM_POWER_STATE .

  • Если parameters.Power.TypeDevicePowerState, это значение является перечислителем типа DEVICE_POWER_STATE .

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

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

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

Переход Государство Тип завершения работы Current SystemState Target SystemState Эффективное systemState Комментарии
Спать... S3 Спать S0 S3 S3
... Будить S0 Спать S3 S0 S0
Гибридный спящий режим... S4 Режим гибернации S0 S3 S4 Спящий режим с файлом гибернации (Fast S4)
... Будить S0 Спать S3 S0 S0
... Пробуждение/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 для каждого объекта устройства.

Каждый драйвер должен передать каждому драйверу power 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 для системных состояний 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). Для драйверов большинства устройств разница в несоотступности. Однако для некоторых устройств, таких как устройства потоковой передачи видео, драйвер может отключить устройство, чтобы остановить ввод-вывод при сбросе системы.

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

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

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

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

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

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

  • Задает устройству требуемое состояние питания.

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

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

  • Завершает работу устройства power IRP.

Драйвер должен своевременно завершить этот IRP. Как правило, водители должны избегать любой задержки, что типичный пользователь будет заметно медленнее. Например, драйвер может отложить изменение состояния системы на сброс кэшированных дисков или сетевых данных, но не должно поддерживать сетевое подключение в живых или форматировать ленту. Дополнительные сведения см. в разделе "Передача ip-адресов 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

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT