COPPSequenceStart 함수
샘플 COPPSequenceStart 함수는 현재 비디오 세션을 보호 모드로 설정합니다.
구문
HRESULT COPPSequenceStart(
_In_ COPP_DeviceData pThis,
_In_ DXVA_COPPSignature *pSeqStartInfo
);
매개 변수
pThis [in]
- COPP DirectX VA 디바이스 개체에 대한 포인터입니다.
pSeqStartInfo [in]
- 시작 시퀀스에 대한 정보가 포함된 DXVA_COPPSignature 구조체에 대한 포인터를 제공합니다.
반환 값
성공하면 0(S_OK 또는 DD_OK)을 반환합니다. 그렇지 않으면 오류 코드를 반환합니다.
설명
COPP DirectX VA 디바이스는 해당 COPPSequenceStart 함수에 대한 호출을 받기 전에 VMR에 그래픽 하드웨어 인증서를 제공해야 합니다. 즉, COPPKeyExchange 함수는 COPPSequenceStart 전에 호출되어야 합니다. 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 구조체는 다음과 같이 채워집니다.
| 멤버 | 값 |
|---|---|
| dwNumBuffers | 단계 없음. |
| lpBufferInfo | NULL |
| dwFunction | DXVA_COPPSequenceStartFnCode 상수(dxva.h에 정의됨). |
| 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;
}
Requirements
| 대상 플랫폼 | 버전 |
|---|---|
| 데스크톱 | 이 함수는 SP1 이상의 Windows Server 2003 및 SP2 이상에서 XP를 Windows 경우에만 적용됩니다. |