Функция COPPSequenceStart

Пример функции COPPSequenceStart задает для текущего видеосеанса защищенный режим.

Синтаксис

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

Параметры

pЭто [in]

  • Указатель на объект устройства COPP DirectX VA.

pSeqStartInfo [in]

  • Предоставляет указатель на структуру DXVA_COPPSignature, содержащую сведения о начальной последовательности.

Возвращаемое значение

Возвращает ноль (S_OK или DD_OK) в случае успешного выполнения; в противном случае возвращает код ошибки.

Комментарии

Устройство COPP DirectX VA должно предоставить сертификат графического оборудования виртуальной машине перед получением вызова функции COPPSequenceStart. То есть перед COPPSequenceStart следует вызвать функцию COPPKeyExchange. Если метод COPPSequenceStart вызывается перед COPPKeyExchange, метод COPPSequenceStart должен возвращать E_UNEXPECTED.

После предоставления сертификата графического оборудования устройство COPP DirectX VA должно получить только один вызов функции COPPSequenceStart. Если устройство COPP DirectX VA получает другой вызов COPPSequenceStart, оно должно вернуть E_UNEXPECTED.

Функция COPPSequenceStart получает заполненную структуру DXVA_COPPSignature, содержащую последовательность запуска, которая состоит из следующих элементов, объединенных вместе:

  • 128-битовое случайное число, созданное драйвером и возвращенное посредством вызова функции COPPKeyExchange драйвера
  • 128-разрядный случайный ключ сеанса целостности данных
  • 32-разрядный случайный порядковый номер начального состояния
  • 32-разрядный случайный начальный порядковый номер команды

Последовательность запуска шифруется с помощью открытого ключа графического оборудования.

Сопоставление RenderMoComp с COPPSequenceStart

Пример функции COPPSequenceStart напрямую сопоставляется с вызовом элемента RenderMoComp структуры DD_MOTIONCOMPCALLBACKS. Элемент RenderMoComp указывает на функцию обратного вызова DdMoCompRender, предоставляемую драйвером дисплея, которая ссылается на структуру DD_RENDERMOCOMPDATA.

Функция обратного вызова RenderMoComp вызывается без первого вызова функции BeginMoCompFrame или EndMoCompFrame, предоставленной драйвером дисплея.

Структура DD_RENDERMOCOMPDATA заполняется следующим образом.

Член Значение
DwNumBuffers Ноль.
lpBufferInfo NULL.
DwFunction DXVA_COPPSequenceStartFnCode константой (определяется в dxva.h).
lpInputData Указатель на структуру DXVA_COPPSignature.
lpOutputData NULL.

Пример кода

В следующем коде приведен пример реализации функции 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;
}

Requirements

Целевая платформа Версия
Персональный компьютер Эта функция применяется только к Windows Server 2003 с пакетом обновления 1 (SP1) и более поздним версиям, а также Windows XP с пакетом обновления 2 (SP2) и более поздним версиям.