Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
системный 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 питания на каждый листовой узел в дереве устройств.
Драйверы обрабатывают 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, которые устанавливают состояние питания системы.
Когда драйвер, отвечающий за политику питания устройства, получает IRP, этот драйвер устанавливает соответствующую процедуру IoCompletion для системного IRP, а затем перенаправляет IRP.
Если это возможно, любые другие драйверы в стеке обрабатывают IRP, задают подпрограммы IoCompletion, если необходимо, и перенаправляют IRP следующему нижестоящему драйверу, как показано на шаге 2.
В конечном итоге водитель автобуса получает и завершает системный IRP.
Диспетчер операций ввода-вывода вызывает все подпрограммы IoCompletion, которые были заданы в качестве драйверов, передаваемых системным IRP вниз стеку устройств.
В своей процедуре IoCompletion владелец политики питания устройства вызывает PoRequestPowerIrp для отправки IRP питания устройства, указывая состояние питания устройства, совместимое с состоянием питания системы в системном IRP. Драйвер задает подпрограмму обратного вызова, которую следует вызвать при завершении IRP питания устройства.
При необходимости драйвер обращается к элементу DeviceState в кэшированной копии структуры DEVICE_CAPABILITIES (см. раздел Отчеты о возможностях питания устройства), чтобы определить, какие состояния питания устройства соответствуют состоянию питания системы в IRP.
После завершения IRP устройства и выполнения всех процедур завершения IRP устройства вызывается функция обратного вызова владельца политики управления питанием. В подпрограмме обратного вызова драйвер копирует возвращенное состояние в системный IRP. В Windows Server 2003, Windows XP и Windows 2000 обратный вызов вызывает PoStartNextPowerIrp для запуска следующей power IRP. Однако в Windows 7 и Windows Vista вызов PoStartNextPowerIrp не требуется, и такой вызов не выполняет операции управления питанием. Наконец, обратный вызов вызывает IoCompleteRequest для завершения системного IRP.
Дополнительные сведения см. в обращении с запросами состояния питания системы.
Поскольку некоторые устройства требуют пускового тока при включении, системные IRPs пусковой мощности обрабатываются синхронно и последовательно во всей системе. Одновременно может быть активен только один такой IRP. Дополнительные сведения см. в разделе Вызов IoCallDriver и вызов PoCallDriver.