IDirect3DCryptoSession9::D ecryptionBlt 方法 (d3d9.h)
将加密数据写入受保护的图面。
语法
HRESULT DecryptionBlt(
IDirect3DSurface9 *pSrcSurface,
IDirect3DSurface9 *pDstSurface,
UINT SrcSurfaceSize,
D3DENCRYPTED_BLOCK_INFO *pEncryptedBlockInfo,
VOID *pContentKey,
VOID *pIV
);
参数
pSrcSurface
指向包含源数据的图面的指针。
pDstSurface
指向写入加密数据的受保护图面的指针。
SrcSurfaceSize
pSrcSurface 指向的表面内存的大小(以字节为单位)。 大小必须与驱动程序功能结构中的 BlockAlignmentSize 值保持一致;请参阅备注。
pEncryptedBlockInfo
指向 D3DENCRYPTED_BLOCK_INFO 结构的指针,或 NULL。
如果驱动程序支持部分加密的缓冲区, pEncryptedBlockInfo 指示已加密缓冲区的哪些部分。 如果整个图面已加密,请将此参数设置为 NULL。
若要检查驱动程序是否支持部分加密的缓冲区,请调用 IDirect3DDevice9Video::GetContentProtectionCaps 并为D3DCPCAPS_PARTIALDECRYPTION功能标志检查。 如果驱动程序不支持部分加密的缓冲区,请将此参数设置为 NULL。
pContentKey
指向包含内容加密密钥的缓冲区的指针,或 NULL。 若要查询驱动程序是否支持使用内容密钥,请调用 IDirect3DDevice9Video::GetContentProtectionCaps 并为D3DCPCAPS_CONTENTKEY功能标志检查。
如果驱动程序支持内容密钥,请使用内容密钥来加密图面。 使用会话密钥加密内容密钥,并将生成的密码文本放在 pContentKey 中。 如果驱动程序不支持内容密钥,请使用会话密钥加密图面,并将 pContentKey 设置为 NULL。
pIV
指向包含初始化向量 (IV) 的缓冲区的指针。
如果加密类型为 D3DCRYPTOTYPE_AES128_CTR,则缓冲区为 D3DAES_CTR_IV 结构。 调用方分配结构并生成 IV。 生成第一个 IV 时,将结构初始化为随机数。 对于每个后续 IV,只需递增结构的 IV 成员,确保值始终增加。 此过程使驱动程序能够验证同一个 IV 永远不会使用同一密钥对多次。
对于其他加密类型,可能使用不同的结构,或者加密可能不使用 IV。
返回值
如果该方法成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。
注解
并非所有硬件或驱动程序都支持所有加密类型的此功能。
源图面必须是使用正确对齐限制创建的系统内存图面。 缓冲区必须足够大,以适应受保护图面的间距和高度,加上填充以适应起始对齐限制和块传输大小。
具体而言,应按如下所示分配源图面:
- 调用 IDirect3DCryptoSession9::GetSurfacePitch 以获取受保护图面的步长。
- 调用 IDirect3DDevice9Video::GetContentProtectionCaps 方法以获取 D3DCONTENTPROTECTIONCAPS 结构中的 BufferAlignmentStart 和 BlockAlignmentSize 成员的值。
- 计算表面内存的最小大小,如 SysMemSize = 受保护的表面步幅×受保护的表面高度。
- 添加填充以适应 BufferAlignmentStart 和 BlockAlignmentSize 的值。
- 在系统内存中分配一个缓冲区,其大小等于 SysMemSize (包括填充) 。
- 如果系统内存缓冲区的地址未与 BufferAlignmentStart 的值对齐,则计算一个内存对齐指针,该指针与缓冲区的起始位置相差。
- 调用 IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx 来创建源图面。 将内存对齐的指针作为共享资源句柄传递 (pSharedHandle) 。
此方法不支持写入图面的子对象。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 7 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 R2 [仅限桌面应用] |
目标平台 | Windows |
标头 | d3d9.h |