Manipulando eventos de aquisição de licença

[O recurso associado a esta página, Windows Media Format 11 SDK, é um recurso herdado. Ele foi substituído por Leitor de Origem e Gravador de Coletor. O Leitor de Origem e o Gravador do Coletor foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o Leitor de Origem e o Gravador do Coletor em vez do SDK do Windows Media Format 11, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Um aplicativo de leitor habilitado para DRM, em seu método de retorno de chamada IWMStatusCallback::OnStatus , manipula os quatro eventos a seguir relacionados ao processo de aquisição de licença:

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

Quando o componente DRM detecta o conteúdo protegido pelo DRM versão 7, ele primeiro procura uma licença válida no sistema local. Se nenhum existir, ele avaliará a URL de aquisição de licença no cabeçalho DRM do arquivo e enviará um evento WMT_LICENSEURL_SIGNATURE_STATE com pValue definido como um dos valores de WMT_DRMLA_TRUST , indicando se a URL é confiável, não confiável ou foi adulterada. Se a URL não for confiável, o aplicativo deverá avisar o usuário. Se a URL tiver sido adulterada, o arquivo deverá ser considerado corrompido e o aplicativo não deverá navegar para a URL sem emitir um aviso forte ao usuário.

WMT_NO_RIGHTS

O evento WMT_NO_RIGHTS é enviado somente para conteúdo drm versão 1, o que significa que a licença deve ser adquirida de forma não silenciosa. Em outras palavras, o usuário deve navegar até uma página da Web para adquirir uma licença. A URL da página é recuperada como uma cadeia de caracteres largos terminada em nulo do parâmetro pValue no método OnStatus .

Se apropriado, um aplicativo pode facilitar a navegação do usuário até a página da Web, seja abrindo Explorer da Internet em um processo separado ou hospedando o controle navegador da Web. No entanto, isso não é necessário. No mínimo, um aplicativo pode simplesmente exibir a URL para o usuário em uma caixa de mensagem e solicitar que ele cole-a na barra de endereços da Internet Explorer. O exemplo audiojogador demonstra o tratamento adequado do evento WMT_NO_RIGHTS, incluindo como formatar a cadeia de caracteres de URL e como usar o método CreateProcess para abrir Explorer da Internet e navegar até a URL especificada.

Como o aplicativo não tem como saber quando uma licença do DRM versão 1 foi adquirida, cabe ao usuário tentar abrir o arquivo novamente depois de adquirir a licença.

Esse mesmo processo de aquisição de licença não silenciosa também pode ser usado para licenças da versão 7, mas, nesse caso, o aplicativo pode primeiro chamar IWMDRMReader::MonitorLicenseAcquisition. Esse método fará com que o repositório de licenças local seja verificado repetidamente até que a licença do novo arquivo seja encontrada. Nesse ponto, o aplicativo receberá um evento WMT_ACQUIRE_LICENSE . Para todas as licenças da versão 7, é recomendável que os aplicativos ofereçam aos usuários a opção de obter licenças silenciosamente ou não silenciosamente.

WMT_NO_RIGHTS_EX

O evento WMT_NO_RIGHTS_EX indica que o conteúdo é protegido pelo DRM versão 7 e, portanto, o processo de aquisição de licença pode continuar silenciosamente ou não silenciosamente. Em geral, a aquisição silenciosa de licenças é mais conveniente para os usuários finais, embora algumas pessoas prefiram adquirir todas as licenças sem silêncio. Quando a aquisição de licença exige que o usuário envie informações pessoais ou de pagamento, o processo sempre deve ser executado sem silêncio. A aquisição de licença não silenciosa é descrita acima no título WMT_NO_RIGHTS . A aquisição silenciosa prossegue da seguinte maneira:

  1. Converta o parâmetro pValue em uma estrutura WM_GET_LICENSE_DATA e armazene a estrutura caso ela seja necessária posteriormente para aquisição de licença não silenciosa.
  2. Chame QueryInterface no objeto reader para obter a interface IWMDRMReader .
  3. Chame IWMDRMReader::AcquireLicense e especifique 0x1 no parâmetro dwFlags para indicar a aquisição de linguagem silenciosa. Essa é uma chamada assíncrona que retorna imediatamente.
  4. Aguarde o evento WMT_ACQUIRE_LICENSE .

WMT_ACQUIRE_LICENSE

O evento WMT_ACQUIRE_LICENSE é enviado depois que o processo de aquisição de licença é concluído para uma licença drm versão 7. IWMDRMReader::AcquireLicense faz com que esse evento seja enviado para aquisição silenciosa e MonitorLicenseAcquisition faz com que ele seja enviado para aquisição não silenciosa. No manipulador de eventos, converta pValue em um ponteiro para uma estrutura WM_GET_LICENSE_DATA e examine o membro de rh para determinar se a licença foi adquirida com êxito. Se o rh for igual a NS_E_DRM_NO_RIGHTS, ele indicará que a licença deve ser adquirida de forma não silenciosa. Os aplicativos devem permitir que os usuários cancelem o processo de aquisição de licença a qualquer momento. Isso é feito chamando IWMDRMReader::CancelLicenseAcquisition. Chamar esse método enviará um evento WMT_ACQUIRE_LICENSE com um valor HRESULT de NS_S_DRM_ACQUIRE_CANCELLED.

Se o rh for igual a NS_S_DRM_LICENSE_ACQUIRED, a licença foi adquirida e o aplicativo pode tentar reproduzir o arquivo ou copiá-lo para um dispositivo ou executar qualquer ação para a qual ele solicitou direitos.

No Windows XP, um novo código de erro foi introduzido: NS_E_DRM_LICENSE_NOTACQUIRED. Esse código de erro é gerado sempre que os componentes de tempo de execução do Windows Media Format no Windows XP não conseguem adquirir uma licença durante a aquisição de licença silenciosa ou não silenciosa. Em outras plataformas, NS_E_DRM_LICENSE_STORE_ERROR geralmente é retornado quando a aquisição de licença falha. O novo código de erro destina-se a distinguir a falha de aquisição de licença de outras condições de falha em que NS_E_DRM_LICENSE_STORE_ERROR é gerado.

A maneira recomendada de lidar com esses erros quando eles são retornados após uma tentativa silenciosa de aquisição de licença é mostrada no seguinte snippet de código:

if( hrStatus == NS_E_DRM_LICENSE_NOTACQUIRED || 
    hrStatus == NS_E_DRM_LICENSE_STORE_ERROR )
{
  // Attempt non-silent license acquisition.
}
else if( hrStatus == NS_E_DRM_NEEDS_INDIVIDUALIZATION )
{
  // Individualize and then retry.
}
else if( FAILED(hrStatus) )
{
  // Display a helpful error message.
}
else
{
  // Success. Play content.
}

Observação

O DRM não é compatível com a versão baseada em x64 desse SDK.

 

Lendo arquivos protegidos