使用 DRM 版本 1 保护文件

[与此页面关联的功能 Windows Media Format 11 SDK 是旧版功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用源读取器和接收器编写器,而不是 Windows Media Format 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

应用此类保护时,将生成仅在发出许可证请求的计算机上有效的 DRM 版本 1 许可证。 由于未设置任何密钥或密钥种子,因此无法为使用此技术保护的内容生成可移植许可证。 但是,使用 Windows Media Format SDK 7.1 或更高版本时,许可证可在 Microsoft 许可证迁移服务中恢复。

若要使用 DRM 版本 1 保护 ASF 文件,请执行以下步骤:

  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 版本 1 创建启用了 DRM 的编写器并设置 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) );