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


Энергопотребление 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 питания.

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

  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 для запуска следующего IRP питания. Однако в Windows 7 и Windows Vista вызов PoStartNextPowerIrp не требуется, и такой вызов не выполняет никаких операций управления питанием. Наконец, обратный вызов вызывает IoCompleteRequest для завершения системного IRP.

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

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