PDC 2008

Windows 7 における Protected User Mode Audio (PUMA)

更新日: 2009 年 4 月 28 日


ダウンロード

PDC08_CA_PUMA_JPN.doc (Word 形式、70 KB)


目次:

  1. Protected User Mode Audio
  2. HDCP ビットと SCMS ビットの設定
  3. 保護された環境外でコンテンツ保護メカニズムを有効にする
    1. サンプル コード

Kristin Carr
Microsoft Corporation
2008 年 10 月

対象:

Microsoft® Windows® SDK (Core Audio API)
Windows 7

要約:

Protected User Mode Audio (PUMA) の更新内容について説明します。PUMA は、保護された環境 (PE: Protected Environment) でのユーザー モードのオーディオ エンジンで、オーディオ処理とレンダリング向けの安全性の高い環境を提供します。

法的通知:

このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、記載された内容の実現に関するマイクロソフトの確約とはみなされないものとします。また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト ペーパーに記載された内容は情報の提供のみを目的としており、明示、黙示または法律の規定にかかわらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、 適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権をお客様に許諾するものではありません。
別途記載されていない場合、このソフトウェアおよび関連するドキュメントで使用している会社、組織、製品、ドメイン名、電子メール アドレス、ロゴ、人物、場所、出来事などの名称は架空のものです。実在する商品名、団体名、個人名などとは一切関係ありません。
© 2008 Microsoft Corporation. All rights reserved.
Microsoft、MS-DOS、Windows、Windows NT、Windows Server、Windows Vista、Active Directory、ActiveSync、ActiveX、Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectShow、DirectSound、DirectX、Expression、FrontPage、HighMAT、Internet Explorer、JScript、Microsoft Press、MSN、Outlook、PowerPoint、SideShow、Silverlight、Visual Basic、Visual C++、Visual InterDev、Visual J++、Visual Studio、WebTV、Windows Media、Win32、Win32s、および Zune は米国 Microsoft Corporation の米国またはその他の国における登録商標または商標です。
記載されている会社名、製品名には、各社の商標のものもあります。


1. Protected User Mode Audio

Protected User Mode Audio (PUMA) は、Windows Vista® で導入されました。PUMA は、保護された環境 (PE: Protected Environment) でのユーザー モードのオーディオ エンジンで、オーディオ処理とレンダリング向けの安全性の高い環境を提供します。PUMA では、許容できる出力のみを有効にでき、出力が無効の場合は確実に無効にします。PUMA の詳細については、「出力コンテンツの保護と Windows Vista」を参照してください。

PUMA は Windows® 7 で更新され、次の機能が追加されました。

  • S/PDIF エンドポイントでの SCMS (Serial Copy Management System) ビットの設定、および HDMI (High-Definition Multimedia Interfac) エンドポイントでの HDCP (High-bandwidth Digital Content Protection) ビットの設定
  • 保護された環境 (PE) 外部での SCMS および HDMI 保護制御の有効化

ページのトップへ


2. HDCP ビットと SCMS ビットの設定

信頼されたオーディオ ドライバーで使用される DRMRIGHTS 構造体は、KS オーディオ ピン、またはポート クラス ドライバーのストリーム オブジェクトに割り当てられる DRM コンテンツの権利を指定します。CopyProtect メンバーは、オーディオ コンテンツのコピーを防止する必要があるかどうかを示します。コンテンツのコピーが防止されている場合は、別のコンポーネントに渡したり、DRM システムによって認証されていない不揮発性記憶域メディアに保存したりすることは許可されません。

Windows® 7 では、CopyProtect の使用方法がさらに厳しくなりました。ドライバーでは、状態を "コピー不可" に設定することによって、保護の制御がオーディオ インターフェイスに設定されます。つまり、HDMI 出力の HDCP が設定され、S/PDIF 出力の SCMS が設定されます。S/PDIF インターフェイスの場合、L ビット、Cp ビット、およびカテゴリ コードの各ビットの組み合わせにより、IEC 60958 で定義されているとおりに "コピー不可" という SCMS 状態が示されていることがドライバーで検証されます。

Windows 7 には、"コピー不可" 設定をサポートするように変更されている、組み込みの HD オーディオ クラス ドライバーが付属しています。HD オーディオ クラス ドライバーの場合、L ビットおよびカテゴリ コードのビットは常に 0 にセットされます。また、WHQL Testing Agreement の Exhibit B が更新され、CopyProtect が設定された場合のドライバーの新しい想定動作と要件を反映しています。

ページのトップへ


3. 保護された環境外でコンテンツ保護メカニズムを有効にする

PUMA は、保護された環境 (PE) では独立したプロセスに常駐します。Windows® Vista で PUMA によって提供されるオーディオ コンテンツ保護制御を使用する場合、メディア アプリケーションが PE 内に存在する必要があります。PE と相互作用できるのは Media Foundation API のみのため、コンテンツ保護制御は、Media Foundation API を使用してオーディオ コンテンツのストリーミングを行うアプリケーションに限定されます。

Windows 7 では、PUMA 出力信頼機関 (OTA) によって提供されるコンテンツ保護制御にあらゆるアプリケーションからアクセスでき、アプリケーションが PE 内に存在するかどうかや、オーディオ再生に Media Foundation API を使用しているかどうかは関係ありません。

ページのトップへ

a. サンプル コード

次のサンプル コードは、SCMS または HDCP コンテンツ保護制御をオーディオ エンドポイントに設定しているアプリケーションを示しています。このサンプルでは、アプリケーションでオーディオ コンテンツのストリーミングに DirectShow® を使用します。ただし、使用するオーディオ ストリーミング API は何でもかまいません。

このサンプル コードでは、次のインターフェイスを使用します。

  • IMMDeviceEnumerator
  • IMMDevice
  • IMMDeviceCollection
  • IMFTrustedOutput
  • IMFOutputPolicy

 

メディア アプリケーションでは、次の処理を実行する必要があります。

1. 開発環境を設定します。

  • 必要なインターフェイスを参照し、次のヘッダーをインクルードします。

    #include <MMdeviceapi.h> // デバイス エンドポイントの定義
    #include <Mfidl.h> // OTA インターフェイスの定義

  • OTA インターフェイスを使用するために Mfuuid.lib にリンクします。
  • カーネル デバッガーとドライバーの検証ツールを無効にして、認証確認エラーを回避します。

2. システムのすべてのエンドポイントを列挙し、エンドポイントのコレクションから必要なエンドポイントを選択します。デバイスを列挙する方法の詳細については、Core Audio API の SDK に関するドキュメントの「Enumerating Audio Devices」(英語)を参照してください。

HRESULT GetDevice(IMMDevice** ppDevice)
{
        IMMDeviceEnumerator    *pEnumerator = NULL;
        IMMDevice              *pDevice = NULL;
        IMMDeviceCollection    *pEndpoints = NULL;
        UINT                    cEndpoints = 0;
        const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
        const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
        // オーディオ エンドポイント デバイスの列挙子を取得します。
        hr = CoCreateInstance(
                        CLSID_MMDeviceEnumerator, NULL,
                        CLSCTX_ALL, IID_IMMDeviceEnumerator,
                        (void**)&pEnumerator));
        EXIT_ON_ERROR(hr)
        // アクティブなエンドポイントをすべて列挙します。
        hr = pEnumerator->EnumAudioEndpoints ( 
                              eRender, 
                              DEVICE_STATE_ACTIVE, 
                              &pEndpoints);
        EXIT_ON_ERROR(hr)
        hr = pEndpoints->GetCount(&cEndpoints);
        EXIT_ON_ERROR(hr)
        for (UINT i = 0; i < cEndpoints; i++)
        {
            hr = pEndpoints->Item(i, &pDevice);
            IF_FAILED_JUMP(hr, Exit);
            {
                // 要件を満たすエンドポイントを選択します。
                // たとえば、SPDIF アナログ出力または HDMI を選択します。
                // このコードは示していません。
               *(ppDevice) = pDevice;
               (*ppDevice)->AddRef();
               break;
            }
            SAFE_RELEASE(pDevice);
        }
    Exit:
        if (FAILED(hr))
        {
            // エラーを通知します。
            // このコードは示していません。
        }
        SAFE_RELEASE(pDevice);
        SAFE_RELEASE(pEndpoints);
        SAFE_RELEASE(pEnumerator);
}

3. 列挙処理から返されたエンドポイントへの IMMDevice ポインターで、IID_IBaseFilter をインターフェイス識別子として指定して IMMDevice::Activate を呼び出し、DirectShow COM オブジェクトを作成します。

hr = pDevice->Activate (
                  IID_IBaseFilter, 
                  CLSCTX_INPROC_SERVER, NULL,   
                  reinterpret_cast<void **>(&pDShowFilter));

4. デバイスによってアクティブになった COM オブジェクトを使用して、DirectShow フィルター グラフを構築します。この処理の詳細については、DirectShow SDK のドキュメントの「フィルター グラフの作成」を参照してください。

5. IID_IMFTrustedOutput をインターフェイス識別子として指定して IMMDevice::Activate を呼び出して、OTA オブジェクトを作成し、IMFTrustedOutput インターフェイスへのポインターを取得します。

IMFTrustedOutput*       pTrustedOutput = NULL; 
hr = pDevice->Activate(
                  __uuidof(IMFTrustedOutput), 
                  CLSCTX_ALL, NULL, 
                  (void**)& pTrustedOutput);

6. IMFTrustedOutput インターフェイスを使用してストリームの保護ポリシーを設定します。

hr = pTrustedOutput ->SetPolicy(&pPolicy, nPolicy, &pbTicket, &cbTicket);

このサンプル コードでは、pPolicy は、クライアントが実装するオブジェクトの IMFOutputPolicy インターフェイスへのポインターです。IMFTrustedOutput インターフェイスの詳細については、Media Foundation SDK に関するドキュメント (英語) を参照してください。

ページのトップへ