Приватный обмен контекстом PEP PortCls

Начиная с Windows 8, минипорт-драйвер может использовать новый интерфейс IPortClsRuntimePower для обмена частным контекстом с модулем Windows Power Engine Plug-in (PEP).

Драйвер класса аудиопорта (PortCls) был обновлен, чтобы предоставить новый интерфейс IPortClsRuntimePower на порту WaveRT. Для того чтобы минипорт-драйвер мог отправлять приватные команды управления питанием в PEP операционной системы, он сначала должен получить доступ к интерфейсу IPortClsRuntimePower своего связанного порта. Затем драйвер минипорта регистрирует обратный вызов, который вызывается в соответствующее время, позволяя драйверу минипорта отправлять собственные элементы управления питанием.

Доступ к IPortClsRuntimePower

Драйвер минипорта получает доступ к портовому IPortClsRuntimePower через следующую последовательность событий:

  1. Драйвер минипорта вызывает PcNewPort и предоставляет IID_IPortWaveRT в качестве REFID.

  2. PcNewPort создает интерфейс порта (Pport) типа IPortWaveRT.

  3. Затем драйвер минипорта вызывает QueryInterface в только что созданном интерфейсе порта IPortWaveRT и указывает IID_IPortClsRuntimePower в качестве GUID интерфейса.

  4. Интерфейс порта IPortWaveRT предоставляет минипорт-драйверу указатель на его интерфейс IPortClsRuntimePower.

Файл заголовка Portcls.h определяет GUID для IPortClsRuntimePower следующим образом:

// {E057C351-0430-4DBC-B172-C711D40A2373}
DEFINE_GUID(IID_IPortClsRuntimePower,
0xe057c351, 0x430, 0x4dbc, 0xb1, 0x72, 0xc7, 0x11, 0xd4, 0xa, 0x23, 0x73);

Регистрация обратного вызова

Минипорт-драйвер использует метод IPortClsRuntimePower::RegisterPowerControlCallback для регистрации обратного вызова. Этот метод вызывается либо при запуске частного запроса PEP, либо в ответ на частный запрос, инициированный самим драйвером минипорта. Регистрация обратного вызова обычно должна выполняться, пока драйвер обрабатывает IRP_MN_START_DEVICE Irp PNP.

Помимо указателя контекста, предоставленного в обратном вызове, другие параметры определяются идентично определениям для PowerControlCallback в рамках среды управления питанием времени выполнения. Кроме того, обратный вызов мини-порта должен иметь тип PCPFNRUNTIME_POWER_CONTROL_CALLBACK, как определено в следующем фрагменте из файла заголовка Portcls.h .

typedef
NTSTATUS
_IRQL_requires_max_(DISPATCH_LEVEL)
(*PCPFNRUNTIME_POWER_CONTROL_CALLBACK)
(
    _In_        LPCGUID PowerControlCode,
    _In_opt_    PVOID   InBuffer,
    _In_        SIZE_T  InBufferSize,
    _Out_opt_   PVOID   OutBuffer,
    _In_        SIZE_T  OutBufferSize,
    _Out_opt_   PSIZE_T BytesReturned,
    _In_opt_    PVOID   Context
);

При остановке или удалении драйвера необходимо использовать метод IPortClsRuntimePower::UnregisterPowerControlCallback для отмены регистрации всех зарегистрированных обратных вызовов.

Отправка частных элементов управления питанием

После того как минипорт устанавливает доступ к интерфейсу IPortClsRuntimePower и использует метод RegisterPowerControlCallback интерфейса для регистрации обратного вызова, теперь он готов отправлять частные элементы управления питанием. При вызове метода обратного вызова драйвер минипорта использует метод IPortClsRuntimePower::SendPowerControl для отправки частных элементов управления питанием в PEP Windows.

За исключением параметра DeviceObject , все остальные параметры определяются одинаково для метода PoFxPowerControl платформы среды выполнения.