window显示驱动开发—将加密会话与 DirectX 视频加速器 2.0 解码器配合使用

用户模式显示驱动程序可以将加密会话与 DirectX 视频加速器 (VA) 2.0 解码设备相关联,使 DirectX VA 2.0 解码设备使用加密会话的会话密钥。 如果当运行时调用驱动程序的 CreateCryptoSession 函数创建加密会话时,Direct3D 运行时在 D3DDDIARG_CREATECRYPTOSESSION 结构的 DecodeProfile 成员中指定了有效的解码 GUID,则运行时随后可以调用驱动程序的 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 解码设备时,运行时为 DXVADDI_CONFIGPICTUREDECODE 结构中的解码加密 GUID 指定零。

在运行时调用驱动程序的 CreateCryptoSession 函数,并将 D3DDDIARG_CREATECRYPTOSESSION 结构的 CryptoType 成员设置为 D3DCRYPTOTYPE_AES128_CTR 以创建加密会话后,调用驱动程序的 DecodeBeginFrame 函数解码帧时,D3DDDIARG_DECODEBEGINFRAME 结构的pPVPSetKey 成员的设置指示以下含义:

如果 pPVPSetKey 设置为 NULL,则帧的缓冲区均不包含加密数据,因此不需要解密。

如果 pPVPSetKey 指向NULL_GUID (所有零) ,则帧的缓冲区使用会话密钥进行加密。

如果 pPVPSetKey 指向内容密钥,则表示应用程序使用会话密钥来加密内容密钥。 驱动程序应使用此内容密钥来解密与此帧关联的所有加密缓冲区。

在调用驱动程序的 DecodeExecute 函数时,每个加密缓冲区的初始化向量显示在 DXVADDI_DECODEBUFFERDESC 结构的 pCipherCounter 成员中。 如果驱动程序确定初始化向量以前用于相同的内容密钥 (或会话密钥(如果未在) 使用内容密钥),则驱动程序应使对其 DecodeExecute 函数的调用失败。 对于应用程序加密的每个缓冲区,应用程序应递增DXVADDI_PVP_HW_IV的 IV 成员。 因此,如果 IV 成员小于或等于传递给 DecodeExecute 的上一个 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;
相关推荐
武子康几秒前
Java-109 深入浅出 MySQL MHA主从故障切换机制详解 高可用终极方案
java·数据库·后端·mysql·性能优化·架构·系统架构
专注API从业者2 小时前
基于 Node.js 的淘宝 API 接口开发:快速构建异步数据采集服务
大数据·前端·数据库·数据挖掘·node.js
前端无冕之王2 小时前
一份兼容多端的HTML邮件模板实践与详解
前端·css·数据库·html
这周也會开心2 小时前
SQL-重要常见关键字
数据库·sql
超级无敌永恒暴龙战士3 小时前
MySQL-delete tableName from ...
数据库·mysql
叫我阿柒啊3 小时前
Java全栈开发工程师的面试实战:从基础到微服务
java·数据库·spring boot·微服务·node.js·vue3·全栈开发
信工 18024 小时前
中断下文---linux驱动开发
linux·驱动开发
郭俊强7 小时前
nestjs 连接redis
数据库·redis·缓存
海边捡石子7 小时前
postgress数据迁移gaussdb注意事项
数据库
chen_note7 小时前
Redis数据持久化——RDB快照和Aof日志追加
java·数据库·mybatis·持久化·aof·rdb