Поделиться через


Защита файлов с помощью DRM версии 1

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

При применении такого рода защиты создается лицензия DRM версии 1, которая действительна только на компьютере, с которого был сделан запрос лицензии. Так как ключ или начальное значение ключа не задано, невозможно создать переносимые лицензии для содержимого, защищенного с помощью этого метода. Однако при использовании пакета SDK для формата Windows Media версии 7.1 или более поздней версии лицензии можно восстановить в службе Миграции лицензий Майкрософт.

Чтобы защитить ASF-файлы с помощью DRM версии 1, выполните следующие действия.

  1. Свяжите файл WMStubDRM.lib с проектом и при необходимости разорвите связь с wmvcore.lib.

  2. Вызовите функцию WMCreateWriter , чтобы создать модуль записи. Первый аргумент зарезервирован и должен иметь значение NULL.

  3. Задайте профиль для модуля записи, вызвав IWMWriter::SetProfile или IWMWriter::SetProfileByID. Перед настройкой атрибутов DRM необходимо задать профиль в модитере записи. DRM поддерживается только для профилей, использующих кодеки Windows Media Audio или Windows Media Video.

  4. С помощью метода IWMHeaderInfo::SetAttribute задайте следующие свойства DRM. Свойство Use_DRM указывает компонентам DRM защитить содержимое с помощью DRM версии 1. Свойство DRM_Flags указывает права, которые будут включены в локальную лицензию, которая будет создана для содержимого. Значение DRM_LEVEL также хранится в лицензии; он задает минимальный уровень, необходимый для доступа к содержимому. 150 — это рекомендуемый уровень для содержимого DRM версии 1.

    attribute Значение
    Use_DRM TRUE
    DRM_Flags WMT_RIGHT_PLAYBACK | WMT_RIGHT_COPY_TO_NON_SDMI_DEVICE | WMT_RIGHT_COPY_TO_CD
    DRM_LEVEL 150

     

В следующем примере кода показано, как создать модуль записи с поддержкой DRM для DRM версии 1 и задать свойства DRM. Проверка ошибок была опущена для уточнения.

BOOL  fUseDRM    = TRUE;
// These are the rights we will apply to the file. See WMT_RIGHTS for
// the full set of possible rights.

DWORD dwDRMFlags = WMT_RIGHT_PLAYBACK | 
                   WMT_RIGHT_COPY_TO_NON_SDMI_DEVICE | 
                   WMT_RIGHT_COPY_TO_CD;

// Set the minimum required DRM level low enough
// to allow older players to access the content.
DWORD dwDRMLevel = 150;

IWMDRMWriter*  pWMDRMWriter  = NULL;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a writer object.
hr = WMCreateWriter( NULL, &pWMDRMWriter);

// Obtain the IWMHeaderInfo interface.
hr = pWMDRMWriter -> QueryInterface(IID_IWMHeaderInfo, 
                                   (void**) &pWMHeaderInfo);

// Tell the SDK runtime to protect the file using DRM version 1.
hr= pWMHeaderInfo-> SetAttribute(0,
                                 g_wszWMUse_DRM,
                                 WMT_TYPE_BOOL,
                                 (BYTE*)&fUseDRM,
                                 sizeof(BOOL));

// Specify the rights that will be stored in the local license that is
// created automatically for the content.
hr= pWMHeaderInfo->SetAttribute( 0,
                                 g_wszWMDRM_Flags, 
                                 WMT_TYPE_DWORD,
                                 (BYTE *)&dwDRMFlags,
                                 sizeof(DWORD) );

// Set the DRM_Level attribute in the file's DRM header.
hr= pWMHeaderInfo->SetAttribute( 0,
                                 g_wszWMDRM_Level, 
                                 WMT_TYPE_DWORD,
                                 (BYTE *)&dwDRMLevel,
                                 sizeof(DWORD) );