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


Обработка IRP-запросов устройства Power-Up

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

  • Вызовите IoMarkIrpPending, чтобы пометить IRP как отложенный.

  • Вызовите IoCopyCurrentIrpStackLocationToNext , чтобы задать расположение стека IRP. Драйвер не должен вызывать IoSkipCurrentIrpStackLocation , если он задает подпрограмму IoCompletion .

  • Вызовите IoSetCompletionRoutine , чтобы настроить подпрограмму IoCompletion .

    При обработке IRP включения питания устройства драйвер должен задать подпрограмму IoCompletion для восстановления контекста, освобождения блокировки удаления и выполнения других необходимых задач после завершения IRP и включения устройства. Драйвер не должен восстановить контекст до завершения IRP. Дополнительные сведения см. в разделе "Подпрограммы завершения ввода-вывода для запросов 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). Если драйверы находятся в очереди ввода-вывода, пока устройство в спящем режиме, или если устройству требуется стартовый ток, драйвер шины подает питание на устройство. В противном случае контроллер шины подает питание, когда необходимо взаимодействие с устройством.

Список рекомендаций по достижению быстрого времени запуска из состояний выключения, ожидания и спящего режима см. в разделе "Улучшение производительности запуска системы".