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


Отправка IRP устройства Set-Power в ответ на системный IRP Set-Power

Владелец политики энергопотребления устройства должен выполнить следующие действия, чтобы обработать системный запрос на установление уровня мощности (IRP):

  1. Вызовите IoAcquireRemoveLock, передав текущий IRP в качестве параметра Тег, чтобы драйвер не получил запрос Plug and Play IRP_MN_REMOVE_DEVICE при обработке IRP электропитания.

    Если IoAcquireRemoveLock возвращает состояние сбоя, драйвер не должен продолжать обработку IRP. Вместо этого, начиная с Windows Vista, драйвер должен вызвать IoCompleteRequest , чтобы завершить запрос, а затем вернуть состояние сбоя. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен сначала вызвать PoStartNextPowerIrp, вызвать IoCompleteRequest , чтобы завершить IRP, а затем вернуть состояние сбоя.

  2. Настройте расположение стека IRP для следующего нижележащего драйвера, вызвав IoCopyCurrentIrpStackLocationToNext.

  3. Установите процедуру IoCompletion в системный IRP для управления питанием.

  4. Вызовите IoMarkIrpPending, чтобы пометить системный IRP управления питанием как ожидающий.

  5. Используйте IoCallDriver (начиная с Windows Vista) или PoCallDriver (в Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP изменения состояния питания системы следующему нижестоящему драйверу.

  6. Возвращает STATUS_PENDING из подпрограммы DispatchPower .

В подпрограмме IoCompletion (см. шаг 3 в предыдущем списке) владелец политики питания устройства инициирует IRP установки питания устройства следующим образом:

  1. Проверьте систему управления питанием IRP, чтобы получить запрошенное состояние системы питания. Выберите соответствующее состояние питания устройства для этого состояния питания системы. Дополнительные сведения см. в разделе "Определение правильного состояния питания устройства".

  2. Вызовите PoRequestPowerIrp, чтобы отправить IRP_MN_SET_POWER для состояния питания устройства, определенного на шаге 1. Владелец политики питания должен отправить запрос на настройку питания устройства, даже если устройство уже находится в этом состоянии.

  3. Укажите подпрограмму обратного вызова power-completion (CompletionFunction) в вызове PoRequestPowerIrp и передайте IRP для установки питания системы в буфер Context.

  4. Верните STATUS_MORE_PROCESSING_REQUIRED из подпрограммы IoCompletion , чтобы драйвер смог завершить обработку системного набора данных IRP в подпрограмме обратного вызова завершения питания.

Помните, что владелец политики питания устройства не только отправляет IRP установки питания устройства, но и должен обрабатывать этот IRP по мере прохождения через стек устройств. Следовательно, владелец политики питания устройства может иметь не только callback-рутину завершения питания, связанную с IRP установки питания устройства и подпрограммой IoCompletion для системного IRP установки питания, но и подпрограмму IoCompletion для IRP установки питания устройства. Дополнительные сведения см. в разделе "Обработка IRP_MN_SET_POWER для состояний питания устройств".

После того как диспетчер ввода-вывода вызывает все подпрограммы IoCompletion, заданные на этапе продвижения IRP установки мощности по стеку устройств, он вызывает подпрограмму обратного вызова завершения питания. К этому времени все драйверы в стеке завершили обработку IRP установки питания устройства, и переход питания устройства завершён.

Подпрограмма обратного вызова power-completion должна выполнять следующие действия:

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

  2. Завершите системный сет-пауэр IRP (IoCompleteRequest) с состоянием, возвращённым для устройства сет-пауэр IRP.

  3. Вызовите IoReleaseRemoveLock, чтобы освободить ранее приобретенный замок.

  4. Возвращает состояние, с помощью которого завершены операции irPs с набором питания.