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


функция обратного вызова REQUEST_POWER_COMPLETE (wdm.h)

Подпрограмма обратного вызова PowerCompletion завершает обработку IRP power.

Синтаксис

REQUEST_POWER_COMPLETE RequestPowerComplete;

void RequestPowerComplete(
  [in]           PDEVICE_OBJECT DeviceObject,
  [in]           UCHAR MinorFunction,
  [in]           POWER_STATE PowerState,
  [in, optional] PVOID Context,
  [in]           PIO_STATUS_BLOCK IoStatus
)
{...}

Параметры

[in] DeviceObject

Указатель на целевой DEVICE_OBJECT для завершенного IRP питания.

[in] MinorFunction

Указывает дополнительный код функции в power IRP. Дополнительные сведения см. в списке поддерживаемых кодов IRP_MN_XXX в разделе Примечания.

[in] PowerState

Указывает состояние питания устройства или состояние питания системы , которое было передано подпрограмме PoRequestPowerIrp .

[in, optional] Context

Указатель на контекст, переданный в PoRequestPowerIrp.

[in] IoStatus

Указатель на структуру IO_STATUS_BLOCK для завершенного IRP.

Возвращаемое значение

None

Remarks

Драйверу, который отправляет IRP питания, может потребоваться выполнить дополнительные задачи после того, как все остальные драйверы завершат IRP. В этом случае отправляющий драйвер должен зарегистрировать подпрограмму обратного вызова PowerCompletion во время вызова подпрограммы PoRequestPowerIrp , которая выделяет IRP.

Подпрограмма обратного вызова PowerCompletion драйвера используется только для IRP_MJ_POWER IRP с незначительными кодами IRP IRP_MN_SET_POWER, IRP_MN_QUERY_POWER и IRP_MN_WAIT_WAKE. Дополнительные сведения см. в разделах Отправка IRP_MN_QUERY_POWER или IRP_MN_SET_POWER для состояний питания устройства и Процедуры обратного вызова ожидания и пробуждения.

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

Подпрограмма PowerCompletion вызывается по адресу IRQL = PASSIVE_LEVEL или IRQL = DISPATCH_LEVEL.

Примеры

Чтобы определить подпрограмму обратного вызова PowerCompletion , необходимо сначала предоставить объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить подпрограмму обратного вызова PowerCompletion с именем MyPowerCompletion, используйте тип REQUEST_POWER_COMPLETE, как показано в следующем примере кода:

REQUEST_POWER_COMPLETE MyPowerCompletion;

Затем реализуйте процедуру обратного вызова следующим образом:

_Use_decl_annotations_
VOID
  MyPowerCompletion(
    PDEVICE_OBJECT DeviceObject,
    UCHAR MinorFunction,
    POWER_STATE PowerState,
    PVOID Context,
    PIO_STATUS_BLOCK IoStatus
    )
  {
      // Function body
  }

Тип функции REQUEST_POWER_COMPLETE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте заметку в _Use_decl_annotations_ определение функции. Заметка _Use_decl_annotations_ гарантирует, что будут использоваться заметки, которые применяются к типу функции REQUEST_POWER_COMPLETE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в разделе Объявление функций с помощью типов ролей функций для драйверов WDM. Дополнительные сведения о _Use_decl_annotations_см. в статье Поведение функции с заметками.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
IRQL Вызывается в IRQL <= DISPATCH_LEVEL (см. раздел "Примечания").

См. также раздел

DEVICE_OBJECT

IO_STATUS_BLOCK

IRP_MJ_POWER

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IoCompletion

PoRequestPowerIrp