COPPSequenceStart 函数
示例 COPPSequenceStart 函数将当前视频会话设置为保护模式。
语法
HRESULT COPPSequenceStart(
_In_ COPP_DeviceData pThis,
_In_ DXVA_COPPSignature *pSeqStartInfo
);
参数
pThis [in]
- 指向 COPP DirectX VA 设备对象的指针。
pSeqStartInfo [in]
- 提供指向DXVA_COPPSignature 结构的指针,该结构包含有关开始序列的信息。
返回值
如果成功,则返回零 (S_OK 或DD_OK) ;否则,将返回错误代码。
注解
COPP DirectX VA 设备应在收到对其 COPPSequenceStart 函数的调用之前向 VMR 提供图形硬件证书。 也就是说,应在 COPPSequenceStart 之前调用 COPPKeyExchange 函数。 如果在 COPPKeyExchange 之前调用 COPPSequenceStart,则 COPPSequenceStart 应返回E_UNEXPECTED。
提供图形硬件证书后,COPP DirectX VA 设备应仅接收对其 COPPSequenceStart 函数的一次调用。 如果 COPP DirectX VA 设备收到另一个 COPPSequenceStart 调用,它应返回E_UNEXPECTED。
COPPSequenceStart 函数接收一个填充DXVA_COPPSignature结构,该结构包含一个启动序列,其中包含以下串联在一起的项:
- 由驱动程序生成并通过调用驱动程序的 COPPKeyExchange 函数返回的 128 位随机数
- 128 位随机数据完整性会话密钥
- 32 位随机启动状态序列号
- 32 位随机启动命令序列号
使用图形硬件的公钥加密启动序列。
将 RenderMoComp 映射到 COPPSequenceStart
示例 COPPSequenceStart 函数直接映射到对 DD_MOTIONCOMPCALLBACKS 结构的 RenderMoComp 成员的调用。 RenderMoComp 成员指向引用 DD_RENDERMOCOMPDATA 结构的显示驱动程序提供的 DdMoCompRender 回调函数。
调用 RenderMoComp 回调函数时不首先调用显示驱动程序提供的 BeginMoCompFrame 或 EndMoCompFrame 函数。
填充DD_RENDERMOCOMPDATA结构如下所示。
成员 | Value |
---|---|
dwNumBuffers | Zero。 |
lpBufferInfo | NULL。 |
dwFunction | 在 dxva.h) 中定义的DXVA_COPPSequenceStartFnCode常量 (。 |
lpInputData | 指向DXVA_COPPSignature结构的指针。 |
lpOutputData | NULL。 |
示例代码
以下代码提供了如何实现 COPPSequenceStart 函数的示例:
HRESULT
COPP_RSADecryptData(
const BYTE* lpPrivateKey,
DXVA_COPPSignature* pOutput,
DXVA_COPPSignature* pInput
)
{
DWORD dwLen = sizeof(DXVA_COPPSignature);
return RSADecPrivate(lpPrivateKey, (const BYTE *)pInput,
sizeof(DXVA_COPPSignature), (BYTE*) pOutput, &dwLen);
}
HRESULT
COPPSequenceStart(
COPP_DeviceData* pThis,
DXVA_COPPSignature* pSeqStartInfo
)
{
if (pThis->m_COPPDevState == COPP_KEY_EXCHANGED) {
BYTE* pByte;
DXVA_COPPSignature Decrypted;
GUID rGraphicsDriver;
HRESULT hr;
COPP_RSADecryptData(PrivateKey, &Decrypted, pSeqStartInfo);
pByte = (BYTE*)&Decrypted;
memcpy(&rGraphicsDriver, pByte, sizeof(DWORD));
pByte += sizeof(DWORD);
memcpy(&pThis->m_KDI, pByte, sizeof(GUID));
pByte += sizeof(GUID);
memcpy(&pThis->m_StatusSeqNumber, pByte, sizeof(DWORD));
pByte += sizeof(DWORD);
memcpy(&pThis->m_CmdSeqNumber, pByte, sizeof(DWORD));
pByte += sizeof(DWORD);
hr = SetKey(&pThis->m_AesHelper, (BYTE*)&pThis->m_KDI, sizeof(GUID));
if (hr != S_OK) {
return hr;
}
if (!IsEqualGUID(&rGraphicsDriver, &pThis->m_rGraphicsDriver)) {
return E_UNEXPECTED;
}
pThis->m_COPPDevState = COPP_SESSION_ACTIVE;
}
else {
return E_UNEXPECTED;
}
return NO_ERROR;
}
要求
目标平台 | 版本 |
---|---|
桌面 | 此函数仅适用于带有 SP1 及更高版本的 Windows Server 2003 以及 SP2 及更高版本的 Windows XP。 |
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈