Freigeben über


Weiterleiten von DRM-Inhalts-IDs

Der DRMK-Systemtreiber entschlüsselt einen Audiowiedergabestream, der geschützte Inhalte enthält. DRMK implementiert einen KS-Filter, der einen Eingabedatenstrom mit den verschlüsselten Daten aufnimmt, aufhebt und den ungecrambierten Datenstrom in einen Datenpfad einspeist, der aus einer Reihe von Kernel-residenten Modulen besteht. Diese Module können KS-Filter oder andere Arten von Treibern sein. Der Datenpfad endet in der Regel in einem Audiorenderinggerät, das den digitalen Inhalt in ein analoges Signal konvertiert, das über Lautsprecher wiedergegeben werden kann.

Bevor der nicht gekraterte Inhalt den Datenpfad eingeben kann, überprüft DRMK, ob der Datenpfad sicher ist. Dazu authentifiziert DRMK jedes Modul im Datenpfad, beginnend mit dem Modul am Upstream Ende des Datenpfads und wechselt nach unten an das andere Ende des Datenpfads. Die folgende Abbildung veranschaulicht diesen Vorgang.

Diagramm, das einen sicheren Datenpfad mit Authentifizierungsprozess veranschaulicht.

In der vorherigen Abbildung stellen die vollfarbigen Pfeile den Datenpfad dar, und die gestrichelten Pfeile stellen die Kommunikation dar, die erforderlich ist, um zu überprüfen, ob der Datenpfad sicher ist. Die unverschlüsselten Daten gelangen erst in den Pfad, nachdem DRMK die Authentifizierung aller Module in diesem Pfad abgeschlossen hat.

Nachdem das DRMK jedes Modul authentifiziert hat, stellt dieses Modul DRMK Informationen zum nächsten Modul im Datenpfad bereit, damit es auch authentifiziert werden kann. Wenn jedes Modul authentifiziert wird, erhält es die DRM-Inhalts-ID, die den Stream identifiziert.

Beginnend am Upstream Ende des sicheren Datenpfads leitet DRMK die Inhalts-ID an Modul A weiter, das wiederum die Inhalts-ID an Modul B weiterleitet. Dieser Prozess wird fortgesetzt, bis die Inhalts-ID an Modul Z weitergeleitet wird, dem letzten Modul im sicheren Datenpfad.

Die folgende Abbildung zeigt ein Paar benachbarter Module im Datenpfad.

Diagramm, das den Prozess der Weiterleitung einer Inhalts-ID zwischen benachbarten Modulen zeigt.

Das Modul auf der Upstream-Seite ruft eine der folgenden DRM-Funktionen auf, um DRMK-Informationen über das downstream-Modul bereitzustellen und die Inhalts-ID an dieses Modul weiterzuleiten:

DrmForwardContentToDeviceObject

DrmForwardContentToInterface

DrmAddContentHandlers

Jede dieser "Weiterleitungsfunktionen" stellt DRMK mit der DRM-Inhalts-ID zur Identifizierung des geschützten Datenstroms und mit Informationen bereit, die DRMK zum Authentifizieren des Downstreammoduls benötigt. Die Wahl, welche dieser drei Funktionen aufgerufen werden soll, hängt vom Typ der Schnittstelle ab, die die beiden benachbarten Module für die Kommunikation miteinander verwenden, während sie die Übertragung geschützter Inhalte verwalten:

  1. Wenn das Upstream Modul IoCallDriver aufruft, um mit dem downstream-Modul zu kommunizieren, ist das Downstreammodul Teil eines WDM-Treibers. In diesem Fall ruft das modul Upstream DrmForwardContentToDeviceObject auf, um DRMK mit dem Geräteobjekt bereitzustellen, das das downstream-Modul darstellt. DRMK verwendet das Geräteobjekt, um das Downstreammodul zu authentifizieren.

  2. Wenn die beiden Module über eine COM-Schnittstelle kommunizieren, die das downstream-Modul implementiert, ruft das Upstream Modul DrmForwardContentToInterface auf. Dieser Aufruf stellt DRMK einen Zeiger auf die COM-Schnittstelle des downstream-Moduls bereit. DRMK ruft nur die IUnknown-Methoden in dieser Schnittstelle auf und trifft keine Annahmen über die anderen Methoden, obwohl sich die beiden Module selbst darauf einigen müssen, was diese Methoden tun. DRMK überprüft, ob der Einstiegspunkt für jede Methode in der Schnittstelle zu einem authentifizierten Modul gehört. Wenn die Einstiegspunkte auf mehrere Module verteilt sind, authentifiziert DRMK alle diese Module.

  3. Wenn die beiden Module weder eine COM-Schnittstelle noch die IoCallDriver-Funktion für die Kommunikation verwenden, ruft das Upstream Modul DrmAddContentHandlers auf, um DRMK mit einer Liste von Einstiegspunkten für "Inhaltshandler" bereitzustellen, die im downstreammodul implementiert sind. DRMK ruft die Inhaltshandler nicht auf und trifft keine Annahmen bezüglich der funktionen, die sie ausführen. DRMK authentifiziert jedoch das Modul (oder die Module), in dem sich die Einstiegspunkte befinden.

Nach der Authentifizierung benötigt das downstream-Modul die folgenden Informationen:

  • Die DRM-Inhalts-ID, die den Stream identifiziert, der den geschützten Inhalt enthält. Das Modul erfordert diese ID, um DRMK über jedes Modul zu informieren, das weiter nachgeschaltet ist, an das der geschützte Inhalt gesendet werden soll.

  • Die DRM-Inhaltsberechtigungen, die dem geschützten Inhalt zugeordnet sind. Das Modul erfordert die Inhaltsrechte, um die entsprechende Sicherheitsstufe zu erzwingen.

Jede der drei Weiterleitungsfunktionen stellt diese Informationen dem Modul auf etwas unterschiedliche Weise zur Verfügung:

  1. Die DrmForwardContentToDeviceObject-Funktion sendet eine KSPROPERTY_DRMAUDIOSTREAM_CONTENTID set-property-Anforderung an das Geräteobjekt des nachgeschalteten Moduls. Diese Anforderung leitet die Inhalts-ID und die Inhaltsrechte des Streams an das downstream-Modul weiter.

  2. Die DrmForwardContentToInterface-Funktion fragt die COM-Schnittstelle des downstream-Moduls für die IDrmAudioStream-Schnittstelle ab. Wenn die Abfrage erfolgreich ist, ruft die Funktion die IDrmAudioStream::SetContentId-Methode auf, um die Inhalts-ID und die Inhaltsrechte an das downstream-Modul weiterzuleiten.

  3. Im Fall der DrmAddContentHandlers-Funktion ist der Aufrufer (das modul Upstream) für die Weiterleitung der Inhalts-ID und der Inhaltsrechte des Streams an das downstream-Modul verantwortlich. Sobald DrmAddContentHandlers mit einem Erfolgscode zurückgegeben wird, der angibt, dass das Downstreammodul authentifiziert wurde, übergibt das Upstream Modul die Inhalts-ID und die Inhaltsrechte an das downstream-Modul, indem es einen seiner Inhaltshandler aufruft.

Wenn das Upstream Modul ein WaveCyclic- oder WavePci-Miniporttreiber ist, kann es die entsprechende DRM-Funktion indirekt über eine der folgenden Methoden aufrufen:

IDrmPort2::ForwardContentToDeviceObject

IDrmPort::ForwardContentToInterface

IDrmPort2::AddContentHandlers

Weitere Informationen finden Sie unter DRM-Funktionen.

Der Einfachheit halber wird in der vorherigen Erläuterung davon ausgegangen, dass jedes Modul im Datenpfad einen Stream aus einer einzelnen Quelle akzeptiert und diesen Stream an höchstens ein Downstreammodul weiterleitet. Tatsächlich kann ein Modul einen Stream an zwei oder mehr Downstreammodule weiterleiten, muss aber zunächst jedes Downstreammodul authentifizieren, indem es eine der drei Weiterleitungsfunktionen aufruft. Auf ähnliche Weise kann ein Modul mehrere Eingabestreams kombinieren, muss jedoch die Inhaltsrechte der Eingabestreams respektieren, indem es dem gemischten Ausgabedatenstrom die entsprechende Schutzebene bietet. Weitere Informationen finden Sie in der Erläuterung der DrmCreateContentMixed-Funktion in Inhalts-IDs und Inhaltsrechten.

Ein typischer sicherer Datenpfad besteht aus dem KMixer-Systemtreiber , gefolgt von einem Wellenfilter, der das Audiorenderinggerät darstellt. Der Filter wird als WaveCyclic- oder WavePci-Miniporttreiber in Kombination mit dem entsprechenden Porttreiber implementiert. Um zu überprüfen, ob der Datenpfad sicher ist, leitet DRMK die Inhalts-ID an KMixer weiter, die wiederum die Inhalts-ID an den Filter weiterleitet. Der Porttreiber, der die generische Filterfunktionalität implementiert, empfängt die Inhalts-ID und leitet sie an den Miniporttreiber weiter. Insbesondere ruft der Porttreiber die DrmForwardContentToInterface-Funktion auf, um die Inhalts-ID an das Streamobjekt weiterzuleiten, das der Miniporttreiber instanziiert hat, um den Wellenausgabepin auf dem Audiorenderinggerät darzustellen. Einer der Parameterwerte für diesen Aufruf ist ein Zeiger auf die IMiniportWaveCyclicStream - oder IMiniportWavePciStream-Schnittstelle des Streamobjekts. Über diese Schnittstelle fragt die Funktion das Streamobjekt nach seiner IDrmAudioStream-Schnittstelle ab und ruft die SetContentId-Methode dieser Schnittstelle auf.

Weitere Informationen finden Sie in den Implementierungen der SetContentId-Methode im Sysvad-Beispieltreiber, der unter Beispielaudiotreiber erläutert wird.