Uso compartido de contexto de PEP privado de PortCls
A partir de Windows 8, un controlador de minipuerto puede usar IPortClsRuntimePower, una nueva interfaz, para el uso compartido de contexto privado con el complemento del motor de energía de Windows (PEP).
El controlador de clase de puerto de audio (PortCls) se ha actualizado para exponer la nueva interfaz, IPortClsRuntimePower, en el puerto WaveRT. Para que un controlador de miniporte envíe controles de alimentación privados al PEP del sistema operativo, el controlador de miniporte primero tiene que obtener acceso a la interfaz IPortClsRuntimePower de su puerto asociado. A continuación, el controlador de minipuerto registra una devolución de llamada que se invoca en el momento adecuado, lo que permite que el controlador de miniporte envíe los controles de alimentación privados.
Acceso a IPortClsRuntimePower
El controlador de minipuerto obtiene acceso a IPortClsRuntimePower de su puerto a través de la siguiente secuencia de eventos:
El controlador de minipuerto llama a PcNewPort y proporciona IID_IPortWaveRT como REFID.
PcNewPort crea una interfaz de puerto (Pport) de tipo IPortWaveRT.
A continuación, el controlador de miniporte llama a QueryInterface en la interfaz de puerto IPortWaveRT recién creada y especifica IID_IPortClsRuntimePower como GUID de interfaz.
La interfaz de puerto IPortWaveRT proporciona al controlador de miniporte un puntero a su interfaz IPortClsRuntimePower .
El archivo de encabezado Portcls.h define el GUID para IPortClsRuntimePower de la siguiente manera:
// {E057C351-0430-4DBC-B172-C711D40A2373}
DEFINE_GUID(IID_IPortClsRuntimePower,
0xe057c351, 0x430, 0x4dbc, 0xb1, 0x72, 0xc7, 0x11, 0xd4, 0xa, 0x23, 0x73);
Registro de una devolución de llamada
El controlador de minipuerto usa el método IPortClsRuntimePower::RegisterPowerControlCallback para registrar una devolución de llamada. Este método se invoca cuando el PEP inicia una solicitud privada o en respuesta a una solicitud privada iniciada por el propio controlador de miniport. Normalmente, el registro de devolución de llamada debe realizarse mientras el controlador controla el IRP_MN_START_DEVICE irp de PNP.
Aparte del puntero Context que se proporciona en la devolución de llamada, los demás parámetros se definen de forma idéntica a las definiciones de PowerControlCallback del entorno de ejecución de Power Framework. Además, la devolución de llamada del miniport debe ser de tipo PCPFNRUNTIME_POWER_CONTROL_CALLBACK, tal como se define en el siguiente fragmento de código del archivo de encabezado 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
);
Cuando el controlador se detiene o quita, debe usar el método IPortClsRuntimePower::UnregisterPowerControlCallback para anular el registro de las devoluciones de llamada registradas.
Envío de controles de energía privados
Una vez que la miniporte establece el acceso a una interfaz IPortClsRuntimePower y usa el método RegisterPowerControlCallback de la interfaz para registrar una devolución de llamada, ahora está listo para enviar controles de energía privados. Cuando se invoca el método de devolución de llamada, el controlador de miniport usa el método IPortClsRuntimePower::SendPowerControl para enviar los controles de energía privados al PEP de Windows.
Con la excepción del parámetro DeviceObject , todos los demás parámetros se definen de forma idéntica a las del método PoFxPowerControl de Power Framework en tiempo de ejecución.