Обработка irP Power-Up устройств
IrP питания устройства указывают IRP_MN_SET_POWER и состояние питания устройства, которое требует больше энергии, чем текущее состояние питания устройства. Как правило, IRP с выключением питания указывает состояние работы устройства PowerDeviceD0.
Запросы на включение питания устройства должны обрабатываться сначала базовым драйвером шины для устройства, а затем каждым последовательным драйвером, который выполняет резервное копирование стека.
На следующем рисунке показаны шаги, связанные с обработкой IRP с выключением питания.
При обработке IRP_MN_SET_POWER запроса на включение питания драйвер функции или фильтра должен:
Вызовите IoAcquireRemoveLock , чтобы убедиться, что драйвер не получит запрос IRP_MN_REMOVE_DEVICE при обработке IRP с включением питания.
Если IoAcquireRemoveLock возвращает состояние сбоя, драйвер не должен продолжать обработку IRP. Вместо этого, начиная с Windows Vista, драйвер должен вызвать IoCompleteRequest , чтобы завершить IRP, а затем вернуть состояние сбоя. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен вызвать IoCompleteRequest для завершения IRP, а затем вызвать PoStartNextPowerIrp для запуска следующего IRP питания, а затем вернуть состояние сбоя.
Вызовите IoMarkIrpPending , чтобы отметить ожидание IRP.
Вызовите IoCopyCurrentIrpStackLocationToNext , чтобы задать расположение стека IRP. Драйвер не должен вызывать IoSkipCurrentIrpStackLocation , если он задает подпрограмму IoCompletion .
Вызовите IoSetCompletionRoutine , чтобы настроить процедуру IoCompletion с питанием .
При обработке IRP с включением питания устройства драйвер должен настроить подпрограмму IoCompletion для восстановления контекста, снятия блокировки и выполнения других необходимых задач после завершения IRP и включения устройства. Драйвер не должен восстанавливать контекст до завершения IRP. Дополнительные сведения см. в разделе Процедуры IoCompletion для irP питания устройства.
Вызовите IoCallDriver (в Windows 7 и Windows Vista) или PoCallDriver (Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP следующему драйверу ниже. IRP должен пройти весь путь вниз по стеку устройства к водителю автобуса. Только водитель автобуса может завершить IRP.
Возврат STATUS_PENDING.
Когда водитель автобуса получает IRP, он должен сначала проверка, чтобы убедиться, что устройство все еще присутствует и не было удалено или заменено во время сна. Если устройство больше не существует, драйвер шины должен вызвать IoInvalidateDeviceRelations на родительском устройстве, чтобы уведомить диспетчер Plug and Play о том, что устройство исчезло. В этом случае водитель шины может не выполнить IRP питания устройства.
Если устройство все еще присутствует, драйвер шины выполняет задачи, необходимые для возврата устройства в рабочее состояние, вызывает PoSetPowerState , чтобы сообщить диспетчеру питания о новом состоянии питания устройства, и завершает IRP (IoCompleteRequest). Если водители помещали в очередь операции ввода-вывода, когда устройство находилось в спящем режиме, или устройство требует включения питания, драйвер шины применяет питание к устройству. В противном случае водитель шины применит питание, как только ему нужно будет взаимодействовать с устройством.
Список рекомендаций по обеспечению быстрого запуска из состояния выключения питания, ожидания и гибернации см. в разделе Повышение производительности запуска системы.