Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подпрограмма DispatchPower драйвера обеспечивает управление питанием, обрабатывая IRPs для кода функции I/O IRP_MJ_POWER. Связанными с кодом функции IRP_MJ_POWER являются несколько дополнительных кодов функций ввода-вывода для управления энергопотреблением. Диспетчер питания использует эти вспомогательные коды функций, чтобы направлять драйверы изменять состояния питания, ожидать событий пробуждения системы и реагировать на них, а также запрашивать драйверы о их устройствах.
Подпрограмма DispatchPower каждого драйвера выполняет следующие задачи:
По возможности обработайте IRP.
Передайте IRP следующему нижнему драйверу в стеке устройств с помощью PoCallDriver.
Если драйвер шины, выполните запрошенную операцию питания над устройством и завершите IRP.
Все драйверы для устройства должны иметь возможность обрабатывать IRP, связанные с питанием, за исключением нескольких случаев, когда функции или драйверу фильтра разрешено завершать IRP с ошибкой. Большинство драйверов функций и фильтров выполняют некоторую обработку или задают подпрограмму IoCompletion для каждого IRP энергопитания, а затем передают IRP вниз к следующему нижнему драйверу, не завершая его. В конце концов IRP достигает драйвера шины, который при необходимости физически изменяет состояние питания устройства и завершает выполнение IRP.
После завершения IRP диспетчер ввода-вывода вызывает все подпрограммы IoCompletion, которые устанавливаются драйверами по мере прохождения IRP по стеку устройств. Должен ли драйвер задать подпрограмму завершения, зависит от типа IRP и отдельных требований драйвера.
Power IRPs, которые включают устройство, должны обрабатываться сначала нижним драйвером в стеке устройств (базовым драйвером шины), а затем каждым последующим драйвером в стеке. IRP запросы на отключение питания должны сначала обрабатываться драйвером, находящимся на вершине стека устройств, а затем каждым последующим драйвером, ниже по стеку.
Специальная обработка съемных устройств
В своих подпрограммах DispatchPower драйверы съемных устройств должны проверять, присутствует ли устройство. Если устройство было удалено, драйвер не должен передавать IRP нижестоящему драйверу. Вместо этого драйвер должен выполнить следующее:
Вызовите PoStartNextPowerIrp, чтобы начать обработку следующего IRP питания.
Установите Irp-IoStatus.Status> в STATUS_DELETE_PENDING.
Вызовите IoCompleteRequest, указав IO_NO_INCREMENT, чтобы завершить IRP.
Возвращает STATUS_DELETE_PENDING.