共用方式為


傳送 COPP 狀態要求

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

若要傳送認證輸出保護通訊協定 (COPP) 狀態要求,請使用要求資料填入 AMCOPPStatusInput 結構。 結構成員為:

  • rApp。 輸入為 GUID 的 128 位亂數。 驅動程式的回應中會傳回相同的數位。 您應該在堆積上配置亂數,然後將它複製到 結構中。 這會防範攻擊者修改 AMCOPPStatusInput 結構內容的攻擊。
  • guidStatusRequestID。 識別要求的 GUID。 請參閱 COPP 查詢參考
  • dwSequence。 狀態序號。 在每個狀態要求之後遞增此值。 (在 起始 COPP 會話一節中,此值會顯示為程式碼範例中的 uStatusSeq 。)
  • cbSizeData。 要求所需的任何其他資料大小,以位元組為單位。
  • StatusData。 狀態要求的資料。

AMCOPPStatusInput 結構傳遞至 IAMCertifiedOutputProtection::P rotectionStatus 方法。 例如,下列程式碼會傳送狀態要求,以查詢可用的保護機制:

AMCOPPStatusInput input;
AMCOPPStatusOutput output;

// Create a 128-bit random number.
GUID *pGuid = new GUID();
if (pGuid == NULL)
{
    // Handle out-of-memory condition.
}
CryptGenRandom(hCSP, sizeof(GUID), (BYTE*)pGuid);  

// Copy the random number into the command structure.
memcpy(&input.rApp, pGuid, sizeof(GUID));

// Fill in the other data.
input.guidStatusRequestID = DXVA_COPPQueryProtectionType; // Request type.
input.dwSequence = uStatusSeq;  // Status sequence number.
input.cbSizeData = 0            // No other data for this query.

// Send the request.
hr = pCOPP->ProtectionStatus(&input, &output);

// Increment the sequence number each time.
++uStatusSeq;

回應會寫入AMCOPPStatusOutput結構的COPPStatus成員中。 回應中有效資料的大小會在 cbSizeData 成員中提供。 為了確保訊息的完整性,驅動程式會使用 OMAC 1 演算法,在 MAC) (計算訊息驗證碼,並在結構的 macKDI 成員中傳回此值。 應用程式應該驗證此值,如下所示:

  1. 計算出現在 AMCOPPStatusOutput (結構之 macKDI成員之後的資料區塊 OMAC 標籤,換句話說,cbSizeData加上COPPStatus) 。
  2. 使用直接memcmp,將此標籤與macKDI中的值進行比較。

OMAC 1 演算法詳述于 https://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html 。 COPP 使用下列 OMAC-1 參數:

  • E = AES
  • t = 128 位

從狀態要求傳回的資料一律會以兩個專案開頭:

  • 應用程式所傳遞的 rApp 值相同。 您應該確認此值符合儲存在堆積上的原始值。
  • 指出輸出保護狀態是否已變更 的COPP_StatusFlags 值。

因為連線可能會遺失或重新設定,所以應用程式應該定期輪詢驅動程式的目前狀態。 如果已設定COPP_RenegotiationRequired旗標,應用程式應該嘗試重設保護層級。 如果已設定COPP_LinkLost旗標,應用程式應該停止播放內容。 例如,因為使用者中斷輸出連接器的連線,所以可以傳回COPP_LinkLost旗標。 應用程式應該釋放 VMR 目前的實例、建立 VMR 的新實例,以及建立新的 COPP 會話 (,包括金鑰交換和憑證驗證) 。

使用認證輸出保護通訊協定 (COPP)