Testen, ob ein Grafiktreiber COPP unterstützt

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Das Certified Output Protection Protocol (COPP) ermöglicht es einer Anwendung, Videoinhalte zu schützen, wenn sie vom Video-Karte zum Anzeigegerät übertragen werden. Wenn ein Grafiktreiber COPP unterstützt, enthält der Treiber eine von Microsoft signierte Zertifikatkette, die den Treiber authentifiziert. Wiedergabeanwendungen, die COPP zum Erzwingen von Inhaltsschutz verwenden, müssen die Zertifikatkette überprüfen, um sicherzustellen, dass der Treiber nicht manipuliert wurde.

Sie können jedoch überprüfen, ob ein Grafiktreiber COPP unterstützt, ohne das Zertifikat zu überprüfen. Wenn ein Anbieter digitaler Medien beispielsweise eine DRM-Lizenz (Digital Rights Management) ausgibt, möchte er möglicherweise überprüfen, ob der Benutzer über einen COPP-fähigen Grafiktreiber verfügt. Der Anbieter muss COPP nicht erzwingen, wenn er die Lizenz ausgibt. Es muss nur getestet werden, ob der Treiber COPP unterstützt.

Der folgende Code zeigt, wie Sie testen, ob ein Treiber COPP unterstützt. Die Anwendung muss den Namen einer Videodatei übergeben, die zum Testen des Treibers verwendet wird. Dies ist erforderlich, da der Filter Video Mixing Renderer in Microsoft® DirectShow® erst dann eine COPP-Sitzung initialisiert, wenn der Filter verbunden ist. Diese Funktion kann in einer Clientanwendung enthalten sein, um zu überprüfen, ob der Treiber COPP ausführen kann.

Hinweis

Wenn der Computer des Benutzers über zwei Grafikkarten verfügt, testet diese Funktion den Treiber auf die primäre Grafik Karte, aber nicht die sekundären Grafiken Karte.

 

#include <dshow.h>
// Link to strmiids.lib

#define SAFE_RELEASE(p) if (NULL != (p)) { (p)->Release(); (p) = NULL; }
#define CHECK_HR(hr) if (FAILED(hr)) { goto done; }

enum COPPSupport 
{
    SUPPORTS_COPP,
    DOES_NOT_SUPPORT_COPP,
    CANNOT_DETERMINE_COPP_SUPPORT
};

//------------------------------------------------------------------------
// Name:        IsDriverCoppEnabled
// Description: Test whether the user's graphics driver supports
//              COPP.
// wszTestFile: Name of a video file to use for testing.
//
// If this method returns the value SUPPORTS_COPP, it does *not* guarantee 
// that the driver is a valid COPP-enabled driver. If you want to use COPP 
// to enforce video output protection, the application *must* validate 
// the certificate returned by the KeyExchange method. 
// 
// The purpose of this function is only to test whether the driver 
// claims to support COPP. 
//------------------------------------------------------------------------

COPPSupport IsDriverCoppEnabled(const WCHAR *wszTestFile)
{
    COPPSupport SupportResult = CANNOT_DETERMINE_COPP_SUPPORT; 

    IGraphBuilder *pGB = NULL;
    IBaseFilter *pRenderer = NULL;
    IAMCertifiedOutputProtection  *pCOPPDevice = NULL;
    BYTE *pbCertificate = NULL;
    GUID  RandomValue = GUID_NULL;
    ULONG cbCertificateLength = NULL;
    
    HRESULT hr = S_OK;

    CHECK_HR(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED));
   
    // Create the Filter Graph Manager.
    CHECK_HR(hr = CoCreateInstance(CLSID_FilterGraph, NULL, 
        CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGB));

    // Create the VMR-9. 
    hr = CoCreateInstance(CLSID_VideoMixingRenderer9,
        NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
        (void**)&pRenderer
        ));

    if (FAILED(hr))
    {
        // Try the VMR-7 instead.
        CHECK_HR(hr = CoCreateInstance(CLSID_VideoMixingRenderer,
                NULL, CLSCTX_INPROC, IID_IBaseFilter, 
                (void**)&pRenderer
                ));
    }

    // Add the VMR to the filter graph.
    CHECK_HR(hr = pGB->AddFilter(pRenderer, L"Video Renderer"));

    // Build a default playback graph.
    CHECK_HR(hr = pGB->RenderFile(wszTestFile, NULL));

    // Query for IAMCertifiedOutputProtection.
    CHECK_HR(hr = pRenderer->QueryInterface(IID_IAMCertifiedOutputProtection,
            (void**)&pCOPPDevice));

    // Get the driver's COPP certificate.
    hr = pCOPPDevice->KeyExchange(&RandomValue, &pbCertificate,
        &cbCertificateLength);

    if (SUCCEEDED(hr))
    {
        SupportResult = SUPPORTS_COPP;
    }
    else
    {
        SupportResult = DOES_NOT_SUPPORT_COPP;
    }

done:
    // Clean up.
    CoTaskMemFree(pbCertificate);
    SAFE_RELEASE(pCOPPDevice);
    SAFE_RELEASE(pRenderer);
    SAFE_RELEASE(pGB);
    CoUninitialize();

    return SupportResult;
} 

Verwenden des Certified Output Protection-Protokolls