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


Процедуры IoCompletion для irp питания устройства

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

Каждый раз, когда устройство переходит в состояние D0, каждый из его драйверов должен задать подпрограмму IoCompletion , которая выполняет большинство задач, необходимых для возвращения его в рабочее состояние. Драйверы должны задать подпрограмму IoCompletion для любого перехода в состояние D0, независимо от того, возвращается ли устройство из спящего состояния или переходит в D0 при запуске системы. На следующем рисунке показаны задачи, которые должна выполнять подпрограмма IoCompletion .

схема, иллюстрирующая процедуру iocompletion для включения питания устройства.

Ниже перечислены эти задачи.

  • Восстановление состояния питания устройства или повторная инициализация устройства при необходимости и подготовка к обработке любых операций ввода-вывода, помещенных в очередь драйверами, пока устройство не находилось в рабочем состоянии

  • Вызов PoSetPowerState для уведомления диспетчера питания о том, что устройство находится в состоянии питания D0.

  • Вызов Метода PoStartNextPowerIrp для получения следующего IRP питания, если драйвер изначально не отправил текущее IRP питания. (Только Windows Server 2003, Windows XP и Windows 2000).

  • Освобождение памяти, выделенной для контекста устройства.

  • Вызов IoReleaseRemoveLock для освобождения блокировки, полученной драйвером в подпрограмме DispatchPower при получении IRP.

  • Возврат STATUS_SUCCESS.

Водитель шины не заключит устройство до тех пор, пока его или более высокие водители не должны взаимодействовать с устройством.

Когда устройство переходит в спящий режим, драйвер должен установить подпрограмму IoCompletion , которая вызывает PoStartNextPowerIrp (только Windows Server 2003, Windows XP и Windows 2000), и снять блокировку. Помните, что драйвер не может получить доступ к устройству, пока устройство находится в спящем режиме.