Usando a sessão de criptografia com o Decodificador do DirectX Video Accelerator 2.0
Esta seção se aplica somente ao Windows 7 e posterior e ao Windows Server 2008 R2 e versões posteriores do sistema operacional Windows.
O driver de exibição do modo de usuário pode associar uma sessão de criptografia a um dispositivo de decodificação do DirectX Video Accelerator (VA) 2.0 para fazer com que o dispositivo decodificado directx VA 2.0 use a chave de sessão da sessão de criptografia. Se o runtime do Direct3D especificar um GUID de decodificação válido no membro DecodeProfile da estrutura D3DDDIARG_CREATECRYPTOSESSION quando o runtime chamar a função CreateCryptoSession do driver para criar a sessão de criptografia, o runtime poderá chamar posteriormente a função ConfigureAuthenticatedChannel do driver com D3DAUTHETICATEDCONFIGURE_CRYPTOSESSION definido para configurar a sessão de criptografia com o dispositivo decodificação DirectX VA 2.0. Antes de configurar a sessão de criptografia com o dispositivo decodificado DirectX VA 2.0, o runtime deve chamar a função DecodeExtensionExecute do driver para recuperar um identificador de driver para o dispositivo de decodificação DirectX VA 2.0. O runtime define os membros da estrutura D3DDDIARG_DECODEEXTENSIONEXECUTE com os seguintes valores para recuperar o identificador de driver para o dispositivo decodificador DirectX VA 2.0:
#define DXVA2_DECODE_GET_DRIVER_HANDLE 0x725
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_GET_DRIVER_HANDLE;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = 0;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = HANDLE*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = sizeof(HANDLE);
Quando o runtime chama a função CreateDecodeDevice do driver para criar o dispositivo de decodificação DirectX VA 2.0, o runtime especifica zeros para os GUIDs de criptografia de decodificação dentro da estrutura DXVADDI_CONFIGPICTUREDECODE .
Depois que o runtime chama a função CreateCryptoSession do driver com o membro CryptoType da estrutura D3DDDIARG_CREATECRYPTOSESSION definida como D3DCRYPTOTYPE_AES128_CTR para criar a sessão de criptografia, a configuração do membro pPVPSetKey da estrutura D3DDDIARG_DECODEBEGINFRAME em uma chamada para a função DecodeBeginFrame do driver para decodificar um quadro indica os seguintes significados:
Se pPVPSetKey estiver definido como NULL, nenhum dos buffers do quadro conterá dados criptografados e, portanto, não exigirá descriptografia.
Se pPVPSetKey apontar para o NULL_GUID (todos os zeros), os buffers do quadro serão criptografados com a chave de sessão.
Se pPVPSetKey apontar para uma chave de conteúdo, isso indicará que um aplicativo usou a chave de sessão para criptografar a chave de conteúdo. O driver deve usar essa chave de conteúdo para descriptografar todos os buffers criptografados associados a esse quadro.
O vetor de inicialização para cada buffer criptografado aparece no membro pCipherCounter da estrutura DXVADDI_DECODEBUFFERDESC em uma chamada para a função DecodeExecute do driver. O driver deverá falhar na chamada para sua função DecodeExecute se determinar que o vetor de inicialização foi usado anteriormente para a mesma chave de conteúdo (ou chave de sessão, se a chave de conteúdo não for usada). O aplicativo deve incrementar o membro IV do DXVADDI_PVP_HW_IV para cada buffer criptografado pelo aplicativo. Portanto, a função DecodeExecute do driver poderá falhar se o membro IV for menor ou igual ao valor IV anterior que foi passado para DecodeExecute.
Se o runtime precisar criptografar parcialmente os buffers, ele chamará a função DecodeExtensionExecute do driver e definirá os membros da estrutura D3DDDIARG_DECODEEXTENSIONEXECUTE com os seguintes valores para especificar quais blocos o driver deve criptografar:
#define DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS 0x724
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = D3DENCRYPTED_BLOCK_INFO*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = sizeof(D3DENCRYPTED_BLOCK_INFO);
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = 0;