Compartilhar via


Método IDirect3DCryptoSession9::D ecryptionBlt (d3d9.h)

Grava dados criptografados em uma superfície protegida.

Sintaxe

HRESULT DecryptionBlt(
  IDirect3DSurface9       *pSrcSurface,
  IDirect3DSurface9       *pDstSurface,
  UINT                    SrcSurfaceSize,
  D3DENCRYPTED_BLOCK_INFO *pEncryptedBlockInfo,
  VOID                    *pContentKey,
  VOID                    *pIV
);

Parâmetros

pSrcSurface

Um ponteiro para a superfície que contém os dados de origem.

pDstSurface

Um ponteiro para a superfície protegida em que os dados criptografados são gravados.

SrcSurfaceSize

O tamanho da memória de superfície para a qual pSrcSurface aponta, em bytes. O tamanho deve ser alinhado ao valor de BlockAlignmentSize na estrutura de recursos do driver; consulte Comentários.

pEncryptedBlockInfo

Um ponteiro para uma estrutura de D3DENCRYPTED_BLOCK_INFO ou NULL.

Se o driver der suporte a buffers parcialmente criptografados, pEncryptedBlockInfo indicará quais partes do buffer serão criptografadas. Se toda a superfície for criptografada, defina esse parâmetro como NULL.

Para marcar se o driver dá suporte a buffers parcialmente criptografados, chame IDirect3DDevice9Video::GetContentProtectionCaps e marcar para o sinalizador de recursos D3DCPCAPS_PARTIALDECRYPTION. Se o driver não der suporte a buffers parcialmente criptografados, defina esse parâmetro como NULL.

pContentKey

Um ponteiro para um buffer que contém uma chave de criptografia de conteúdo ou NULL. Para consultar se o driver dá suporte ao uso de chaves de conteúdo, chame IDirect3DDevice9Video::GetContentProtectionCaps e marcar para o sinalizador de recursos D3DCPCAPS_CONTENTKEY.

Se o driver der suporte a chaves de conteúdo, use a chave de conteúdo para criptografar a superfície. Criptografe a chave de conteúdo usando a chave de sessão e coloque o texto de codificação resultante em pContentKey. Se o driver não der suporte a chaves de conteúdo, use a chave de sessão para criptografar a superfície e defina pContentKey como NULL.

pIV

Um ponteiro para um buffer que contém o IV (vetor de inicialização).

Se o tipo de criptografia for D3DCRYPTOTYPE_AES128_CTR, o buffer será uma estrutura D3DAES_CTR_IV . O chamador aloca a estrutura e gera o IV. Ao gerar o primeiro IV, inicialize a estrutura para um número aleatório. Para cada IV subsequente, basta incrementar o membro IV da estrutura, garantindo que o valor sempre aumente. Esse procedimento permite que o driver valide se o mesmo IV nunca é usado mais de uma vez com o mesmo par de chaves.

Para outros tipos de criptografia, uma estrutura diferente pode ser usada ou a criptografia pode não usar um IV.

Retornar valor

Se o método for bem-sucedido, ele retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

Nem todos os drivers ou hardware dão suporte a essa funcionalidade para todos os tipos criptográficos.

A superfície de origem deve ser uma superfície de memória do sistema criada com as restrições de alinhamento adequadas. O buffer deve ser grande o suficiente para acomodar a inclinação e a altura da superfície protegida, além de preenchimento para acomodar as restrições de alinhamento inicial e o tamanho da transferência de bloco.

Especificamente, você deve alocar a superfície de origem da seguinte maneira:

  1. Chame IDirect3DCryptoSession9::GetSurfacePitch para obter o passo da superfície protegida.
  2. Chame o método IDirect3DDevice9Video::GetContentProtectionCaps para obter o valor dos membros BufferAlignmentStart e BlockAlignmentSize na estrutura D3DCONTENTPROTECTIONCAPS .
  3. Calcule o tamanho mínimo da memória da superfície como SysMemSize = avanço da superfície protegida × altura da superfície protegida.
  4. Adicione preenchimento para acomodar os valores de BufferAlignmentStart e BlockAlignmentSize.
  5. Alocar um buffer na memória do sistema, com tamanho igual a SysMemSize (incluindo preenchimento).
  6. Se o endereço do buffer de memória do sistema não estiver alinhado ao valor de BufferAlignmentStart, calcule um ponteiro alinhado à memória que seja um deslocamento do início do buffer.
  7. Chame IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx para criar a superfície de origem. Passe o ponteiro alinhado à memória como o identificador de recurso compartilhado (pSharedHandle).
Se você bloquear a superfície, o passo relatado na estrutura D3DLOCKED_RECT poderá não corresponder ao passo da superfície protegida. No entanto, ao interpretar os dados, sempre use o passo a passo da superfície protegida.

Esse método não dá suporte à gravação em subrectangles da superfície.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho d3d9.h

Confira também

Proteção de conteúdo baseada em GPU

IDirect3DCryptoSession9