Content Protection DDI
このセクションは、Windows 7 以降、および Windows Server 2008 R2 以降のバージョンの Windows オペレーティング システムにのみ適用されます。
Content Protection DDI は、ビデオを保護するための Direct3D バージョン 9 DDI の拡張機能です。 Content Protection DDI は、このセクションで説明するエントリ ポイントで構成されます。
必要な Content Protection DDI 関数
ユーザー モードのディスプレイ ドライバーで Content Protection が実装されている場合、ドライバーは、次の Content Protection DDI 関数をサポートする必要があります。
CreateAuthenticatedChannel 関数は、Direct3D ランタイムとドライバーが保護の設定とクエリに使用できるチャネルを作成します。
AuthenticatedChannelKeyExchange 関数は セッション キーをネゴシエートします。
QueryAuthenticatedChannel 関数は、機能と状態情報について認証済みチャネルに対してクエリを実行します。
ConfigureAuthenticatedChannel 関数は、認証されたチャネル内の状態を設定します。
DestroyAuthenticatedChannel 関数は、認証済みチャネルのリソースを解放します。
CreateCryptoSession 関数は、Direct3D ランタイムがセッション キーを管理し、保護されたメモリとの間で暗号化操作を実行するために使用する暗号化セッションを作成します。
CryptoSessionKeyExchange 関数は セッション キーをネゴシエートします。
DestroyCryptoSession 関数は、暗号化セッションのリソースを解放します。
Content Protection 機能
ユーザー モードのディスプレイ ドライバーは、前述の必要な各 Content Protection DDI 関数をサポートしている場合にのみ、Content Protection 機能を報告します。 次の D3DDDICAPS_TYPE 値は、Direct3D ランタイムが使用し、ユーザー モード ディスプレイ ドライバーがサポートする Content Protection 機能の情報を取得します。 ランタイムは、ランタイムが GetCaps を呼び出すときに、ドライバーの GetCaps 関数の pData パラメータが指す D3DDDIARG_GETCAPS 構造体の Type メンバーでこれらの D3DDDICAPS_TYPE 値を設定します。
D3DDDICAPS_GETCONTENTPROTECTIONCAPS
ランタイムは、ドライバーが使用する必要がある特定の暗号化とデコードの組み合わせに対して DDICONTENTPROTECTIONCAPS 構造体へのポインターを提供します。 ドライバーは、暗号化とデコードの組み合わせに対するドライバーの Content Protection 機能を記述する、設定されたD3DCONTENTPROTECTIONCAPS 構造体へのポインターを返します。 D3DCONTENTPROTECTIONCAPS の詳細については、「DirectX SDK のドキュメント」を参照してください。
D3DDDICAPS_GETCERTIFICATESIZE
ドライバーは、チャネルまたは暗号化の種類に使用されるドライバーの認定資格証のサイズ (バイト単位) を指定する数値へのポインターを提供します。 Direct3D ランタイムは、このサイズを使用して、ランタイムが GetCaps を D3DDDICAPS_GETCERTIFICATE で呼び出したときにランタイムが受け取る認定資格証情報を保持するバッファーを割り当てます。
D3DDDICAPS_GETCERTIFICATE
ランタイムは、ドライバーが取得する必要がある認定資格証を記述する DDICERTIFICATEINFO 構造体へのポインターを提供します。
認証済みチャネルの場合、ドライバーは既存の OPM 認定資格証を使用します。これは、Microsoft によって署名されたルートである X.509 認定資格証です。
アプリケーションは、ドライバーの認定資格証に対してクエリを実行して、次の情報を確認できます。
ドライバーが信頼されているかどうか。
ドライバーが取り消されるかどうか。
ドライバーの公開キー。 アプリケーションは、ドライバーの公開キーを使用して、認証に使用される認証済みチャネルのセッション キーを確立します。
D3DDDICAPS_GETCERTIFICATE による GetCaps の呼び出しは、Direct3D 9 認証チャネルに対して呼び出されると失敗します。これは、このチャネルが認定資格証または認証をサポートしていないからです。
暗号化セッションの場合、ドライバーは指定された暗号化の種類の認定資格証を返します。 使用される暗号化の種類とキー交換によっては、認定資格証が使用される場合と使用されない場合があります。 また、異なる暗号化の種類で異なる認定資格証を使用することもできます。
オプションの Content Protection DDI 関数
ドライバーは、必要に応じて、次の Content Protection DDI 関数をサポートできます。
EncryptionBlt 関数は、保護されたサーフェスから暗号化されたデータを読み取ります。
GetPitch 関数は、保護されたサーフェスのピッチを取得します。
StartSessionKeyRefresh 関数は、デコーダー/アプリケーションとドライバー/ハードウェアがセッション キーを使用して排他的 OR 操作 (XOR) を実行するために使用できる乱数を返します。
FinishSessionKeyRefresh 関数は、その時点のすべてのバッファーが更新されたセッション キー値を使用することを示します。
GetEncryptionBltKey 関数は、ドライバーの EncryptionBlt 関数が返すデータの暗号化を解除するために使用されるキーを返します。
DecryptionBlt 関数は、保護されたサーフェスにデータを書き込みます。
コンテンツ保護されたリソース
次の D3DDDI_RESOURCEFLAGS フラグは、保護されたコンテンツに対して Direct3D ランタイムが使用します。 ランタイムは、ランタイムが CreateResource を呼び出すときに、ドライバーの CreateResource 関数の pResource パラメーターが指す D3DDDIARG_CREATERESOURCE 構造体の Flags メンバーでこれらの D3DDDI_RESOURCEFLAGS フラグを設定します。
RestrictedContent
リソースには、保護されたコンテンツが含まれている場合があります。 アプリケーションがリソースを作成する前に、アプリケーションで Content Protection を明示的に有効にした場合と有効になっていない場合があります。 ドライバーは、ランタイムがリソースの割り当てを、保護可能なメモリ プールに配置することを確認する必要があります。 ドライバーは、ロック可能な保護されたリソースの作成を許可する必要があります。 ただし、ドライバーは、Content Protection が有効になっている間、これらのサーフェスをロックする Lock 関数の呼び出しを明示的に失敗する必要があります。
RestrictSharedAccess
共有リソースへのアクセスを許可する必要があるのは、特定のプロセスのみです。
ドライバーは、このリソースへの共有アクセスを制限する必要があります。 ランタイムは、ドライバーの OpenResource 関数を呼び出して、リソースを作成したプロセス内のディスプレイ デバイス (hDevice) が、認証済みチャンネルを介して明示的にアクセスを許可されたデバイスによってのみこのリソースを開くことができます。