Проверка того, поддерживает ли графический драйвер COPP
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Сертифицированный протокол защиты вывода (COPP) позволяет приложению защищать видеосодержимое при его перемещении с карта видео на устройство отображения. Если графический драйвер поддерживает COPP, драйвер содержит цепочку сертификатов, подписанную корпорацией Майкрософт, для проверки подлинности драйвера. Приложения воспроизведения, использующие COPP для обеспечения защиты содержимого, должны проверять цепочку сертификатов, чтобы убедиться, что драйвер не был изменен.
Однако может потребоваться проверка, поддерживает ли графический драйвер COPP, без проверки сертификата. Например, когда поставщик цифровых мультимедиа выдает лицензию на управление цифровыми правами (DRM), может потребоваться проверка, есть ли у пользователя графический драйвер с поддержкой COPP. Поставщику не нужно применять COPP во время его выпуска лицензии; Ему нужно только проверить, поддерживает ли драйвер COPP.
В следующем коде показано, как проверить, поддерживает ли драйвер COPP. Приложение должно передать имя видеофайла, который будет использоваться для тестирования драйвера. Это необходимо, так как фильтр отрисовщика микширования видео в Microsoft® DirectShow® не инициализирует сеанс COPP, пока фильтр не будет подключен. Эта функция может быть включена в клиентское приложение для проверка, может ли драйвер выполнять COPP.
Примечание
Если на компьютере пользователя есть две графические карты, эта функция проверяет драйвер на наличие основного графического карта, но не дополнительных графических карта.
#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;
}
Связанные темы