本部分仅适用于 Windows 7 及更高版本以及 Windows Server 2008 R2 及更高版本的 Windows作系统。
内容保护 DDI 是 Direct3D 版本 9 DDI 的扩展,用于保护视频。 内容保护 DDI 由本节中所述的入口点组成。
必需的内容保护 DDI 函数
如果在用户模式显示驱动程序中实现了内容保护,驱动程序必须支持以下内容保护 DDI 函数:
CreateAuthenticatedChannel 函数创建 Direct3D 运行时和驱动程序可用于设置和查询保护的通道。
AuthenticatedChannelKeyExchange 函数协商会话密钥。
QueryAuthenticatedChannel 函数查询经过身份验证的通道以获取功能和状态信息。
ConfigureAuthenticatedChannel 函数在经过身份验证的通道中设置状态。
DestroyAuthenticatedChannel 函数释放经过身份验证的通道的资源。
CreateCryptoSession 函数创建一个加密会话,Direct3D 运行时使用该会话来管理会话密钥,并执行传入和传出受保护内存中的加密作。
CryptoSessionKeyExchange 函数协商会话密钥。
DestroyCryptoSession 函数释放加密会话的资源。
内容保护功能
仅当用户模式显示驱动程序支持上述每个必需的内容保护 DDI 函数时,它才会上报内容保护功能。 Direct3D 运行时使用以下 D3DDDICAPS_TYPE 值来检索有关用户模式显示驱动程序支持的内容保护功能的信息。 运行时调用GetCaps时,驱动程序的GetCaps函数的pData参数指向的D3DDDIARG_GETCAPS结构中的Type成员中设置这些D3DDDICAPS_TYPE值。
D3DDDICAPS_GETCONTENTPROTECTIONCAPS
运行时为驱动程序应使用的特定加密和解码组合提供指向 DDICONTENTPROTECTIONCAPS 结构体的指针。 驱动程序返回一个指向已填充的D3DCONTENTPROTECTIONCAPS结构的指针,该结构描述了驱动程序在加密与解码组合下的内容保护能力。 有关D3DCONTENTPROTECTIONCAPS的详细信息,请参阅 DirectX SDK 文档。
D3DDDICAPS_GETCERTIFICATESIZE
驱动程序提供指向一个数字的指针,该数字指定用于通道或加密类型的驱动程序证书的大小(以字节为单位)。 然后,Direct3D 运行时使用该大小分配缓冲区,以保存运行时调用 GetCaps 时收到的证书信息,方法是使用 D3DDDICAPS_GETCERTIFICATE。
D3DDDICAPS_GETCERTIFICATE
运行时提供指向 DDICERTIFICATEINFO 结构的指针,该结构描述驱动程序应检索的证书。
对于经过身份验证的通道,驱动程序使用现有的 OPM 证书,该证书是一个由 Microsoft 根签名的 X.509 证书。
应用程序可以查询驱动程序的证书以确定以下信息:
驱动程序是否受信任。
是否吊销驱动程序。
驱动程序的公钥。 应用程序使用驱动程序的公钥为用于身份验证的通道建立会话密钥。
如果在 Direct3D 9 经过身份验证的通道上调用设置了 D3DDDICAPS_GETCERTIFICATE 的 GetCaps,则调用将失败,因为该通道不支持证书或身份验证。
对于加密会话,驱动程序返回给定加密类型的证书。 根据所使用的加密类型和密钥交换,证书可能或可能不会使用。 不同的加密类型也可以使用不同的证书。
可选内容保护 DDI 函数
驱动程序可以选择性地支持以下内容保护 DDI 函数:
EncryptionBlt 函数从受保护的图面读取加密数据。
GetPitch 函数检索受保护表面的行距。
StartSessionKeyRefresh 函数返回一个随机数,解码器/应用程序和驱动程序/硬件随后可以使用该函数执行具有会话键的独占 OR作(XOR)。
FinishSessionKeyRefresh 函数指示来自该时间点的所有缓冲区都将使用更新的会话键值。
GetEncryptionBltKey 函数返回用于解密驱动程序 EncryptionBlt 函数返回的数据的密钥。
DecryptionBlt 函数将数据写入受保护的图面。
内容保护的资源
Direct3D 运行时将以下 D3DDDI_RESOURCEFLAGS 标志用于受保护内容。 运行时在调用驱动程序的CreateResource函数时,通过pResource参数指向的D3DDDIARG_CREATERESOURCE结构的Flags成员中设置这些D3DDDI_RESOURCEFLAGS标志。
RestrictedContent
资源可能包含受保护的内容。 在应用程序创建资源之前,应用程序可能或可能尚未显式启用内容保护。 驱动程序应确保运行时将资源的分配放置在可以保护的内存池中。 驱动程序应允许创建可锁定的受保护资源。 但是,当启用内容保护时,驱动程序应显式地使对其 Lock 函数的调用失败,以防止锁定这些图面。
RestrictSharedAccess
只应允许特定进程访问共享资源。
驱动程序应限制对此资源的共享访问。 运行时只能调用驱动程序的 OpenResource 函数,以便在创建资源的进程内使用显示设备(hDevice)打开此资源,或由那些通过经过身份验证的通道显式授予访问权限的显示设备打开此资源。