Compartilhamento de contexto pep privado portcls
Começando com Windows 8, um driver de miniporto pode usar IPortClsRuntimePower, uma nova interface, para compartilhamento de contexto privado com o PEP (Plug-in do Windows Power Engine).
O driver de classe de porta de áudio (PortCls) foi atualizado para expor a nova interface, IPortClsRuntimePower, na porta WaveRT. Para que um driver de miniporte envie controles de energia privados para o PEP do sistema operacional, o driver de miniporte primeiro precisa obter acesso à interface IPortClsRuntimePower de sua porta associada. Em seguida, o driver de miniporto registra um retorno de chamada que é invocado no momento apropriado, permitindo que o driver de miniporte envie os controles de energia privados.
Acessando IPortClsRuntimePower
O driver de miniporte obtém acesso ao IPortClsRuntimePower de sua porta por meio da seguinte sequência de eventos:
O driver de miniporto chama PcNewPort e fornece IID_IPortWaveRT como REFID.
PcNewPort cria uma interface de porta (Pport) do tipo IPortWaveRT.
Em seguida, o driver de miniporto chama QueryInterface na interface de porta IPortWaveRT recém-criada e especifica IID_IPortClsRuntimePower como o GUID da interface.
A interface de porta IPortWaveRT fornece ao driver de miniporto um ponteiro para sua interface IPortClsRuntimePower .
O arquivo de cabeçalho Portcls.h define o GUID para iPortClsRuntimePower da seguinte maneira:
// {E057C351-0430-4DBC-B172-C711D40A2373}
DEFINE_GUID(IID_IPortClsRuntimePower,
0xe057c351, 0x430, 0x4dbc, 0xb1, 0x72, 0xc7, 0x11, 0xd4, 0xa, 0x23, 0x73);
Registrando um retorno de chamada
O driver de miniporto usa o método IPortClsRuntimePower::RegisterPowerControlCallback para registrar um retorno de chamada. Esse método é invocado quando o PEP inicia uma solicitação privada ou em resposta a uma solicitação privada iniciada pelo próprio driver de miniport. Normalmente, o registro de retorno de chamada deve ser executado enquanto o driver está tratando o irp PNP IRP_MN_START_DEVICE.
Além do ponteiro contextual fornecido no retorno de chamada, os outros parâmetros são definidos de forma idêntica às definições do PowerControlCallback da estrutura de energia de runtime. Além disso, o retorno de chamada do miniporto deve ser do tipo PCPFNRUNTIME_POWER_CONTROL_CALLBACK, conforme definido no snippet a seguir do arquivo de cabeçalho 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
);
Quando o driver é interrompido ou removido, ele deve usar o método IPortClsRuntimePower::UnregisterPowerControlCallback para cancelar o registro de quaisquer retornos de chamada registrados.
Enviando controles de energia privados
Depois que o miniporto estabelece o acesso a uma interface IPortClsRuntimePower e usa o método RegisterPowerControlCallback da interface para registrar um retorno de chamada, ele agora está pronto para enviar controles de energia privados. Quando o método de retorno de chamada é invocado, o driver de miniporto usa o método IPortClsRuntimePower::SendPowerControl para enviar os controles de energia privados para o PEP do Windows.
Com exceção do parâmetro DeviceObject , todos os outros parâmetros são definidos de forma idêntica àqueles para o método PoFxPowerControl da estrutura de energia de runtime.