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