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) 分配目标图面,如下所示:

  1. 调用 IDirect3DCryptoSession9::GetSurfacePitch 以获取受保护图面的步长。
  2. 调用 GetContentProtectionCaps 方法以获取 D3DCONTENTPROTECTIONCAPS 结构中的 BufferAlignmentStartBlockAlignmentSize 成员的值。
  3. 计算表面内存的最小大小,如 SysMemSize = 受保护的表面步幅×受保护的表面高度。
  4. 添加填充以适应 BufferAlignmentStartBlockAlignmentSize 的值。
  5. 在系统内存中分配一个缓冲区,其大小等于 SysMemSize (包括填充) 。
  6. 如果系统内存缓冲区的地址未与 BufferAlignmentStart 的值对齐,则计算一个内存对齐指针,该指针与缓冲区的起始位置相差。
  7. 调用 IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx 来创建目标图面。 将内存对齐的指针作为共享资源句柄传递 (pSharedHandle) 。
此方法具有以下限制:
  • 方法无法读回子对象或部分加密的图面。
  • 受保护的表面必须是屏幕外普通表面或呈现目标。
  • 如前所述,目标图面必须是使用正确对齐方式创建的系统内存图面。
  • 受保护的图面不能进行多重采样。
  • 方法不支持拉伸或颜色空间转换。
如果锁定目标图面, 则D3DLOCKED_RECT 结构中报告步幅可能与受保护图面的步幅不匹配。 但是,在解释数据时,始终使用受保护图面的步幅。

要求

要求
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
目标平台 Windows
标头 d3d9.h

另请参阅

基于 GPU 的内容保护

IDirect3DCryptoSession9