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;
相关推荐
NineData11 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData16 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师18 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石1 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤4 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区5 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1775 天前
《从零搭建NestJS项目》
数据库·typescript
加号36 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql