Поделиться через


Использование сеанса шифрования с декодером DirectX Video Accelerator 2.0

Этот раздел относится только к Windows 7 и более поздних версий, а также Windows Server 2008 R2 и более поздних версий операционной системы Windows.

Драйвер отображения пользовательского режима может связать сеанс шифрования с устройством декодирования DirectX Video Accelerator (VA) 2.0, чтобы устройство декодирования DirectX VA 2.0 использовало ключ сеанса сеанса. Если среда выполнения Direct3D указывает допустимый GUID декодирования в элементе DecodeProfile структуры D3DDDIARG_CREATECRYPTOSESSION , когда среда выполнения вызывает функцию CreateCryptoSession драйвера для создания сеанса шифрования, среда выполнения может впоследствии вызвать функцию ConfigureAuthenticatedChannel драйвера с D3DAUTHETICATEDCONFIGURE_CRYPTOSESSION для настройки сеанса шифрования с помощью устройства декодирования DirectX VA 2.0. Перед настройкой сеанса шифрования с помощью устройства декодирования DirectX VA 2.0 среда выполнения должна вызвать функцию DecodeExtensionExecute драйвера, чтобы получить дескриптор драйвера для устройства декодирования DirectX VA 2.0. Среда выполнения задает членам структуры D3DDDIARG_DECODEEXTENSIONEXECUTE следующие значения, чтобы получить дескриптор драйвера для устройства декодирования DirectX VA 2.0:

#define DXVA2_DECODE_GET_DRIVER_HANDLE    0x725
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_GET_DRIVER_HANDLE;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = 0;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = HANDLE*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = sizeof(HANDLE);

Когда среда выполнения вызывает функцию CreateDecodeDevice драйвера для создания устройства декодирования DirectX VA 2.0, среда выполнения задает нули для идентификаторов GUID шифрования декодирования в структуре DXVADDI_CONFIGPICTUREDECODE .

После того как среда выполнения вызывает функцию CreateCryptoSession драйвера с элементом CryptoTypeD3DDDIARG_CREATECRYPTOSESSION структуры, для D3DCRYPTOTYPE_AES128_CTR для создания криптосеанса, параметр элемента pPVPSetKeyструктуры D3DDDIARG_DECODEBEGINFRAME в вызове функции DecodeBeginFrame драйвера для декодирования кадра указывает на следующие значения:

  • Если параметр pPVPSetKey имеет значение NULL, ни один из буферов для кадра не содержит зашифрованные данные и, следовательно, не требует расшифровки.

  • Если pPVPSetKey указывает на NULL_GUID (все нули), буферы для кадра шифруются с помощью ключа сеанса.

  • Если pPVPSetKey указывает на ключ содержимого, это означает, что приложение использовало ключ сеанса для шифрования ключа содержимого. Драйвер должен использовать этот ключ содержимого для расшифровки всех зашифрованных буферов, связанных с этим кадром.

Вектор инициализации для каждого зашифрованного буфера отображается в элементе pCipherCounterструктуры DXVADDI_DECODEBUFFERDESC при вызове функции DecodeExecute драйвера. Драйвер должен завершить вызов функции DecodeExecute , если он определяет, что вектор инициализации ранее использовался для того же ключа содержимого (или сеансового ключа, если ключ содержимого не используется). Приложение должно увеличивать iv членDXVADDI_PVP_HW_IV для каждого буфера, зашифрованного приложением. Таким образом, функция DecodeExecute драйвера может завершиться ошибкой, если элемент IV меньше или равен предыдущему значению IV , переданного в DecodeExecute.

Если среда выполнения должна частично шифровать буферы, она вызывает функцию DecodeExtensionExecute драйвера и задает членам структуры D3DDDIARG_DECODEEXTENSIONEXECUTE следующие значения, чтобы указать, какие блоки должен шифровать драйвер:

#define DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS    0x724
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = D3DENCRYPTED_BLOCK_INFO*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = sizeof(D3DENCRYPTED_BLOCK_INFO);
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = 0;