Reenvío de identificadores de contenido DRM
El controlador del sistema DRMK deshace una secuencia de reproducción de audio que contiene contenido protegido. DRMK implementa un filtro KS que toma un flujo de entrada que contiene los datos revueltos, lo desagraba y lo alimenta en una ruta de acceso de datos que consta de algún número de módulos residentes en kernel. Estos módulos pueden ser filtros KS u otros tipos de controladores. La ruta de acceso de datos suele terminar en un dispositivo de representación de audio que convierte el contenido digital en una señal analógica que se puede reproducir a través de altavoces.
Antes de permitir que el contenido no controlado entre en la ruta de acceso de datos, DRMK comprueba que la ruta de acceso de datos es segura. Para ello, DRMK autentica cada módulo en la ruta de acceso de datos, empezando por el módulo al final ascendente de la ruta de acceso de datos y moviendo de bajada al otro extremo de la ruta de acceso de datos. En la ilustración siguiente se muestra este proceso.
En la ilustración anterior, las flechas sólidas representan la ruta de acceso de datos y las flechas discontinuas representan las comunicaciones necesarias para comprobar que la ruta de acceso de datos es segura. Los datos no ordenados entran en la ruta de acceso solo después de que DRMK haya terminado de autenticar todos los módulos de esa ruta de acceso.
Después de autenticar DRMK cada módulo, ese módulo proporciona DRMK con información sobre el siguiente módulo en la ruta de acceso de datos para que también se pueda autenticar. A medida que se autentica cada módulo, recibe el identificador de contenido DRM que identifica la secuencia.
A partir del final ascendente de la ruta de acceso de datos segura, DRMK reenvía el identificador de contenido al módulo A, que a su vez reenvía el identificador de contenido al módulo B. Este proceso continúa hasta que el identificador de contenido se reenvía al módulo Z, el último módulo de la ruta de acceso de datos segura.
En la ilustración siguiente se muestra un par de módulos adyacentes en la ruta de acceso de datos.
El módulo del lado ascendente llama a una de las siguientes funciones DRM para proporcionar DRMK información sobre el módulo de bajada y reenviar el identificador de contenido a ese módulo:
DrmForwardContentToDeviceObject
Cada una de estas funciones de "reenvío" proporciona DRMK con el identificador de contenido drm que identifica la secuencia protegida y con información que DRMK necesita para autenticar el módulo de bajada. La elección de las tres funciones a las que llamar depende del tipo de interfaz que usan los dos módulos adyacentes para comunicarse entre sí a medida que administran la transferencia de contenido protegido:
Si el módulo ascendente llama a IoCallDriver para comunicarse con el módulo de bajada, el módulo de bajada forma parte de un controlador WDM. En este caso, el módulo ascendente llama a DrmForwardContentToDeviceObject para proporcionar DRMK con el objeto de dispositivo que representa el módulo de bajada. DRMK usa el objeto de dispositivo para autenticar el módulo de bajada.
Si los dos módulos se comunican a través de una interfaz COM que implementa el módulo de bajada, el módulo ascendente llama a DrmForwardContentToInterface. Esta llamada proporciona DRMK con un puntero a la interfaz COM del módulo de bajada. DRMK llama solo a los métodos IUnknown en esta interfaz y no supone los otros métodos, aunque los dos módulos deben aceptar lo que hacen estos métodos. DRMK comprueba que el punto de entrada de cada método de la interfaz pertenece a un módulo autenticado. Si los puntos de entrada se distribuyen entre varios módulos, DRMK autentica todos estos módulos.
Si los dos módulos no usan ninguna interfaz COM ni la función IoCallDriver para comunicarse, el módulo ascendente llama a DrmAddContentHandlers para proporcionar DRMK con una lista de puntos de entrada a "controladores de contenido" que se implementan en el módulo de bajada. DRMK no llama a los controladores de contenido y no asume las funciones que realizan. DRMK, sin embargo, autentica el módulo (o módulos) en el que residen los puntos de entrada.
Después de autenticarse, el módulo de bajada requiere la siguiente información:
Identificador de contenido drm que identifica la secuencia que contiene el contenido protegido. El módulo requiere este identificador para informar a DRMK de cualquier módulo, más abajo, al que planea enviar el contenido protegido.
Derechos de contenido DRM asociados al contenido protegido. El módulo requiere los derechos de contenido para aplicar el nivel de seguridad adecuado.
Cada una de las tres funciones de reenvío proporciona esta información al módulo de una manera ligeramente diferente:
La función DrmForwardContentToDeviceObject envía una solicitud set-property KSPROPERTY_DRMAUDIOSTREAM_CONTENTID al objeto de dispositivo del módulo de bajada. Esta solicitud reenvía el identificador de contenido y los derechos de contenido del flujo al módulo de bajada.
La función DrmForwardContentToInterface consulta la interfaz COM del módulo de bajada para la interfaz IDrmAudioStream . Si la consulta se realiza correctamente, la función llama al método IDrmAudioStream::SetContentId para reenviar el identificador de contenido y los derechos de contenido al módulo de bajada.
En el caso de la función DrmAddContentHandlers , el autor de la llamada (el módulo ascendente) es responsable de reenviar el identificador de contenido y los derechos de contenido del flujo al módulo de bajada. Una vez que DrmAddContentHandlers vuelve con un código correcto que indica que el módulo de bajada se ha autenticado, el módulo ascendente pasa el identificador de contenido y los derechos de contenido al módulo de bajada llamando a uno de sus controladores de contenido.
Si el módulo ascendente es un controlador de miniporte WaveCíclico o WavePci, puede llamar a la función DRM adecuada indirectamente a través de uno de los métodos siguientes:
IDrmPort2::ForwardContentToDeviceObject
IDrmPort::ForwardContentToInterface
Para obtener más información, consulte Funciones DRM.
Por motivos de simplicidad, en la explicación anterior se supone que cada módulo de la ruta de acceso de datos acepta una secuencia de un único origen y reenvía esa secuencia a un módulo de bajada como máximo. De hecho, un módulo puede reenviar una secuencia a dos o más módulos de bajada, pero primero debe autenticar cada módulo de bajada llamando a una de las tres funciones de reenvío. De forma similar, un módulo puede mezclar varios flujos de entrada, pero debe respetar los derechos de contenido de los flujos de entrada proporcionando el nivel adecuado de protección al flujo de salida mixto. Para obtener más información, consulte la explicación de la función DrmCreateContentMixed en identificadores de contenido y derechos de contenido.
Una ruta de acceso de datos segura típica consiste en el controlador del sistema KMixer seguido de un filtro de onda que representa el dispositivo de representación de audio. El filtro se implementa como un controlador de miniporte WaveCíclico o WavePci en combinación con el controlador de puerto correspondiente. Para comprobar que la ruta de acceso de datos es segura, DRMK reenvía el identificador de contenido a KMixer, que a su vez reenvía el identificador de contenido al filtro. El controlador de puerto, que implementa la funcionalidad de filtro genérico, recibe el identificador de contenido y lo reenvía al controlador de miniporte. En concreto, el controlador de puerto llama a la función DrmForwardContentToInterface para reenviar el identificador de contenido al objeto de secuencia al que se ha creado una instancia del controlador de miniporte para representar el pin de salida de onda en el dispositivo de representación de audio. Uno de los valores de parámetro de esta llamada es un puntero a la interfaz IMiniportWaveStream o IMiniportWavePciStream del objeto de secuencia. A través de esta interfaz, la función consulta el objeto de secuencia para su interfaz IDrmAudioStream y llama al método SetContentId de esa interfaz.
Para obtener más información, vea las implementaciones del método SetContentId en el controlador de ejemplo sysvad, que se describe en Controladores de audio de ejemplo.