轉送 DRM 內容識別碼
DRMK 系統驅動程式會取消編目包含受保護內容的音訊播放串流。 DRMK 會實作 KS 篩選準則,該篩選準則會採用包含混搭資料的輸入資料流程、取消壓縮資料,並將未編列的資料流程饋送至包含一些核心駐留模組的資料路徑。 這些模組可以是 KS 篩選器或其他類型的驅動程式。 資料路徑通常以音訊轉譯裝置結尾,可將數位內容轉換成可透過喇叭播放的類比訊號。
在允許未壓縮的內容進入資料路徑之前,DRMK 會驗證資料路徑是否安全。 若要這樣做,DRMK 會驗證資料路徑中的每個模組,從資料路徑上游端的模組開始,並將下游移至資料路徑的另一端。 下圖說明此程式。
在上圖中,實心箭號代表資料路徑,虛線箭號代表確認資料路徑安全所需的通訊。 未編目的資料只有在 DRMK 完成驗證該路徑中的所有模組之後,才會進入路徑。
在 DRMK 驗證每個模組之後,該模組會為 DRMK 提供資料路徑中下一個模組的相關資訊,以便也可以進行驗證。 當每個模組經過驗證時,它會收到識別資料流程的 DRM 內容識別碼。
從安全資料路徑的上游結尾開始,DRMK 會將內容識別碼轉送至模組 A,接著會將內容識別碼轉送至模組 B。此程式會繼續執行,直到內容識別碼轉送到模組 Z,這是安全資料路徑中的最後一個模組。
下圖顯示資料路徑中的一對相鄰模組。
上游端的模組會呼叫下列其中一個 DRM 函 式,以提供 DRMK 與下游模組的相關資訊,並將內容識別碼轉送到該模組:
DrmForwardContentToDeviceObject
這其中每一個「轉送」函式都會提供 DRMK 與 DRM 內容識別碼來識別受保護的資料流程,以及 DRMK 需要驗證下游模組的資訊。 這三個要呼叫的函式選擇取決於兩個相鄰模組用來彼此通訊的介面類別型,因為它們會管理受保護內容的傳輸:
如果上游模組呼叫 IoCallDriver 來與下游模組通訊,下游模組是 WDM 驅動程式的一部分。 在此情況下,上游模組會呼叫 DrmForwardContentToDeviceObject ,以提供 DRMK 與代表下游模組的裝置物件。 DRMK 會使用裝置物件來驗證下游模組。
如果兩個模組透過下游模組實作的 COM 介面進行通訊,上游模組會呼叫 DrmForwardContentToInterface。 此呼叫會為 DRMK 提供下游模組 COM 介面的指標。 DRMK 只會呼叫此介面中的 IUnknown 方法,而且不會假設其他方法,不過這兩個模組本身必須同意這些方法的用途。 DRMK 會驗證介面中每個方法的進入點是否屬於已驗證的模組。 如果進入點分散在數個模組之間,DRMK 會驗證所有這些模組。
如果兩個模組都未使用 COM 介面或 IoCallDriver 函 式進行通訊,上游模組會呼叫 DrmAddContentHandlers ,以提供 DRMK 的進入點清單給下游模組中實作的「內容處理常式」。 DRMK 不會呼叫內容處理常式,也不會假設它們所執行的函式。 不過,DRMK 會驗證進入點所在 (模組或模組) 。
驗證之後,下游模組需要下列資訊:
識別包含受保護內容的資料流程的 DRM 內容識別碼。 此模組需要此識別碼,以通知 DRMK 任何模組,進一步下游,其計畫傳送受保護的內容。
與受保護內容相關聯的 DRM 內容許可權。 模組需要內容許可權,才能強制執行適當的安全性層級。
這三個轉送函式中的每一個都會以稍微不同的方式將此資訊提供給模組:
DrmForwardContentToDeviceObject函式會將 set-property要求傳送至下游模組的裝置物件KSPROPERTY_DRMAUDIOSTREAM_CONTENTID。 此要求會將資料流程的內容識別碼和內容許可權轉送至下游模組。
DrmForwardContentToInterface函式會查詢下游模組的 COM 介面,以取得IDrmAudioStream介面。 如果查詢成功,函式會呼叫 IDrmAudioStream::SetContentId 方法,將內容識別碼和內容許可權轉送至下游模組。
在 DrmAddContentHandlers 函式的情況下,上游模組 (呼叫端) 負責將資料流程的內容識別碼和內容許可權轉送至下游模組。 一旦 DrmAddContentHandlers傳回成功代碼,指出下游模組已經過驗證,上游模組會藉由呼叫其中一個內容處理常式,將內容識別碼和內容許可權傳遞至下游模組。
如果上游模組是 WaveCyclic 或 WavePci 迷你埠驅動程式,它可以透過下列其中一種方法間接呼叫適當的 DRM 函式:
IDrmPort2::ForwardContentToDeviceObject
IDrmPort::ForwardContentToInterface
如需詳細資訊,請參閱 DRM 函式。
為了簡單起見,上述討論假設資料路徑中的每個模組都接受來自單一來源的資料流程,並將該資料流程轉送至最多一個下游模組。 事實上,模組可以將資料流程轉送至兩個或多個下游模組,但必須先呼叫三個轉送函式的其中一個來驗證每個下游模組。 同樣地,模組可以將數個輸入資料流程混合在一起,但必須藉由將適當的保護層級提供給混合輸出資料流程,以遵守輸入資料流程的內容許可權。 如需詳細資訊,請參閱內容識別碼和內容版權中DrmCreateContentMixed函式的討論。
典型的安全資料路徑是由 KMixer 系統驅動程式 所組成,後面接著代表音訊轉譯裝置的波浪篩選器。 篩選準則會實作為 WaveCyclic 或 WavePci 迷你埠驅動程式,並結合對應的埠驅動程式。 若要確認資料路徑安全,DRMK 會將內容識別碼轉送至 KMixer,接著會將內容識別碼轉送至篩選。 實作泛型篩選功能的埠驅動程式會接收內容識別碼,並將其轉送至迷你埠驅動程式。 具體而言,埠驅動程式會呼叫 DrmForwardContentToInterface 函式,將內容識別碼轉送至迷你埠驅動程式已具現化為代表音訊轉譯裝置上的波浪輸出針腳的資料流程物件。 這個呼叫的其中一個參數值是資料流程物件的 IMiniportWaveCyclicStream 或 IMiniportWavePciStream 介面的指標。 透過這個介面,函式會查詢資料流程物件是否有其 IDrmAudioStream 介面,並呼叫該介面的 SetContentId 方法。
如需詳細資訊,請參閱 Sysvad 範例驅動程式中的 SetContentId 方法實作,此範例會在 範例音訊驅動程式中討論。