Общий доступ к контексту Частного PEP PortCls
Начиная с Windows 8, драйвер мини-порта может использовать новый интерфейс IPortClsRuntimePower для совместного использования частного контекста с помощью подключаемого модуля Windows Power Engine (PEP).
Драйвер класса аудиопорта (PortCls) был обновлен для предоставления нового интерфейса IPortClsRuntimePower на порту WaveRT. Чтобы драйвер мини-порта отправлял частные элементы управления питанием в PEP операционной системы, драйвер минипорта сначала должен получить доступ к интерфейсу IPortClsRuntimePower связанного порта. Затем драйвер мини-порта регистрирует обратный вызов, который вызывается в соответствующее время, позволяя драйверу минипорта отправлять частные элементы управления питанием.
Доступ к IPortClsRuntimePower
Драйвер мини-порта получает доступ к IPortClsRuntimePower своего порта через следующую последовательность событий:
Драйвер мини-порта вызывает PcNewPort и предоставляет IID_IPortWaveRT в качестве REFID.
PcNewPort создает интерфейс порта (Pport) типа IPortWaveRT.
Затем драйвер мини-порта вызывает QueryInterface во вновь созданном интерфейсе порта IPortWaveRT и указывает IID_IPortClsRuntimePower в качестве GUID интерфейса.
Интерфейс порта 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.