Encaminhando IDs de conteúdo drm
O driver do sistema DRMK desembolsa um fluxo de reprodução de áudio que contém conteúdo protegido. O DRMK implementa um filtro KS que usa um fluxo de entrada que contém os dados mexidos, desembaraca-os e alimenta o fluxo sem problemas em um caminho de dados que consiste em alguns módulos residentes em kernel. Esses módulos podem ser filtros KS ou outros tipos de drivers. O caminho de dados normalmente termina em um dispositivo de renderização de áudio que converte o conteúdo digital em um sinal analógico que pode ser reproduzido por meio de alto-falantes.
Antes de permitir que o conteúdo não estruturado insira o caminho de dados, o DRMK verifica se o caminho de dados é seguro. Para fazer isso, o DRMK autentica cada módulo no caminho de dados, começando com o módulo no final upstream do caminho de dados e movendo-se downstream para a outra extremidade do caminho de dados. A figura a seguir ilustra esse processo.
Na figura anterior, as setas sólidas representam o caminho de dados e as setas tracejadas representam as comunicações necessárias para verificar se o caminho de dados é seguro. Os dados não estruturados entram no caminho somente depois que o DRMK terminar de autenticar todos os módulos nesse caminho.
Depois que o DRMK autentica cada módulo, esse módulo fornece ao DRMK informações sobre o próximo módulo no caminho de dados para que ele também possa ser autenticado. À medida que cada módulo é autenticado, ele recebe a ID de conteúdo drm que identifica o fluxo.
Começando no final upstream do caminho de dados seguro, o DRMK encaminha a ID de conteúdo para o módulo A, que, por sua vez, encaminha a ID de conteúdo para o módulo B. Esse processo continua até que a ID de conteúdo seja encaminhada para o módulo Z, o último módulo no caminho de dados seguro.
A figura a seguir mostra um par de módulos adjacentes no caminho de dados.
O módulo no lado upstream chama uma das seguintes funções DRM para fornecer ao DRMK informações sobre o módulo downstream e encaminhar a ID de conteúdo para esse módulo:
DrmForwardContentToDeviceObject
Cada uma dessas funções de "encaminhamento" fornece drmk com a ID de conteúdo drm que identifica o fluxo protegido e com informações que o DRMK precisa para autenticar o módulo downstream. A escolha de qual dessas três funções chamar depende do tipo de interface que os dois módulos adjacentes usam para se comunicar entre si enquanto gerenciam a transferência de conteúdo protegido:
Se o módulo upstream chamar IoCallDriver para se comunicar com o módulo downstream, o módulo downstream será parte de um driver WDM. Nesse caso, o módulo upstream chama DrmForwardContentToDeviceObject para fornecer DRMK com o objeto de dispositivo que representa o módulo downstream. O DRMK usa o objeto de dispositivo para autenticar o módulo downstream.
Se os dois módulos se comunicarem por meio de uma interface COM implementada pelo módulo downstream, o módulo upstream chamará DrmForwardContentToInterface. Essa chamada fornece ao DRMK um ponteiro para a interface COM do módulo downstream. O DRMK chama apenas os métodos IUnknown nessa interface e não faz suposições sobre os outros métodos, embora os dois módulos em si precisem concordar com o que esses métodos fazem. O DRMK verifica se o ponto de entrada de cada método na interface pertence a um módulo autenticado. Se os pontos de entrada forem distribuídos entre vários módulos, o DRMK autentica todos esses módulos.
Se os dois módulos não usarem uma interface COM nem a função IoCallDriver para se comunicar, o módulo upstream chamará DrmAddContentHandlers para fornecer drmk com uma lista de pontos de entrada para "manipuladores de conteúdo" implementados no módulo downstream. O DRMK não chama os manipuladores de conteúdo e não faz suposições sobre as funções que eles executam. No entanto, o DRMK autentica o módulo (ou módulos) no qual residem os pontos de entrada.
Depois de ser autenticado, o módulo downstream requer as seguintes informações:
A ID de conteúdo drm que identifica o fluxo que contém o conteúdo protegido. O módulo requer essa ID para informar o DRMK de qualquer módulo, mais downstream, para o qual planeja enviar o conteúdo protegido.
Os direitos de conteúdo drm associados ao conteúdo protegido. O módulo requer os direitos de conteúdo para impor o nível apropriado de segurança.
Cada uma das três funções de encaminhamento fornece essas informações para o módulo de uma maneira ligeiramente diferente:
A função DrmForwardContentToDeviceObject envia um KSPROPERTY_DRMAUDIOSTREAM_CONTENTID solicitação set-property para o objeto de dispositivo do módulo downstream. Essa solicitação encaminha a ID de conteúdo do fluxo e os direitos de conteúdo para o módulo downstream.
A função DrmForwardContentToInterface consulta a interface COM do módulo downstream para a interface IDrmAudioStream . Se a consulta for bem-sucedida, a função chamará o método IDrmAudioStream::SetContentId para encaminhar a ID de conteúdo e os direitos de conteúdo para o módulo downstream.
No caso da função DrmAddContentHandlers, o chamador (o módulo upstream) é responsável por encaminhar a ID de conteúdo do fluxo e os direitos de conteúdo para o módulo downstream. Depois que DrmAddContentHandlers retorna com um código de êxito indicando que o módulo downstream foi autenticado, o módulo upstream passa a ID de conteúdo e os direitos de conteúdo para o módulo downstream chamando um de seus manipuladores de conteúdo.
Se o módulo upstream for um driver de miniporta WaveCyclic ou WavePci, ele poderá chamar a função DRM apropriada indiretamente por meio de um dos seguintes métodos:
IDrmPort2::ForwardContentToDeviceObject
IDrmPort::ForwardContentToInterface
Para obter mais informações, consulte Funções DRM.
Para simplificar, a discussão anterior pressupõe que cada módulo no caminho de dados aceite um fluxo de uma única fonte e encaminhe esse fluxo para no máximo um módulo downstream. Na verdade, um módulo pode encaminhar um fluxo para dois ou mais módulos downstream, mas ele deve primeiro autenticar cada módulo downstream chamando uma das três funções de encaminhamento. Da mesma forma, um módulo pode misturar vários fluxos de entrada, mas deve respeitar os direitos de conteúdo dos fluxos de entrada fornecendo o nível apropriado de proteção para o fluxo de saída misto. Para obter mais informações, consulte a discussão sobre a função DrmCreateContentMixed em IDs de conteúdo e direitos de conteúdo.
Um caminho de dados seguro típico consiste no driver do sistema KMixer seguido por um filtro de onda que representa o dispositivo de renderização de áudio. O filtro é implementado como um driver de miniporta WaveCyclic ou WavePci em combinação com o driver de porta correspondente. Para verificar se o caminho de dados é seguro, o DRMK encaminha a ID de conteúdo para o KMixer, que, por sua vez, encaminha a ID de conteúdo para o filtro. O driver de porta, que implementa a funcionalidade de filtro genérico, recebe a ID de conteúdo e a encaminha para o driver de miniporta. Especificamente, o driver de porta chama a função DrmForwardContentToInterface para encaminhar a ID de conteúdo para o objeto de fluxo que o driver de miniporto instanciou para representar o pino de saída de onda no dispositivo de renderização de áudio. Um dos valores de parâmetro para essa chamada é um ponteiro para a interface IMiniportWaveCyclicStream ou IMiniportWavePciStream do objeto de fluxo. Por meio dessa interface, a função consulta o objeto de fluxo para sua interface IDrmAudioStream e chama o método SetContentId dessa interface.
Para obter mais informações, consulte as implementações do método SetContentId no driver de exemplo do Sysvad, que é discutido em Drivers de Áudio de Exemplo.