Udostępnij przez


Przekazywanie identyfikatorów zawartości DRM

Sterownik systemowy DRMK odszyfrowuje strumień odtwarzania audio zawierający chronioną zawartość. DrMK implementuje filtr KS, który pobiera strumień wejściowy zawierający dane zakodowane, rozszyfrowuje je i przesyła strumień rozszyfrowany do ścieżki danych składającej się z niektórych modułów rezydentnych jądra. Te moduły mogą być filtrami KS lub innymi typami sterowników. Ścieżka danych zwykle kończy się na urządzeniu renderowania audio, które konwertuje zawartość cyfrową na sygnał analogowy, który może być odtwarzany przez głośniki.

Zanim DRMK zezwoli na wprowadzenie niezaszyfrowanej zawartości do ścieżki danych, sprawdza, czy ścieżka danych jest bezpieczna. W tym celu narzędzie DRMK uwierzytelnia każdy moduł w ścieżce danych, zaczynając od modułu na końcu nadrzędnej ścieżki danych i przechodząc do drugiego końca ścieżki danych. Na poniższej ilustracji przedstawiono ten proces.

Diagram przedstawiający bezpieczną ścieżkę danych z procesem uwierzytelniania.

Na powyższej ilustracji strzałki stałe reprezentują ścieżkę danych, a strzałki kreskowane reprezentują komunikację niezbędną do sprawdzenia, czy ścieżka danych jest bezpieczna. Odszyfrowane dane wchodzą w ścieżkę dopiero po zakończeniu procesu uwierzytelniania wszystkich modułów w tej ścieżce przez DRMK.

Po uwierzytelnieniu modułu DRMK moduł ten dostarcza drMK informacje o następnym module w ścieżce danych, dzięki czemu można go również uwierzytelnić. Podczas uwierzytelniania każdego modułu otrzymuje identyfikator zawartości DRM, który identyfikuje strumień.

Począwszy od nadrzędnego końca bezpiecznej ścieżki danych, drMK przekazuje identyfikator zawartości do modułu A, który z kolei przekazuje identyfikator zawartości do modułu B. Ten proces będzie kontynuowany do momentu przekazania identyfikatora zawartości do modułu Z, ostatniego modułu w bezpiecznej ścieżce danych.

Na poniższej ilustracji przedstawiono parę sąsiednich modułów w ścieżce danych.

Diagram przedstawiający proces przekazywania identyfikatora zawartości między sąsiednimi modułami.

Moduł po stronie nadrzędnej wywołuje jedną z następujących DRM funkcji, aby zapewnić DRMK informacje o module podrzędnym i przekazać identyfikator zawartości do tego modułu.

DrmForwardContentToDeviceObject

DrmForwardContentToInterface

DrmAddContentHandlers

Każda z tych funkcji "przekazywania" dostarcza DRMK identyfikator zawartości DRM, który identyfikuje chroniony strumień, oraz informacje, które DRMK potrzebuje do uwierzytelnienia modułu podrzędnego. Wybór tych trzech funkcji do wywołania zależy od typu interfejsu używanego przez dwa sąsiadujące moduły do komunikowania się ze sobą podczas zarządzania transferem chronionej zawartości:

  1. Jeśli moduł nadrzędny wywołuje usługę IoCallDriver w celu komunikowania się z modułem podrzędnym, moduł podrzędny jest częścią sterownika WDM. W takim przypadku moduł nadrzędny wywołuje metodę DrmForwardContentToDeviceObject , aby zapewnić drMK obiektowi urządzenia reprezentującemu moduł podrzędny. Narzędzie DRMK używa obiektu urządzenia do uwierzytelniania modułu podrzędnego.

  2. Jeśli dwa moduły komunikują się za pośrednictwem interfejsu COM, który implementuje moduł podrzędny, moduł nadrzędny wywołuje moduł DrmForwardContentToInterface. To wywołanie przekazuje DRMK wskaźnik do interfejsu COM modułu niższego poziomu. Narzędzie DRMK wywołuje tylko metody IUnknown w tym interfejsie i nie zakłada niczego na temat innych metod, chociaż te dwa moduły muszą się zgodzić co do tego, co robią te metody. Narzędzie DRMK sprawdza, czy punkt wejścia dla każdej metody w interfejsie należy do uwierzytelnionego modułu. Jeśli punkty wejścia są dystrybuowane między kilka modułów, narzędzie DRMK uwierzytelnia wszystkie te moduły.

  3. Jeśli dwa moduły nie używają ani interfejsu COM, ani funkcji IoCallDriver do komunikacji, moduł nadrzędny wywołuje DrmAddContentHandlers w celu zapewnienia DRMK listy punktów wejściowych do "programów obsługi zawartości", które są implementowane w module podrzędnym. Zestaw DRMK nie wywołuje procedur obsługi zawartości i nie przyjmuje żadnych założeń dotyczących funkcji, które wykonują. DrMK uwierzytelnia jednak moduł (lub moduły), w którym znajdują się punkty wejścia.

Po uwierzytelnieniu moduł podrzędny wymaga następujących informacji:

  • Identyfikator zawartości DRM identyfikujący strumień zawierający chronioną zawartość. Moduł wymaga tego identyfikatora, aby poinformować DRMK o dowolnym module, dalej w strumieniu danych, do którego planuje wysłać chronioną zawartość.

  • Prawa zawartości DRM skojarzone z chronioną zawartością. Moduł wymaga praw do zawartości, aby wymusić odpowiedni poziom zabezpieczeń.

Każda z trzech funkcji przekazywania udostępnia te informacje modułowi w nieco inny sposób:

  1. Funkcja DrmForwardContentToDeviceObject wysyła żądanie typu "set-property" KSPROPERTY_DRMAUDIOSTREAM_CONTENTID do obiektu urządzenia modułu podrzędnego. To żądanie przesyła identyfikator zawartości i prawa do zawartości strumienia do modułu podrzędnego.

  2. Funkcja DrmForwardContentToInterface wysyła zapytanie do interfejsu COM modułu podrzędnego dla interfejsu IDrmAudioStream . Jeśli zapytanie powiedzie się, funkcja wywołuje metodę IDrmAudioStream::SetContentId , aby przekazać identyfikator zawartości i prawa zawartości do modułu podrzędnego.

  3. W przypadku funkcji DrmAddContentHandlers obiekt wywołujący (moduł nadrzędny) jest odpowiedzialny za przekazywanie identyfikatora zawartości i praw zawartości strumienia do modułu podrzędnego. Gdy funkcja DrmAddContentHandlers zwróci kod powodzenia wskazujący, że moduł podrzędny został uwierzytelniony, moduł nadrzędny przekazuje identyfikator zawartości i prawa zawartości do modułu podrzędnego przez wywołanie jednego z jego programów obsługi zawartości.

Jeśli nadrzędny moduł jest sterownikiem miniportu WaveCyclic lub WavePci, może pośrednio wywołać odpowiednią funkcję DRM poprzez jedną z następujących metod:

IDrmPort2::ForwardContentToDeviceObject

IDrmPort::ForwardContentToInterface

IDrmPort2::AddContentHandlers

Aby uzyskać więcej informacji, zobacz FUNKCJE DRM.

Dla uproszczenia w poprzedniej dyskusji założono, że każdy moduł w ścieżce danych akceptuje strumień z jednego źródła i przekazuje ten strumień do co najwyżej jednego modułu podrzędnego. W rzeczywistości moduł może przekazać strumień do co najmniej dwóch modułów podrzędnych, ale musi najpierw uwierzytelnić każdy moduł podrzędny, wywołując jedną z trzech funkcji przekazywania dalej. Podobnie moduł może mieszać ze sobą kilka strumieni wejściowych, ale musi przestrzegać praw do zawartości strumieni wejściowych, zapewniając odpowiedni poziom ochrony dla mieszanego strumienia wyjściowego. Aby uzyskać więcej informacji, zobacz omówienie funkcji DrmCreateContentMixed w identyfikatorach zawartości i prawach zawartości.

Typowa bezpieczna ścieżka danych składa się z sterownika systemu KMixer , po którym następuje filtr falowy reprezentujący urządzenie renderowania audio. Filtr jest implementowany jako miniportowy sterownik WaveCyclic lub WavePci, w połączeniu z odpowiednim sterownikiem portu. Aby sprawdzić, czy ścieżka danych jest bezpieczna, drMK przekazuje identyfikator zawartości do usługi KMixer, która z kolei przekazuje identyfikator zawartości do filtru. Sterownik portu, który implementuje ogólną funkcjonalność filtru, odbiera identyfikator zawartości i przekazuje go do sterownika miniportu. W szczególności sterownik portu wywołuje funkcję DrmForwardContentToInterface, aby przekazać identyfikator zawartości do obiektu strumienia. Obiekt ten został utworzony przez sterownik miniportu, aby reprezentować pin wyjścia fal na urządzeniu odtwarzającym dźwięk. Jedna z wartości parametrów w tym wywołaniu to wskaźnik do interfejsu IMiniportWaveCyclicStream lub IMiniportWavePciStream obiektu strumienia. Za pomocą tego interfejsu funkcja wysyła zapytanie do obiektu strumienia dla interfejsu IDrmAudioStream i wywołuje metodę SetContentId tego interfejsu.

Aby uzyskać więcej informacji, zobacz implementacje metody SetContentId w przykładowym sterowniku Sysvad, który został omówiony w przykładowych sterownikach audio.