Déverrouillage du Kit de développement logiciel (SDK) au format Windows Media

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Pour accéder à la version 7 ou 7.1 du Kit de développement logiciel (SDK) au format Windows Media, une application doit fournir un certificat logiciel, également appelé clé, au moment de l’exécution. Cette clé est contenue dans une bibliothèque statique appelée wmstub.lib à laquelle l’application est liée au moment de la génération. Une clé individualisée est requise uniquement pour la création ou la lecture de fichiers protégés par DRM. Les fichiers non DRM peuvent être créés à l’aide de la bibliothèque statique fournie avec le Kit de développement logiciel (SDK) au format Windows Media. Pour plus d’informations sur l’obtention de la clé DRM, consultez le Kit de développement logiciel (SDK) au format Windows Media. Une application DirectShow fournit son certificat à l’enregistreur ASF WM lorsqu’il est ajouté au graphique de filtres. L’application doit s’inscrire en tant que fournisseur de clés à l’aide des interfaces COM IServiceProvider et IObjectWithSite . À l’aide de cette technique, l’application implémente une classe de fournisseur de clés dérivée de IServiceProvider. Cette classe implémente les trois méthodes COM standard : AddRef, QueryInterface et Release, ainsi qu’une méthode supplémentaire, QueryService, appelée par le gestionnaire de graphe de filtres. QueryService appelle la méthode WMCreateCertificate du Kit de développement logiciel (SDK) au format Windows Media et retourne au gestionnaire de graphe de filtre un pointeur vers le certificat qui a été créé. Si le certificat est valide, le gestionnaire de graphe de filtre permet au processus de génération de graphiques de continuer.

Notes

Pour générer une application, incluez Wmsdkidl.h pour le prototype de WMCreateCertificate et créez un lien vers la bibliothèque Wmstub.lib.

 

L’exemple de code suivant illustre les étapes de base de ce processus :

// Declare and implement a key provider class derived from IServiceProvider.

class CKeyProvider : public IServiceProvider {
public:
    // IUnknown interface
    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    CKeyProvider();

    // IServiceProvider
    STDMETHODIMP QueryService(REFIID siid, REFIID riid, void **ppv);
    
private:
    ULONG m_cRef;
};

CKeyProvider::CKeyProvider() : m_cRef(0)
{
}

// IUnknown methods
ULONG CKeyProvider::AddRef()
{
    return InterlockedIncrement(&m_cRef);
}

ULONG CKeyProvider::Release()
{
    ASSERT(m_cRef > 0);

    ULONG lCount = InterlockedDecrement(&m_cRef);
    if (m_cRef == 0) 
    {
        delete this;
        return (ULONG)0;
    }
    return (ULONG)lCount;
}

// We only support IUnknown and IServiceProvider.
HRESULT CKeyProvider::QueryInterface(REFIID riid, void ** ppv)
{
    if (!ppv) return E_POINTER;

    if (riid == IID_IUnknown) 
    {
        *ppv = (void *) static_cast<IUnknown *>(this);
        AddRef();
        return S_OK;
    }
    if (riid == IID_IServiceProvider) 
    {
        *ppv = (void *) static_cast<IServiceProvider *>(this);
        AddRef();
        return S_OK;
    }

    return E_NOINTERFACE;
}

STDMETHODIMP CKeyProvider::QueryService(REFIID siid, REFIID riid, void **ppv)
{
    if (!ppv) return E_POINTER;

    if (siid == __uuidof(IWMReader) && riid == IID_IUnknown) 
    {
        IUnknown *punkCert;
        HRESULT hr = WMCreateCertificate(&punkCert);
        if (SUCCEEDED(hr)) 
        {
            *ppv = (void *) punkCert;
        }
        return hr;
    }
    return E_NOINTERFACE;
}

////////////////////////////////////////////////////////////////////
//
// These examples illustrate the sequence of method calls
// in your application. Error checking is omitted for brevity.
//
///////////////////////////////////////////////////////////////////

// Create the filter graph manager, but don't add any filters.
IGraphBuilder *pGraph;
hr = CreateFilterGraph(&pGraph);

...

// Instantiate the key provider class, and AddRef it
// so that COM doesn't try to free our static object.

CKeyProvider prov;
prov.AddRef();  // Don't let COM try to free our static object.

// Give the graph an IObjectWithSite pointer for callbacks and QueryService.
IObjectWithSite* pObjectWithSite = NULL;

hr = pGraph->QueryInterface(IID_IObjectWithSite, (void**)&pObjectWithSite);
if (SUCCEEDED(hr))
{
    // Use the IObjectWithSite pointer to specify our key provider object.
    // The filter graph manager will use this pointer to call
    // QueryService to do the unlocking.
    // If the unlocking succeeds, then we can build our graph.

    pObjectWithSite->SetSite((IUnknown *) (IServiceProvider *) &prov);
    pObjectWithSite->Release();
}

// Now build the graph.

Création de fichiers ASF dans DirectShow