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로 설정합니다.

드라이버가 부분적으로 암호화된 버퍼를 지원하는지 여부를 검사 D3DCPCAPS_PARTIALDECRYPTION 기능 플래그에 대해 IDirect3DDevice9Video::GetContentProtectionCaps검사 호출합니다. 드라이버가 부분적으로 암호화된 버퍼를 지원하지 않는 경우 이 매개 변수를 NULL로 설정합니다.

pContentKey

콘텐츠 암호화 키 또는 NULL을 포함하는 버퍼에 대한 포인터입니다. 드라이버가 콘텐츠 키 사용을 지원하는지 여부를 쿼리하려면 IDirect3DDevice9Video::GetContentProtectionCaps를 호출하고 D3DCPCAPS_CONTENTKEY 기능 플래그에 대한 검사.

드라이버가 콘텐츠 키를 지원하는 경우 콘텐츠 키를 사용하여 표면을 암호화합니다. 세션 키를 사용하여 콘텐츠 키를 암호화하고 결과 암호 텍스트를 pContentKey에 배치합니다. 드라이버가 콘텐츠 키를 지원하지 않는 경우 세션 키를 사용하여 표면을 암호화하고 pContentKeyNULL로 설정합니다.

pIV

IV(초기화 벡터)를 포함하는 버퍼에 대한 포인터입니다.

암호화 유형이 D3DCRYPTOTYPE_AES128_CTR 경우 버퍼는 D3DAES_CTR_IV 구조입니다. 호출자는 구조를 할당하고 IV를 생성합니다. 첫 번째 IV를 생성할 때 구조체를 난수로 초기화합니다. 이후의 각 IV에 대해 단순히 구조체의 IV 멤버를 증가하여 값이 항상 증가하도록 합니다. 이 절차를 통해 드라이버는 동일한 IV가 동일한 키 쌍에서 두 번 이상 사용되지 않는지 확인할 수 있습니다.

다른 암호화 유형의 경우 다른 구조가 사용되거나 암호화가 IV를 사용하지 않을 수 있습니다.

반환 값

메서드가 성공하면 S_OK를 반환하고, 그러지 않으면 HRESULT 오류 코드를 반환합니다.

설명

모든 하드웨어 또는 드라이버가 모든 암호화 유형에 대해 이 기능을 지원하는 것은 아닙니다.

원본 표면은 적절한 맞춤 제한으로 만든 시스템 메모리 표면이어야 합니다. 버퍼는 보호된 표면의 피치 및 높이와 시작 맞춤 제한 및 블록 전송 크기를 수용할 수 있는 패딩을 수용할 수 있을 만큼 커야 합니다.

특히 다음과 같이 원본 표면을 할당해야 합니다.

  1. IDirect3DCryptoSession9::GetSurfacePitch를 호출하여 보호된 표면의 보폭을 가져옵니다.
  2. IDirect3DDevice9Video::GetContentProtectionCaps 메서드를 호출하여 D3DCONTENTPROTECTIONCAPS 구조체에서 BufferAlignmentStartBlockAlignmentSize 멤버의 값을 가져옵니다.
  3. Surface 메모리의 최소 크기를 SysMemSize = 보호된 표면 보폭 × 보호된 표면 높이로 계산합니다.
  4. BufferAlignmentStartBlockAlignmentSize 값을 수용할 패딩을 추가합니다.
  5. 크기가 SysMemSize(패딩 포함)와 같은 시스템 메모리에 버퍼를 할당합니다.
  6. 시스템 메모리 버퍼의 주소가 BufferAlignmentStart 값에 정렬되지 않은 경우 버퍼 시작부터 오프셋인 메모리 정렬 포인터를 계산합니다.
  7. IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx를 호출하여 원본 표면을 만듭니다. 메모리 정렬 포인터를 공유 리소스 핸들(pSharedHandle)로 전달합니다.
표면을 잠그면 D3DLOCKED_RECT 구조에 보고된 보폭이 보호된 표면의 보폭과 일치하지 않을 수 있습니다. 그러나 데이터를 해석할 때는 항상 보호된 표면의 보폭을 사용합니다.

이 메서드는 표면의 하위 사각형에 쓰기를 지원하지 않습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 7 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 R2 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 d3d9.h

추가 정보

GPU 기반 콘텐츠 보호

IDirect3DCryptoSession9