Использование сеанса шифрования с декодером 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;