Share via


Fonction COPPSequenceStart

L’exemple de fonction COPPSequenceStart définit la session vidéo active en mode protégé.

Syntaxe

HRESULT COPPSequenceStart(
  _In_ COPP_DeviceData    pThis,
  _In_ DXVA_COPPSignature *pSeqStartInfo
);

Paramètres

pThis [in]

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

pSeqStartInfo [in]

  • Fournit un pointeur vers une structure DXVA_COPPSignature qui contient des informations sur la séquence de début.

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 le certificat matériel graphique au VMR avant de recevoir un appel à sa fonction COPPSequenceStart. Autrement dit, la fonction COPPKeyExchange doit être appelée avant COPPSequenceStart. Si COPPSequenceStart est appelé avant COPPKeyExchange, COPPSequenceStart doit retourner E_UNEXPECTED.

Après avoir fourni le certificat matériel graphique, l’appareil COPP DirectX VA ne doit recevoir qu’un seul appel à sa fonction COPPSequenceStart. Si l’appareil COPP DirectX VA reçoit un autre appel COPPSequenceStart, il doit retourner E_UNEXPECTED.

La fonction COPPSequenceStart reçoit une structure de DXVA_COPPSignature remplie qui contient une séquence de début, qui se compose des éléments suivants concaténés ensemble :

  • Nombre aléatoire 128 bits généré par le pilote et retourné via un appel à la fonction COPPKeyExchange du pilote
  • Clé de session d’intégrité des données aléatoires 128 bits
  • Numéro de séquence de départ aléatoire 32 bits status
  • Numéro de séquence de la commande de démarrage aléatoire 32 bits

La séquence de démarrage est chiffrée à l’aide de la clé publique du matériel graphique.

Mappage de RenderMoComp à COPPSequenceStart

L’exemple de fonction COPPSequenceStart est mappé 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 Zéro.
lpBufferInfo NULL.
dwFunction DXVA_COPPSequenceStartFnCode constante (définie dans dxva.h).
lpInputData Pointeur vers une structure DXVA_COPPSignature.
lpOutputData NULL.

Exemple de code

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

HRESULT
COPP_RSADecryptData(
    const BYTE* lpPrivateKey,
    DXVA_COPPSignature* pOutput,
    DXVA_COPPSignature* pInput
    )
{
    DWORD dwLen = sizeof(DXVA_COPPSignature);
    return RSADecPrivate(lpPrivateKey, (const BYTE *)pInput,
                         sizeof(DXVA_COPPSignature), (BYTE*) pOutput, &dwLen);
}

HRESULT
COPPSequenceStart(
    COPP_DeviceData* pThis,
    DXVA_COPPSignature* pSeqStartInfo
    )
{
    if (pThis->m_COPPDevState == COPP_KEY_EXCHANGED) {
        BYTE* pByte;
        DXVA_COPPSignature Decrypted;
        GUID rGraphicsDriver;
        HRESULT hr;
        COPP_RSADecryptData(PrivateKey, &Decrypted, pSeqStartInfo);
        pByte = (BYTE*)&Decrypted;
        memcpy(&rGraphicsDriver, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        memcpy(&pThis->m_KDI, pByte, sizeof(GUID));
        pByte += sizeof(GUID);
        memcpy(&pThis->m_StatusSeqNumber, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        memcpy(&pThis->m_CmdSeqNumber, pByte, sizeof(DWORD));
        pByte += sizeof(DWORD);
        hr = SetKey(&pThis->m_AesHelper, (BYTE*)&pThis->m_KDI, sizeof(GUID));
        if (hr != S_OK) {
            return hr;
        }
        if (!IsEqualGUID(&rGraphicsDriver, &pThis->m_rGraphicsDriver)) {
            return E_UNEXPECTED;
        }
        pThis->m_COPPDevState = COPP_SESSION_ACTIVE;
    }
    else {
        return E_UNEXPECTED;
    }
    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.