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;
相关推荐
夜听莺儿鸣3 小时前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程
笨小孩@GF 知行合一4 小时前
易语言-高级应用
数据库·编程·易语言·中文编程
硬件学长森哥4 小时前
成像技术实例-HDR视频技术基础
图像处理·音视频
KaiwuDB4 小时前
KaiwuDB 运维实战04:DRBD + KaiwuDB——物联网场景下的低成本数据库高可用方案
运维·数据库·物联网·时序数据库·kaiwudb·aiot·多模数据库
夜雪一千6 小时前
MySQL外键彻底入门:是什么、怎么用、什么时候不该用
数据库·mysql
qq_334466866 小时前
删除SSMS的历史登录记录
数据库·sql
zl_dfq6 小时前
Redis 之 【常见面试题总结】(从数据类型到高可用、缓存一致性全解析)
数据库·redis
龙亘川6 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
kv1107 小时前
Android studio国内开发有关
java·数据库·android studio