使用 OPM DDI

Microsoft DirectX 图形内核子系统 (Dxgkrnl.sys) 使用 OPM DDI 创建受 OPM 保护的输出、销毁受 OPM 保护的输出、获取证书、配置受保护的输出、获取有关受保护输出的信息,以及获取有关图形适配器的信息。 DirectX 图形内核子系统在调用显示微型端口驱动程序的 DxgkDdiQueryInterface 函数以查询由 GUID_DEVINTERFACE_OPM 和 DXGK_OPM_INTERFACE_VERSION_1 标识的接口时,会获取指向 OPM DDI 函数的指针。 以下序列介绍 OPM DDI 通常如何用于创建、操作和销毁受 OPM 保护的输出:

  1. DirectX 图形内核子系统调用 DxgkDdiOPMCreateProtectedOutput 函数来创建受 OPM 保护的输出。 受 OPM 保护的输出总是恰好对应于一个物理视频输出。 DxgkDdiOPMCreateProtectedOutput 为新创建的输出返回一个句柄。

  2. DirectX 图形内核子系统调用 DxgkDdiOPMGetCertificateSizeDxgkDdiOPMGetCertificate 函数,以获取显示微型端口驱动程序的 OPM 证书或 COPP 证书及其大小。

    注意

    DxgkDdiOPMCreateProtectedOutputDxgkDdiOPMGetCertificateSizeDxgkDdiOPMGetCertificate 是 DirectX 图形内核子系统不向其传递受保护输出句柄的唯一 OPM DDI 函数。

  3. DirectX 图形内核子系统调用 DxgkDdiOPMGetRandomNumber 函数以获取受保护输出的随机数。

  4. DirectX 图形内核子系统在对 DxgkDdiOPMSetSigningKeyAndSequenceNumbers 函数的调用中传递 256 字节缓冲区。 缓冲区包含使用显示微型端口驱动程序公钥之一进行加密的数据。 有关公钥的详细信息,请从输出内容保护和 Windows Vista 网站下载输出内容保护文档。 使用的公钥取决于受保护输出的语义。 如果受保护的输出具有 OPM 语义,则使用显示微型端口驱动程序 OPM 证书中的公钥。 如果受保护的输出具有 COPP 语义,则使用显示微型端口驱动程序 COPP 证书中的公钥。 用于加密数据的加密方案也取决于受保护输出的语义。 如果受保护的输出具有 COPP 语义,则使用标准 RSA 算法加密数据;如果受保护输出具有 OPM 语义,则使用 RSAES-OAEP 加密方案加密数据。 有关 RSA、AES 和 RSAES-OAEP 的信息,请参阅 RSA Laboratories 网站。 显示微型端口驱动程序使用适当的私钥和解密方法来解密数据。 解密后的数据中包含一个随机数、两个随机序列号和一个 128 位 AES 密钥。 显示微型端口驱动器可确保随机数与驱动程序在调用其 DxgkDdiOPMGetRandomNumber 函数时返回的随机数匹配。 然后,驱动程序存储两个序列号和 128 位 AES 密钥。

  5. DirectX 图形内核子系统现在可以调用 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 函数,从受保护的输出中获取信息。 DirectX 图形内核子系统还可以调用 DxgkDdiOPMConfigureProtectedOutput 来配置受保护的输出。 只有当输出具有 OPM 语义时,才可以调用 DxgkDdiOPMGetInformation;只有当输出具有 COPP 语义时,才可以调用 DxgkDdiOPMGetCOPPCompatibleInformation。 通常,DirectX 图形内核子系统调用 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 以获取有关输出的信息,然后调用 DxgkDdiOPMConfigureProtectedOutput 一次或多次以配置输出。 然后,DirectX 图形内核子系统再次调用 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation。 DirectX 图形内核子系统可以通过调用 DxgkDdiOPMGetInformationDxgkDdiOPMGetCOPPCompatibleInformation 来获取以下类型的信息:

    • 输出的连接器类型。
    • 输出支持的内容保护类型。 输出目前可以支持:
    • 特定保护类型的输出的当前虚拟保护级别。
    • 特定保护类型的物理输出的实际保护级别。
    • 输出当前使用的 HDCP 系统可续订性消息 (SRM) 的版本。 有关 HDCP SRM 的详细信息,请参阅 HDCP 规范修订版 1.1。 只有 DxgkDdiOPMGetInformation 才能获取此信息。
    • 连接的 HDCP 设备的键选择向量 (KSV) 以及 HDCP 设备是否为重复器。 只有 DxgkDdiOPMGetCOPPCompatibleInformation 才能获取此信息。 有关 HDCP 重复器和 KSV 的详细信息,请参阅 HDCP 规范修订版 1.1
    • 图形适配器使用的扩展总线的类型。 PCI 和 AGP 是扩展总线的示例。
    • 从与受保护输出关联的物理连接器发送到监视器的图像的格式。
    • 受保护的输出支持的 CGMS-A 和 ACP 信号标准。 只有 DxgkDdiOPMGetCOPPCompatibleInformation 才能获取此信息。
    • 输出的标识符。
    • 数字视频接口 (DVI) 输出连接器的电特性。

    DirectX 图形内核子系统可以通过调用 DxgkDdiOPMConfigureProtectedOutput 来更改以下设置:

    • 输出保护类型的当前保护级别。 例如,DxgkDdiOPMConfigureProtectedOutput 可以启用或禁用 HDCP,并且可以关闭 ACP 保护或更改当前的 ACP 保护级别。
    • 受保护的输出使用的当前 HDCP SRM。
    • 受保护输出使用的当前信号标准。 只有当输出具有 COPP 语义时,才能进行此更改。
  6. DirectX 图形内核子系统在完成使用受保护的输出对象时调用 DxgkDdiOPMDestroyProtectedOutput