функция обратного вызова 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 (см. раздел "Примечания"). |