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


Общий доступ к контексту Частного PEP PortCls

Начиная с Windows 8, драйвер мини-порта может использовать новый интерфейс IPortClsRuntimePower для совместного использования частного контекста с помощью подключаемого модуля Windows Power Engine (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 PNP IRP.

Помимо указателя контекста, предоставленного в обратном вызове, другие параметры определяются так же, как и определения PowerControlCallback платформы power framework среды выполнения. Кроме того, обратный вызов мини-порта должен иметь тип 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::UnregisterPowerCallback , чтобы отменить регистрацию зарегистрированных обратных вызовов.

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

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

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