Freigeben über


Verwenden der Crypto-Sitzung mit DirectX Video Accelerator 2.0-Decoder

Dieser Abschnitt gilt nur für Windows 7 und höher sowie Windows Server 2008 R2 und höhere Versionen des Windows-Betriebssystems.

Der Anzeigetreiber im Benutzermodus kann eine Kryptositzung einem DirectX Video Accelerator 2.0-Decodierungsgerät zuordnen, damit das DirectX VA 2.0-Decodierungsgerät den Sitzungsschlüssel der Kryptositzung verwendet. Wenn die Direct3D-Runtime eine gültige Decodierungs-GUID im DecodeProfile-Member der D3DDDIARG_CREATECRYPTOSESSION-Struktur angibt, wenn die Laufzeit die CreateCryptoSession-Funktion des Treibers aufruft, um die Kryptositzung zu erstellen, kann die Laufzeit anschließend die ConfigureAuthenticatedChannel-Funktion des Treibers aufrufen, wobei D3DAUTHETICATEDCONFIGURE_CRYPTOSESSION festgelegt ist, um die Kryptositzung mit dem DirectX VA 2.0-Decodierungsgerät zu konfigurieren. Vor dem Konfigurieren der Kryptositzung mit dem DirectX VA 2.0-Decodierungsgerät muss die Runtime die DecodeExtensionExecute-Funktion des Treibers aufrufen, um ein Treiberhandle für das DirectX VA 2.0-Decodierungsgerät abzurufen. Die Laufzeit legt die Member der D3DDDIARG_DECODEEXTENSIONEXECUTE-Struktur auf die folgenden Werte fest, um das Treiberhandle für das DirectX VA 2.0-Decodierungsgerät abzurufen:

#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);

Wenn die Runtime die CreateDecodeDevice-Funktion des Treibers aufruft, um das DirectX VA 2.0-Decodierungsgerät zu erstellen, gibt die Laufzeit Nullen für die GUIDs für die Decodierungsverschlüsselung innerhalb der DXVADDI_CONFIGPICTUREDECODE-Struktur an.

Nachdem die Runtime die CreateCryptoSession-Funktion des Treibers aufgerufen hat, wobei der CryptoType-Member der D3DDDIARG_CREATECRYPTOSESSION-Struktur auf D3DCRYPTOTYPE_AES128_CTR festgelegt ist, um die Kryptositzung zu erstellen, gibt die Einstellung des pPVPSetKey-Elements der D3DDDIARG_DECODEBEGINFRAME-Struktur in einem Aufruf der DecodeBeginFrame-Funktion des Treibers zum Decodieren eines Frames die folgende Bedeutung an:

  • Wenn pPVPSetKey auf NULL festgelegt ist, enthält keiner der Puffer für den Frame verschlüsselte Daten und erfordert daher keine Entschlüsselung.

  • Wenn pPVPSetKey auf den NULL_GUID (alle Nullen) zeigt, werden die Puffer für den Frame mit dem Sitzungsschlüssel verschlüsselt.

  • Wenn pPVPSetKey auf einen Inhaltsschlüssel zeigt, gibt dies an, dass eine Anwendung den Sitzungsschlüssel verwendet hat, um den Inhaltsschlüssel zu verschlüsseln. Der Treiber sollte diesen Inhaltsschlüssel verwenden, um alle verschlüsselten Puffer zu entschlüsseln, die diesem Frame zugeordnet sind.

Der Initialisierungsvektor für jeden verschlüsselten Puffer wird im pCipherCounter-Element der DXVADDI_DECODEBUFFERDESC-Struktur in einem Aufruf der DecodeExecute-Funktion des Treibers angezeigt. Der Treiber sollte den Aufruf seiner DecodeExecute-Funktion fehlschlagen, wenn er feststellt, dass der Initialisierungsvektor zuvor für denselben Inhaltsschlüssel (oder Sitzungsschlüssel, wenn der Inhaltsschlüssel nicht verwendet wird) verwendet wurde. Die Anwendung sollte den IV-Member der DXVADDI_PVP_HW_IV für jeden Puffer erhöhen, den die Anwendung verschlüsselt. Daher kann die DecodeExecute-Funktion des Treibers fehlschlagen, wenn der IV-Member kleiner oder gleich dem vorherigen IV-Wert ist, der an DecodeExecute übergeben wurde.

Wenn die Runtime die Puffer teilweise verschlüsseln muss, ruft sie die DecodeExtensionExecute-Funktion des Treibers auf und legt die Member der D3DDDIARG_DECODEEXTENSIONEXECUTE-Struktur auf die folgenden Werte fest, um anzugeben, welche Blöcke der Treiber verschlüsseln soll:

#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;