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;
相关推荐
wuyk5551 小时前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite
乌暮3 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方4 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
flash俊杰5 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
2501_933923255 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵6 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛7 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5207 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
zhanlang02178 小时前
HTML 零基础入门到企业实战【第五章 5.4】内嵌网页 iframe 标签:嵌入网页、视频、地图实战
前端·html·音视频
TengTaiTech8 小时前
头戴耳机做运动相机外接麦:一颗麦克风同时服务蓝牙通话与 3.5mm 录音的底层重构
数码相机·音视频·蓝牙·qcc