IDirect3DCryptoSession9::EncryptionBlt 方法 (d3d9.h)
从受保护的图面读取加密数据。
语法
HRESULT EncryptionBlt(
IDirect3DSurface9 *pSrcSurface,
IDirect3DSurface9 *pDstSurface,
UINT DstSurfaceSize,
VOID *pIV
);
参数
pSrcSurface
指向受保护图面的指针。
pDstSurface
指向接收加密数据的图面的指针。
DstSurfaceSize
pDstSurface 指向的表面内存的大小(以字节为单位)。 大小必须与驱动程序功能结构中的 BlockAlignmentSize 值保持一致;请参阅备注。
pIV
指向接收初始化向量 (IV) 的缓冲区的指针。 调用方分配此缓冲区,但驱动程序会生成 IV。
如果加密类型 D3DCRYPTOTYPE_AES128_CTR (128 位 AES-CTR) , 则 pIV 指向 D3DAES_CTR_IV 结构。 当驱动程序生成第一个 IV 时,它会将结构初始化为随机数。 对于每个后续 IV,驱动程序只需递增结构的 IV 成员,确保值始终增加。 此过程使应用程序能够验证同一个 IV 永远不会使用同一密钥对多次。
对于其他加密类型,可能使用不同的结构,或者加密可能不使用 IV。
返回值
如果该方法成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。
注解
如果驱动程序支持此方法,则会在 IDirect3DDevice9Video::GetContentProtectionCaps 方法返回的功能结构中设置D3DCPCAPS_ENCRYPTEDREADBACK标志。
如果驱动程序设置 D3DCPCAPS_ENCRYPTEDREADBACKKEY 功能标志,则表示驱动程序使用单独的密钥来加密数据。 若要获取此密钥,请调用 IDirect3DCryptoSession9::GetEncryptionBltKey 方法。 否则,驱动程序使用会话密钥来加密数据。
(pDstSurface) 分配目标图面,如下所示:
- 调用 IDirect3DCryptoSession9::GetSurfacePitch 以获取受保护图面的步长。
- 调用 GetContentProtectionCaps 方法以获取 D3DCONTENTPROTECTIONCAPS 结构中的 BufferAlignmentStart 和 BlockAlignmentSize 成员的值。
- 计算表面内存的最小大小,如 SysMemSize = 受保护的表面步幅×受保护的表面高度。
- 添加填充以适应 BufferAlignmentStart 和 BlockAlignmentSize 的值。
- 在系统内存中分配一个缓冲区,其大小等于 SysMemSize (包括填充) 。
- 如果系统内存缓冲区的地址未与 BufferAlignmentStart 的值对齐,则计算一个内存对齐指针,该指针与缓冲区的起始位置相差。
- 调用 IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx 来创建目标图面。 将内存对齐的指针作为共享资源句柄传递 (pSharedHandle) 。
- 方法无法读回子对象或部分加密的图面。
- 受保护的表面必须是屏幕外普通表面或呈现目标。
- 如前所述,目标图面必须是使用正确对齐方式创建的系统内存图面。
- 受保护的图面不能进行多重采样。
- 方法不支持拉伸或颜色空间转换。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 7 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 R2 [仅限桌面应用] |
目标平台 | Windows |
标头 | d3d9.h |