Bagikan melalui


Mengirim Permintaan Status COPP

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Untuk mengirim permintaan status Certified Output Protection Protocol (COPP), isi struktur AMCOPPStatusInput dengan data permintaan. Anggota struktur adalah:

  • rApp. Angka acak 128-bit, ditik sebagai GUID. Angka yang sama dikembalikan dalam respons driver. Anda harus mengalokasikan angka acak pada tumpukan dan kemudian menyalinnya ke dalam struktur. Ini melindungi dari serangan di mana penyerang memodifikasi konten struktur AMCOPPStatusInput .
  • guidStatusRequestID. GUID yang mengidentifikasi permintaan. Lihat Referensi Kueri COPP.
  • dwSequence. Nomor urutan status. Tingkatkan nilai ini setelah setiap permintaan status. (Di bagian Memulai Sesi COPP, nilai ini ditampilkan sebagai uStatusSeq dalam contoh kode.)
  • cbSizeData. Ukuran, dalam byte, dari data tambahan apa pun yang diperlukan untuk permintaan tersebut.
  • StatusData. Data untuk permintaan status.

Teruskan struktur AMCOPPStatusInput ke metode IAMCertifiedOutputProtection::P rotectionStatus . Misalnya, kode berikut mengirimkan permintaan status bahwa kueri mekanisme perlindungan mana yang tersedia:

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;

Respons ditulis ke anggota COPPStatus dari struktur AMCOPPStatusOutput . Ukuran data yang valid dalam respons diberikan di anggota cbSizeData . Untuk memastikan integritas pesan, driver menghitung kode autentikasi pesan (MAC) menggunakan algoritma OMAC 1, dan mengembalikan nilai ini di anggota macKDI struktur. Aplikasi harus memverifikasi nilai ini sebagai berikut:

  1. Hitung tag OMAC untuk blok data yang muncul setelah anggota macKDI dari struktur AMCOPPStatusOutput (dengan kata lain, cbSizeData plus COPPStatus).
  2. Bandingkan tag ini dengan nilai di macKDI, menggunakan memcmp lurus.

Algoritma OMAC 1 dijelaskan secara rinci di https://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html. COPP menggunakan parameter OMAC-1 berikut:

  • E = AES
  • t = 128 bit

Data yang dikembalikan dari permintaan status selalu dimulai dengan dua item:

  • Nilai rApp yang sama yang diteruskan oleh aplikasi. Anda harus memverifikasi bahwa nilai ini cocok dengan nilai asli yang disimpan pada tumpukan.
  • Nilai COPP_StatusFlags yang menunjukkan apakah status perlindungan output telah berubah.

Karena koneksi dapat hilang atau dikonfigurasi ulang, aplikasi harus secara berkala melakukan polling driver untuk status saat ini. Jika bendera COPP_RenegotiationRequired diatur, aplikasi harus mencoba mengatur ulang tingkat perlindungan. Jika bendera COPP_LinkLost diatur, aplikasi harus berhenti memutar konten. Misalnya, bendera COPP_LinkLost dapat dikembalikan karena pengguna memutuskan sambungan konektor output. Aplikasi harus merilis instans VMR saat ini, membuat instans baru VMR, dan membuat sesi COPP baru (termasuk pertukaran kunci dan validasi sertifikat).

Menggunakan Certified Output Protection Protocol (COPP)