Power IRP для отдельных устройств
Устройство power IRP указывает основной код IRP IRP_MJ_POWER, один из дополнительных кодов IRP питания, перечисленных ниже, и значение DevicePowerState в элементе Power.Type .
Все драйверы в стеке устройств получают такие irP; Как правило, только диспетчер политик питания устройств может отправлять эти irP. Однако диспетчер питания может отправлять IRP питания устройства при выполнении обнаружения простоя от имени устройства, как описано в статье Использование подпрограмм Power Manager для обнаружения простоя.
Драйвер отправляет IRP питания устройства по любой из следующих причин:
Запрос или изменение состояния питания устройства в ответ на системное управление питанием
Перевод устройства в спящий режим для экономии энергии
Возврат устройства в рабочее состояние после того, как оно заснуло
Включение пробуждения устройства в ответ на внешний сигнал
Получение значения последовательности питания при выключении устройства
На следующем рисунке показана последовательность шагов, которые выполняются для отправки, пересылки и завершения IRP питания устройства.
Как показано на предыдущем рисунке, IRP питания устройства отправляется, пересылается и выполняется в следующих шагах:
Владелец политики управления питанием устройства вызывает PoRequestPowerIrp для выделения IRP питания устройства, указывая PDO, который является целевым объектом IRP, и подпрограмму обратного вызова, которая будет вызываться после завершения IRP.
Диспетчер питания выделяет IRP питания устройства и отправляет его в верхний драйвер в стеке устройств для целевого PDO.
Драйвер выполняет следующие действия:
Задает подпрограмму 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.
Драйвер шины, который поддерживает PDO устройства, выполняет запрошенное действие, а затем вызывает IoCompleteRequest для завершения IRP. Если устройство удалено или находится в процессе удаления, водитель шины может завершиться сбоем при отключении устройства.
Диспетчер ввода-вывода вызывает подпрограммы IoCompletion , которые были заданы драйверами при передаче IRP вниз по стеку. После вызова всех подпрограмм IoCompletion запускается процедура обратного вызова.
Дополнительные сведения об irP питания устройств см. в разделах Управление питанием для отдельных устройств и Вспомогательные устройства с Wake-Up возможностями. Дополнительные сведения об IRP последовательности питания см. в разделе IRP_MN_POWER_SEQUENCE.