Fungsi COPPSequenceStart

Contoh fungsi COPPSequenceStart mengatur sesi video saat ini ke mode terlindungi.

Sintaks

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

Parameter

pThis [in]

  • Arahkan ke objek perangkat COPP DirectX VA.

pSeqStartInfo [in]

  • Memasok pointer ke struktur DXVA_COPPSignature yang berisi informasi tentang urutan mulai.

Mengembalikan nilai

Mengembalikan nol (S_OK atau DD_OK) jika berhasil; jika tidak, mengembalikan kode kesalahan.

Keterangan

Perangkat COPP DirectX VA harus menyediakan sertifikat perangkat keras grafis ke VMR sebelum menerima panggilan ke fungsi COPPSequenceStart-nya. Artinya, fungsi COPPKeyExchange harus dipanggil sebelum COPPSequenceStart. Jika COPPSequenceStart dipanggil sebelum COPPKeyExchange, COPPSequenceStart harus mengembalikan E_UNEXPECTED.

Setelah memberikan sertifikat perangkat keras grafis, perangkat COPP DirectX VA seharusnya hanya menerima satu panggilan ke fungsi COPPSequenceStart-nya. Jika perangkat COPP DirectX VA menerima panggilan COPPSequenceStart lain, perangkat harus mengembalikan E_UNEXPECTED.

Fungsi COPPSequenceStart menerima struktur DXVA_COPPSignature yang diisi yang berisi urutan awal, yang terdiri dari item berikut yang digabungkan bersama-sama:

  • Angka acak 128-bit yang dihasilkan oleh driver dan dikembalikan melalui panggilan ke fungsi COPPKeyExchange driver
  • Kunci sesi integritas data acak 128-bit
  • Nomor urutan status awal acak 32-bit
  • Nomor urutan perintah awal acak 32-bit

Urutan mulai dienkripsi dengan menggunakan kunci publik perangkat keras grafis.

Pemetaan RenderMoComp ke COPPSequenceStart

Sampel fungsi COPPSequenceStart memetakan langsung ke panggilan ke anggota RenderMoComp dari struktur DD_MOTIONCOMPCALLBACKS. Anggota RenderMoComp menunjuk ke fungsi panggilan balik DdMoCompRender yang disediakan driver tampilan yang mereferensikan struktur DD_RENDERMOCOMPDATA.

Fungsi panggilan balik RenderMoComp dipanggil tanpa fungsi BeginMoCompFrame atau EndMoCompFrame yang disediakan driver tampilan dipanggil terlebih dahulu.

Struktur DD_RENDERMOCOMPDATA diisi sebagai berikut.

Anggota Nilai
dwNumBuffers Nol.
lpBufferInfo NULL.
dwFunction DXVA_COPPSequenceStartFnCode konstanta (didefinisikan dalam dxva.h).
lpInputData Penunjuk ke struktur DXVA_COPPSignature.
lpOutputData NULL.

Contoh Kode

Kode berikut memberikan contoh bagaimana Anda dapat mengimplementasikan fungsi COPPSequenceStart Anda:

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;
}

Persyaratan

Platform target Versi
Desktop Fungsi ini hanya berlaku untuk Windows Server 2003 dengan SP1 dan yang lebih baru, dan Windows XP dengan SP2 dan yang lebih baru.