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


Запросы управления питанием (IRP) для системы

системный IRP указывает основной код IRP IRP_MJ_POWER, один из дополнительных кодов IRP, перечисленных ниже, и значение SystemPowerState в элементе Power.Type элемента стека IRP. Только диспетчер питания может отправлять такие IRP; Драйвер не может отправить системный IRP системы.

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

  • Чтобы изменить состояние питания системы в ответ на тайм-аут бездействия, изменение системной активности, запрос пользователя или разряд батареи (IRP_MN_SET_POWER)

  • Чтобы запросить устройства с целью определить, способна ли система перейти в спящий режим (IRP_MN_QUERY_POWER)

  • Для подтверждения текущего состояния питания системы после запроса (IRP_MN_SET_POWER)

Диспетчер питания отправляет IRP_MN_QUERY_POWER и IRP_MN_SET_POWER запросы от имени системы. Драйвер может отклонить запрос IRP_MN_QUERY_POWER, но не может отклонять IRP_MN_SET_POWER.

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

диаграмма, иллюстрирующая путь системного IRP.

Как показано на предыдущем рисунке:

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

  2. Драйверы обрабатывают IRP по возможности, задают подпрограммы IoCompletion при необходимости, вызывают IoCallDriver (Windows 7 и Windows Vista) или PoCallDriver (Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP вниз по стеку. Если драйвер должен прервать выполнение IRP, он делает это немедленно и завершает IRP. Драйверы могут завершать ошибкой IRP_MN_QUERY_POWER IRPs, но не должны приводить к ошибке в IRP_MN_SET_POWER IRPs, которые устанавливают состояние питания системы.

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

  4. Если это возможно, любые другие драйверы в стеке обрабатывают IRP, задают подпрограммы IoCompletion, если необходимо, и перенаправляют IRP следующему нижестоящему драйверу, как показано на шаге 2.

  5. В конечном итоге водитель автобуса получает и завершает системный IRP.

  6. Диспетчер операций ввода-вывода вызывает все подпрограммы IoCompletion, которые были заданы в качестве драйверов, передаваемых системным IRP вниз стеку устройств.

  7. В своей процедуре IoCompletion владелец политики питания устройства вызывает PoRequestPowerIrp для отправки IRP питания устройства, указывая состояние питания устройства, совместимое с состоянием питания системы в системном IRP. Драйвер задает подпрограмму обратного вызова, которую следует вызвать при завершении IRP питания устройства.

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

  8. После завершения IRP устройства и выполнения всех процедур завершения IRP устройства вызывается функция обратного вызова владельца политики управления питанием. В подпрограмме обратного вызова драйвер копирует возвращенное состояние в системный IRP. В Windows Server 2003, Windows XP и Windows 2000 обратный вызов вызывает PoStartNextPowerIrp для запуска следующей power IRP. Однако в Windows 7 и Windows Vista вызов PoStartNextPowerIrp не требуется, и такой вызов не выполняет операции управления питанием. Наконец, обратный вызов вызывает IoCompleteRequest для завершения системного IRP.

Дополнительные сведения см. в обращении с запросами состояния питания системы.

Поскольку некоторые устройства требуют пускового тока при включении, системные IRPs пусковой мощности обрабатываются синхронно и последовательно во всей системе. Одновременно может быть активен только один такой IRP. Дополнительные сведения см. в разделе Вызов IoCallDriver и вызов PoCallDriver.