Share via


Fonction COPPKeyExchange

L’exemple de fonction COPPKeyExchange récupère le certificat numérique utilisé par le matériel graphique.

Syntaxe

HRESULT COPPKeyExchange(
  _In_  COPP_DeviceData pThis,
  _Out_ GUID            *pRandom,
  _Out_ BYTE            *pGHCertificate
);

Paramètres

pThis [in]

  • Pointeur vers l’objet d’appareil COPP DirectX VA.

pRandom [out]

  • Pointeur vers une variable qui reçoit un nombre aléatoire 128 bits.

pGHCertificate [out]

  • Pointeur vers une liste d’octets qui reçoit le certificat matériel graphique.

Valeur retournée

Retourne zéro (S_OK ou DD_OK) en cas de réussite ; sinon, retourne un code d’erreur.

Remarques

Un appareil COPP DirectX VA doit fournir la taille du certificat matériel graphique au VMR avant de recevoir un appel à sa fonction COPPKeyExchange. Autrement dit, la fonction COPPGetCertificateLength doit être appelée avant COPPKeyExchange. Si COPPKeyExchange est appelé avant COPPGetCertificateLength, COPPKeyExchange doit retourner E_UNEXPECTED.

Mappage de RenderMoComp à COPPKeyExchange

L’exemple de fonction COPPKeyExchange correspond directement à un appel au membre RenderMoComp de la structure DD_MOTIONCOMPCALLBACKS. Le membre RenderMoComp pointe vers la fonction de rappel DdMoCompRender fournie par le pilote d’affichage qui référence la structure DD_RENDERMOCOMPDATA.

La fonction de rappel RenderMoComp est appelée sans que la fonction BeginMoCompFrame ou EndMoCompFrame fournie par le pilote d’affichage soit appelée en premier.

La structure DD_RENDERMOCOMPDATA est remplie comme suit.

Membre Valeur
dwNumBuffers Nombre de mémoires tampons sur lpBufferInfo. La valeur est égale à 1.
lpBufferInfo Pointeur vers une seule surface de mémoire système RGB32 qui contient l’espace nécessaire pour contenir le certificat matériel. La longueur requise de la surface a été retournée dans l’appel à COPPGetCertificateLength.
Notez qu’une surface de mémoire système est utilisée pour renvoyer le certificat, car la taille du certificat peut dépasser la taille de la mémoire tampon maximale passée via le paramètre lpOutputData.
dwFunction DXVA_COPPKeyExchangeFnCode constante (définie dans dxva.h).
lpInputData NULL.
lpOutputData Pointeur vers un nombre aléatoire 128 bits généré par le pilote.

Exemple de code

Le code suivant fournit un exemple de la façon dont vous pouvez implémenter votre fonction COPPKeyExchange :

DWORD
COPP_Generate128BitRandomNumber()
{
    GUID RandNum;
    DWORD* pdw = (DWORD*)&RandNum;
    pdw[0] = rand();
    pdw[1] = rand();
    pdw[2] = rand();
    pdw[3] = rand();
    return RandNum;
}

HRESULT
COPPKeyExchange(
    COPP_DeviceData* pThis,
    GUID* pRandNumber,
    BYTE* pGHCertificate
    )
{
    if (pThis->m_COPPDevState != COPP_CERT_LENGTH_RETURNED) {
        return E_UNEXPECTED;
    }
    memcpy(pGHCertificate, (LPVOID)&TestCert, sizeof(TestCert));
    pThis->m_rGraphicsDriver = *pRandNumber = COPP_Generate128BitRandomNumber();
    pThis->m_COPPDevState = COPP_KEY_EXCHANGED;
    return NO_ERROR;
}

Configuration requise

Plateforme cible Version
Desktop (Expérience utilisateur) Cette fonction s’applique uniquement à Windows Server 2003 avec SP1 et versions ultérieures, et à Windows XP avec SP2 et versions ultérieures.