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


Power IRP для отдельных устройств

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

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IRP_MN_POWER_SEQUENCE

Все драйверы в стеке устройств получают такие irP; Как правило, только диспетчер политик питания устройств может отправлять эти irP. Однако диспетчер питания может отправлять IRP питания устройства при выполнении обнаружения простоя от имени устройства, как описано в статье Использование подпрограмм Power Manager для обнаружения простоя.

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

  • Запрос или изменение состояния питания устройства в ответ на системное управление питанием

  • Перевод устройства в спящий режим для экономии энергии

  • Возврат устройства в рабочее состояние после того, как оно заснуло

  • Включение пробуждения устройства в ответ на внешний сигнал

  • Получение значения последовательности питания при выключении устройства

На следующем рисунке показана последовательность шагов, которые выполняются для отправки, пересылки и завершения IRP питания устройства.

схема, иллюстрирующая путь устройства power irp.

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

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

  2. Диспетчер питания выделяет IRP питания устройства и отправляет его в верхний драйвер в стеке устройств для целевого PDO.

  3. Драйвер выполняет следующие действия:

    • Задает подпрограмму IoCompletion , если она необходима.

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

    • Вызывает IoCallDriver (Windows 7 и Windows Vista) или вызывает PoCallDriver (Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP следующему драйверу ниже.

    Каждый водитель в стеке делает это до тех пор, пока IRP не достигнет водителя автобуса. Если драйвер должен завершиться ошибкой IRP, он должен сделать это немедленно и вызвать IoCompleteRequest.

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

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

Дополнительные сведения об irP питания устройств см. в разделах Управление питанием для отдельных устройств и Вспомогательные устройства с Wake-Up возможностями. Дополнительные сведения об IRP последовательности питания см. в разделе IRP_MN_POWER_SEQUENCE.