Condividi tramite


Condivisione del contesto PEP privato portCls

A partire da Windows 8, un driver miniport può usare IPortClsRuntimePower, una nuova interfaccia, per la condivisione del contesto privato con il plug-in del motore di Windows Power.

Il driver della classe di porta audio (PortCls) è stato aggiornato per esporre la nuova interfaccia, IPortClsRuntimePower, sulla porta WaveRT. Per consentire a un driver miniport di inviare controlli di alimentazione privati al PEP del sistema operativo, il driver miniport deve prima accedere all'interfaccia IPortClsRuntimePower della porta associata. Il driver miniport registra quindi un callback richiamato al momento appropriato, consentendo al driver miniport di inviare i controlli di alimentazione privati.

Accesso a IPortClsRuntimePower

Il driver miniport ottiene l'accesso a IPortClsRuntimePower della porta tramite la sequenza di eventi seguente:

  1. Il driver miniport chiama PcNewPort e fornisce IID_IPortWaveRT come REFID.

  2. PcNewPort crea un'interfaccia porta (Pport) di tipo IPortWaveRT.

  3. Il driver miniport chiama quindi QueryInterface nell'interfaccia della porta IPortWaveRT appena creata e specifica IID_IPortClsRuntimePower come GUID dell'interfaccia.

  4. L'interfaccia della porta IPortWaveRT fornisce al driver miniport un puntatore all'interfaccia IPortClsRuntimePower .

Il file di intestazione Portcls.h definisce il GUID per IPortClsRuntimePower come indicato di seguito:

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

Registrazione di un callback

Il driver miniport usa il metodo IPortClsRuntimePower::RegisterPowerControlCallback per registrare un callback. Questo metodo viene richiamato quando il PEP avvia una richiesta privata o in risposta a una richiesta privata avviata dal driver miniport stesso. La registrazione del callback deve in genere essere eseguita mentre il driver gestisce il IRP_MN_START_DEVICE PNP Irp.

Oltre al puntatore al contesto fornito nel callback, gli altri parametri vengono definiti in modo identico alle definizioni per power framework di runtime PowerControlCallback. Inoltre, il callback del miniport deve essere di tipo PCPFNRUNTIME_POWER_CONTROL_CALLBACK, come definito nel frammento di codice seguente dal file di intestazione 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 il driver viene arrestato o rimosso, deve usare il metodo IPortClsRuntimePower::UnregisterPowerCallback per annullare la registrazione di eventuali callback registrati.

Invio di controlli di alimentazione privati

Dopo che il miniport stabilisce l'accesso a un'interfaccia IPortClsRuntimePower e usa il metodo RegisterPowerControlCallback dell'interfaccia per registrare un callback, è ora pronto per inviare controlli di alimentazione privati. Quando viene richiamato il metodo di callback, il driver miniport usa il metodo IPortClsRuntimePower::SendPowerControl per inviare i controlli di alimentazione privata a Windows PEP.

Ad eccezione del parametro DeviceObject , tutti gli altri parametri vengono definiti in modo identico a quelli per il metodo PoFxPowerControl del framework di runtime.