Partager via


Partage de contexte PEP privé PortCls

À compter de Windows 8, un pilote miniport peut utiliser IPortClsRuntimePower, une nouvelle interface, pour le partage de contexte privé avec le plug-in Windows Power Engine (PEP).

Le pilote de classe de port audio (PortCls) a été mis à jour pour exposer la nouvelle interface, IPortClsRuntimePower, sur le port WaveRT. Pour qu’un pilote miniport envoie des contrôles d’alimentation privés au PEP du système d’exploitation, le pilote miniport doit d’abord accéder à l’interface IPortClsRuntimePower de son port associé. Le pilote miniport enregistre ensuite un rappel appelé au moment approprié, ce qui permet au pilote miniport d’envoyer les commandes d’alimentation privées.

Accès à IPortClsRuntimePower

Le pilote miniport obtient l’accès à son port IPortClsRuntimePower via la séquence d’événements suivante :

  1. Le pilote miniport appelle PcNewPort et fournit IID_IPortWaveRT comme REFID.

  2. PcNewPort crée une interface de port (Pport) de type IPortWaveRT.

  3. Le pilote miniport appelle ensuite QueryInterface dans l’interface de port IPortWaveRT nouvellement créée et spécifie IID_IPortClsRuntimePower comme GUID d’interface.

  4. L’interface de port IPortWaveRT fournit au pilote miniport un pointeur vers son interface IPortClsRuntimePower .

Le fichier d’en-tête Portcls.h définit le GUID pour IPortClsRuntimePower comme suit :

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

Inscription d’un rappel

Le pilote miniport utilise la méthode IPortClsRuntimePower::RegisterPowerControlCallback pour inscrire un rappel. Cette méthode est appelée soit lorsque le peps lance une demande privée, soit en réponse à une demande privée initiée par le pilote miniport lui-même. L’inscription de rappel doit généralement être effectuée pendant que le pilote gère le IRP_MN_START_DEVICE IRP PNP.

Mis à part le pointeur de contexte fourni dans le rappel, les autres paramètres sont définis de manière identique aux définitions de PowerControlCallback de l’infrastructure d’exécution. En outre, le rappel du miniport doit être de type PCPFNRUNTIME_POWER_CONTROL_CALLBACK, comme défini dans l’extrait de code suivant du fichier d’en-tête 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
);

Lorsque le pilote est arrêté ou supprimé, il doit utiliser la méthode IPortClsRuntimePower::UnregisterPowerControlCallback pour annuler l’inscription des rappels inscrits.

Envoi de contrôles d’alimentation privés

Une fois que le miniport a établi l’accès à une interface IPortClsRuntimePower et utilise la méthode RegisterPowerControlCallback de l’interface pour inscrire un rappel, il est maintenant prêt à envoyer des contrôles d’alimentation privés. Lorsque la méthode de rappel est appelée, le pilote miniport utilise la méthode IPortClsRuntimePower::SendPowerControl pour envoyer les contrôles d’alimentation privés au pep Windows.

À l’exception du paramètre DeviceObject , tous les autres paramètres sont définis de façon identique à ceux de la méthode PoFxPowerControl de l’infrastructure d’alimentation du runtime.