Inoltro di ID contenuto DRM
Il driver di sistema DRMK annulla la disinstallazione di un flusso di riproduzione audio contenente contenuto protetto. DRMK implementa un filtro KS che accetta un flusso di input contenente i dati scrambled, lo annulla e lo inserisce in un percorso di dati costituito da un certo numero di moduli residenti del kernel. Questi moduli possono essere filtri KS o altri tipi di driver. Il percorso dei dati termina in genere in un dispositivo di rendering audio che converte il contenuto digitale in un segnale analogico che può essere riprodotto tramite altoparlanti.
Prima di consentire al contenuto non risolto di immettere il percorso dei dati, DRMK verifica che il percorso dei dati sia sicuro. A tale scopo, DRMK autentica ogni modulo nel percorso dati, a partire dal modulo alla fine del percorso dati e spostando il downstream all'altra estremità del percorso dati. La figura seguente illustra questo processo.
Nella figura precedente le frecce solide rappresentano il percorso dei dati e le frecce tratteggiate rappresentano le comunicazioni necessarie per verificare che il percorso dati sia sicuro. I dati non crittografati entrano nel percorso solo dopo che DRMK ha completato l'autenticazione di tutti i moduli in tale percorso.
Dopo che DRMK autentica ogni modulo, tale modulo fornisce DRMK con informazioni sul modulo successivo nel percorso dati in modo che possa anche essere autenticato. Quando ogni modulo viene autenticato, riceve l'ID contenuto DRM che identifica il flusso.
A partire dalla fine upstream del percorso dati sicuro, DRMK inoltra l'ID contenuto al modulo A, che a sua volta inoltra l'ID contenuto al modulo B. Questo processo continua fino a quando l'ID contenuto non viene inoltrato al modulo Z, l'ultimo modulo nel percorso dati sicuro.
La figura seguente mostra una coppia di moduli adiacenti nel percorso dati.
Il modulo sul lato upstream chiama una delle seguenti funzioni DRM per fornire DRMK con informazioni sul modulo downstream e per inoltrare l'ID contenuto a tale modulo:
DrmForwardContentToDeviceObject
Ognuna di queste funzioni di inoltro fornisce DRMK con l'ID contenuto DRM che identifica il flusso protetto e con informazioni che DRMK deve autenticare il modulo downstream. La scelta di queste tre funzioni da chiamare dipende dal tipo di interfaccia che i due moduli adiacenti usano per comunicare tra loro mentre gestiscono il trasferimento di contenuto protetto:
Se il modulo upstream chiama IoCallDriver per comunicare con il modulo downstream, il modulo downstream fa parte di un driver WDM. In questo caso, il modulo upstream chiama DRMForwardContentToDeviceObject per fornire DRMK con l'oggetto dispositivo che rappresenta il modulo downstream. DRMK usa l'oggetto dispositivo per autenticare il modulo downstream.
Se i due moduli comunicano tramite un'interfaccia COM implementata dal modulo downstream, il modulo upstream chiama DRMForwardContentToInterface. Questa chiamata fornisce DRMK con un puntatore all'interfaccia COM del modulo downstream. DRMK chiama solo i metodi IUnknown in questa interfaccia e non effettua presupposti sugli altri metodi, anche se i due moduli stessi devono accettare ciò che questi metodi fanno. DRMK verifica che il punto di ingresso per ogni metodo nell'interfaccia appartenga a un modulo autenticato. Se i punti di ingresso vengono distribuiti tra diversi moduli, DRMK autentica tutti questi moduli.
Se i due moduli usano né un'interfaccia COM né la funzione IoCallDriver per comunicare, il modulo upstream chiama DRMAddContentHandlers per fornire DRMK con un elenco di punti di ingresso a "gestori di contenuto" implementati nel modulo downstream. DRMK non chiama i gestori di contenuto e non presuppone alcuna ipotesi riguardo alle funzioni eseguite. DRMK esegue tuttavia l'autenticazione del modulo (o dei moduli) in cui risiedono i punti di ingresso.
Dopo l'autenticazione, il modulo downstream richiede le informazioni seguenti:
ID contenuto DRM che identifica il flusso contenente il contenuto protetto. Il modulo richiede questo ID per informare DRMK di qualsiasi modulo, ulteriore downstream, a cui prevede di inviare il contenuto protetto.
Diritti di contenuto DRM associati al contenuto protetto. Il modulo richiede i diritti di contenuto per applicare il livello di sicurezza appropriato.
Ognuna delle tre funzioni di inoltro fornisce queste informazioni al modulo in modo leggermente diverso:
La funzione DrmForwardContentToDeviceObject invia una richiesta KSPROPERTY_DRMAUDIOSTREAM_CONTENTID set-property all'oggetto dispositivo del modulo downstream. Questa richiesta inoltra l'ID contenuto e i diritti di contenuto del flusso al modulo downstream.
La funzione DRMForwardContentToInterface esegue una query sull'interfaccia COM del modulo downstream per l'interfaccia IDrmAudioStream . Se la query ha esito positivo, la funzione chiama il metodo IDrmAudioStream::SetContentId per inoltrare l'ID contenuto e i diritti di contenuto al modulo downstream.
Nel caso della funzione DrmAddContentHandlers , il chiamante (il modulo upstream) è responsabile dell'inoltro dell'ID contenuto e dei diritti di contenuto del flusso al modulo downstream. Dopo aver restituito DRMAddContentHandlers con un codice di esito positivo che indica che il modulo downstream è stato autenticato, il modulo upstream passa l'ID contenuto e i diritti di contenuto al modulo downstream chiamando uno dei gestori di contenuto.
Se il modulo upstream è un driver miniport WaveCyclic o WavePci, può chiamare indirettamente la funzione DRM appropriata tramite uno dei metodi seguenti:
IDrmPort2::ForwardContentToDeviceObject
IDrmPort::ForwardContentToInterface
Per altre informazioni, vedere Funzioni DRM.
Per semplicità, la discussione precedente presuppone che ogni modulo nel percorso dati accetti un flusso da un'unica origine e inoltra tale flusso alla maggior parte di un modulo downstream. In effetti, un modulo può inoltrare un flusso a due o più moduli downstream, ma deve prima autenticare ogni modulo downstream chiamando una delle tre funzioni di inoltro. Analogamente, un modulo può combinare diversi flussi di input, ma deve rispettare i diritti di contenuto dei flussi di input fornendo il livello di protezione appropriato al flusso di output misto. Per altre informazioni, vedere la discussione sulla funzione DrmCreateContentMixed in ID contenuto e diritti di contenuto.
Un tipico percorso di dati sicuro è costituito dal driver di sistema KMixer seguito da un filtro di onda che rappresenta il dispositivo di rendering audio. Il filtro viene implementato come driver miniport WaveCyclic o WavePci in combinazione con il driver di porta corrispondente. Per verificare che il percorso dati sia sicuro, DRMK inoltra l'ID contenuto a KMixer, che a sua volta inoltra l'ID contenuto al filtro. Il driver di porta, che implementa la funzionalità di filtro generico, riceve l'ID contenuto e lo inoltra al driver miniport. In particolare, il driver di porta chiama la funzione DrmForwardContentToInterface per inoltrare l'ID contenuto all'oggetto di flusso che il driver miniport ha creato un'istanza per rappresentare il pin di output wave nel dispositivo di rendering audio. Uno dei valori dei parametri per questa chiamata è un puntatore all'interfaccia IMiniportWaveCyclicStream dell'oggetto di flusso o IMiniportWavePciStream . Tramite questa interfaccia, la funzione esegue una query sull'oggetto di flusso per l'interfaccia IDrmAudioStream e chiama il metodo SetContentId dell'interfaccia.
Per altre informazioni, vedere le implementazioni del metodo SetContentId nel driver di esempio Sysvad, illustrato in Driver audio di esempio.