DRM 콘텐츠 ID 전달
DRMK 시스템 드라이버는 보호된 콘텐츠가 포함된 오디오 재생 스트림을 해독합니다. DRMK는 스크램블된 데이터가 포함된 입력 스트림을 사용하고, 데이터를 해독하고, 스크래블되지 않은 스트림을 일부 커널 상주 모듈로 구성된 데이터 경로에 공급하는 KS 필터를 구현합니다. 이러한 모듈은 KS 필터 또는 다른 유형의 드라이버일 수 있습니다. 데이터 경로는 일반적으로 디지털 콘텐츠를 스피커를 통해 재생할 수 있는 아날로그 신호로 변환하는 오디오 렌더링 디바이스에서 끝납니다.
비스크래블된 콘텐츠가 데이터 경로를 입력하도록 허용하기 전에 DRMK는 데이터 경로가 안전한지 확인합니다. 이를 위해 DRMK는 데이터 경로의 업스트림 끝에 있는 모듈부터 시작하여 데이터 경로의 다른 끝으로 다운스트림으로 이동하여 데이터 경로의 각 모듈을 인증합니다. 다음 그림에서는 이 프로세스를 보여 줍니다.
앞의 그림에서 단색 화살표는 데이터 경로를 나타내고 파선 화살표는 데이터 경로가 안전한지 확인하는 데 필요한 통신을 나타냅니다. DRMK가 해당 경로의 모든 모듈 인증을 완료한 후에만 비스크래블된 데이터가 경로에 들어갑니다.
DRMK가 각 모듈을 인증한 후 해당 모듈은 인증할 수 있도록 데이터 경로의 다음 모듈에 대한 정보를 DRMK에 제공합니다. 각 모듈이 인증되면 스트림을 식별하는 DRM 콘텐츠 ID를 받습니다.
보안 데이터 경로의 업스트림 끝에서부터 DRMK는 콘텐츠 ID를 모듈 A로 전달하고, 이 ID는 콘텐츠 ID를 모듈 B로 전달합니다. 이 프로세스는 콘텐츠 ID가 보안 데이터 경로의 마지막 모듈인 모듈 Z로 전달될 때까지 계속됩니다.
다음 그림에서는 데이터 경로에 인접한 모듈 쌍을 보여 줍니다.
업스트림 쪽의 모듈은 다음 DRM 함수 중 하나를 호출하여 DRMK에 다운스트림 모듈에 대한 정보를 제공하고 콘텐츠 ID를 해당 모듈로 전달합니다.
DrmForwardContentToDeviceObject
이러한 각 "전달" 함수는 DRMK에 보호된 스트림을 식별하는 DRM 콘텐츠 ID와 DRMK가 다운스트림 모듈을 인증하는 데 필요한 정보를 제공합니다. 이러한 세 가지 함수 중 어떤 함수를 호출할지는 두 인접한 모듈이 보호된 콘텐츠 전송을 관리할 때 서로 통신하는 데 사용하는 인터페이스 유형에 따라 달라집니다.
업스트림 모듈이 IoCallDriver를 호출하여 다운스트림 모듈과 통신하는 경우 다운스트림 모듈은 WDM 드라이버의 일부입니다. 이 경우 업스트림 모듈은 DrmForwardContentToDeviceObject를 호출하여 DRMK에 다운스트림 모듈을 나타내는 디바이스 개체를 제공합니다. DRMK는 디바이스 개체를 사용하여 다운스트림 모듈을 인증합니다.
두 모듈이 다운스트림 모듈이 구현하는 COM 인터페이스를 통해 통신하는 경우 업스트림 모듈은 DrmForwardContentToInterface를 호출합니다. 이 호출은 DRMK에 다운스트림 모듈의 COM 인터페이스에 대한 포인터를 제공합니다. DRMK는 이 인터페이스에서 IUnknown 메서드만 호출하고 다른 메서드에 대한 가정을 하지 않지만 두 모듈 자체는 이러한 메서드가 수행하는 일에 동의해야 합니다. DRMK는 인터페이스의 각 메서드에 대한 진입점이 인증된 모듈에 속하는지 확인합니다. 진입점이 여러 모듈 간에 분산되면 DRMK는 이러한 모든 모듈을 인증합니다.
두 모듈이 COM 인터페이스나 IoCallDriver 함수를 모두 사용하여 통신하지 않는 경우 업스트림 모듈은 DrmAddContentHandlers를 호출하여 DRMK에 다운스트림 모듈에서 구현된 "콘텐츠 처리기"에 대한 진입점 목록을 제공합니다. DRMK는 콘텐츠 처리기를 호출하지 않으며 수행하는 함수에 대해 어떠한 가정도 하지 않습니다. 그러나 DRMK는 진입점이 있는 모듈(또는 모듈)을 인증합니다.
인증된 후 다운스트림 모듈에는 다음 정보가 필요합니다.
보호된 콘텐츠가 포함된 스트림을 식별하는 DRM 콘텐츠 ID입니다. 이 모듈은 보호된 콘텐츠를 보낼 계획인 모든 모듈의 추가 다운스트림을 DRMK에 알리기 위해 이 ID가 필요합니다.
보호된 콘텐츠와 연결된 DRM 콘텐츠 권한입니다. 모듈은 적절한 수준의 보안을 적용하기 위해 콘텐츠 권한이 필요합니다.
세 가지 전달 함수는 각각 약간 다른 방식으로 모듈에 이 정보를 제공합니다.
DrmForwardContentToDeviceObject 함수는 KSPROPERTY_DRMAUDIOSTREAM_CONTENTID set-property 요청을 다운스트림 모듈의 디바이스 개체로 보냅니다. 이 요청은 스트림의 콘텐츠 ID 및 콘텐츠 권한을 다운스트림 모듈에 전달합니다.
DrmForwardContentToInterface 함수는 IDrmAudioStream 인터페이스에 대한 다운스트림 모듈의 COM 인터페이스를 쿼리합니다. 쿼리가 성공하면 함수는 IDrmAudioStream::SetContentId 메서드를 호출하여 콘텐츠 ID 및 콘텐츠 권한을 다운스트림 모듈로 전달합니다.
DrmAddContentHandlers 함수의 경우 호출자(업스트림 모듈)는 스트림의 콘텐츠 ID 및 콘텐츠 권한을 다운스트림 모듈로 전달해야 합니다. DrmAddContentHandlers가 다운스트림 모듈이 인증되었음을 나타내는 성공 코드와 함께 반환되면 업스트림 모듈은 콘텐츠 처리기 중 하나를 호출하여 콘텐츠 ID 및 콘텐츠 권한을 다운스트림 모듈에 전달합니다.
업스트림 모듈이 WaveCyclic 또는 WavePci 미니포트 드라이버인 경우 다음 방법 중 하나를 통해 적절한 DRM 함수를 간접적으로 호출할 수 있습니다.
IDrmPort2::ForwardContentToDeviceObject
IDrmPort::ForwardContentToInterface
자세한 내용은 DRM 함수를 참조하세요.
간단히 하기 위해 앞의 설명에서는 데이터 경로의 각 모듈이 단일 원본의 스트림을 수락하고 해당 스트림을 최대 하나의 다운스트림 모듈로 전달한다고 가정합니다. 실제로 모듈은 스트림을 두 개 이상의 다운스트림 모듈로 전달할 수 있지만, 먼저 세 가지 전달 함수 중 하나를 호출하여 각 다운스트림 모듈을 인증해야 합니다. 마찬가지로 모듈은 여러 입력 스트림을 함께 혼합할 수 있지만 혼합 출력 스트림에 적절한 수준의 보호를 제공하여 입력 스트림의 콘텐츠 권한을 존중해야 합니다. 자세한 내용은 콘텐츠 ID 및 콘텐츠 권한의 DrmCreateContentMixed 함수에 대한 설명을 참조하세요.
일반적인 보안 데이터 경로는 KMixer 시스템 드라이버 와 오디오 렌더링 디바이스를 나타내는 웨이브 필터로 구성됩니다. 필터는 해당 포트 드라이버와 함께 WaveCyclic 또는 WavePci 미니포트 드라이버로 구현됩니다. 데이터 경로가 안전한지 확인하기 위해 DRMK는 콘텐츠 ID를 KMixer에 전달하여 콘텐츠 ID를 필터에 전달합니다. 제네릭 필터 기능을 구현하는 포트 드라이버는 콘텐츠 ID를 수신하고 미니포트 드라이버에 전달합니다. 특히 포트 드라이버는 DrmForwardContentToInterface 함수를 호출하여 미니포트 드라이버가 인스턴스화한 스트림 개체에 콘텐츠 ID를 전달하여 오디오 렌더링 디바이스의 웨이브 출력 핀을 나타냅니다. 이 호출에 대한 매개 변수 값 중 하나는 스트림 개체의 IMiniportWaveCyclicStream 또는 IMiniportWavePciStream 인터페이스에 대한 포인터입니다. 이 인터페이스를 통해 함수는 IDrmAudioStream 인터페이스에 대한 스트림 개체를 쿼리하고 해당 인터페이스의 SetContentId 메서드를 호출합니다.
자세한 내용은 샘플 오디오 드라이버에 설명된 Sysvad 샘플 드라이버에서 SetContentId 메서드의 구현을 참조하세요.