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;
相关推荐
李宥小哥1 分钟前
SQLite03-数据库管理
数据库
『六哥』15 分钟前
MySQL 版本安装教程
数据库·mysql
AC赳赳老秦25 分钟前
工业互联网赋能智造:DeepSeek解析产线传感器数据驱动质量管控新范式
前端·数据库·人工智能·zookeeper·json·flume·deepseek
Black蜡笔小新42 分钟前
视频融合平台EasyCVR融合无线监控,打造智能高效安防解决方案
ffmpeg·音视频
小北方城市网1 小时前
第 10 课:Python 全体系实战整合与职业进阶指南(完结篇)
大数据·开发语言·数据库·python
韩立学长1 小时前
基于Springboot建筑物保护可视化系统rk6tni53(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
量化风云1 小时前
2026量化新基建(二) - sqlite 与 sqlite-utils
数据库·python·sqlite·量化交易·量化交易课程
Element_南笙1 小时前
BUG:ModuleNotFoundError: No module named ‘milvus_lite‘
java·服务器·数据库
我的offer在哪里1 小时前
客户端音视频开发全指南
音视频
code tsunami1 小时前
如何将 Helium 与 CapSolver 集成,实现无缝 CAPTCHA 自动化解决
运维·数据库·人工智能·爬虫·python·自动化