Compartilhar via


ContainerIDs USB no Windows

Este artigo fornece informações sobre ContainerIDsUSB para o sistema operacional Windows. Ele inclui diretrizes para os fabricantes de dispositivos programarem seus dispositivos USB multifuncionais para que sejam detectados corretamente pelo Windows.

Os usuários conseguem aproveitar todos os recursos dos dispositivos conectados aos seus computadores. Isso inclui dispositivos multifuncionais, como uma combinação de impressora, scanner e dispositivo de cópia. O Windows inclui suporte para consolidar todas as funcionalidades de um único dispositivo físico em um contêiner de dispositivo. Um contêiner de dispositivo é uma representação virtual do dispositivo físico. Essa consolidação é obtida atribuindo uma propriedade ContainerID a cada função de dispositivo enumerada para o dispositivo físico. Ao atribuir o mesmo valor do ContainerID a cada função de dispositivo, o Windows reconhece que todas as funções de dispositivo pertencem ao mesmo dispositivo físico.

Todos os tipos de dispositivos que se conectam a um computador por meio de diferentes tipos de barramento podem dar suporte a contêineres de dispositivo. No entanto, nem todos os tipos de barramento usam o mesmo mecanismo para gerar um ContainerID. Para dispositivos USB, os fornecedores de dispositivos podem usar um descritor ContainerID para descrever o ContainerID de um dispositivo físico. Um descritor ContainerID é um descritor de recursos do sistema operacional da Microsoft que pode ser armazenado no firmware do dispositivo USB. Os fabricantes de dispositivos USB devem implementar corretamente esses descritores ContainerID em seus dispositivos para aproveitar os novos recursos de dispositivo disponíveis no Windows. Os fabricantes de dispositivos USB precisam implementar apenas um único ContainerID para cada dispositivo físico, independentemente de quantas funções de dispositivo são compatíveis com o dispositivo.

Para obter mais informações sobre como consolidar toda a funcionalidade de um único dispositivo em um contêiner de dispositivo, consulte Como as IDs de contêiner são geradas.

Para obter mais informações sobre os descritores do sistema operacional da Microsoft para dispositivos USB, consulte Descritores do sistema operacional da Microsoft para dispositivos USB.

Como um ContainerID USB é gerado

Veja a seguir duas maneiras de gerar um ContainerID para um dispositivo USB:

  • O fabricante do dispositivo USB especifica o ContainerID no firmware do dispositivo usando um descritor ContainerID do sistema operacional da Microsoft.
  • O driver do hub USB da Microsoft cria automaticamente um ContainerID para o dispositivo a partir da combinação da PID (ID do produto), da VID (ID do fornecedor), do número de revisão e do número de série do dispositivo. Nessa situação, o driver do hub USB da Microsoft cria um ContainerID com funcionalidade mínima. Esse método se aplica somente a dispositivos que possuem um número de série exclusivo.

Conteúdo do USB ContainerID

Um ContainerID USB é apresentado ao sistema operacional na forma de uma cadeia de caracteres UUID (identificador universalmente exclusivo). O UUID ContainerID está contido em um descritor ContainerID. Um descritor ContainerID é um descritor de recursos do sistema operacional da Microsoft no nível do dispositivo. Dessa forma, quando o sistema operacional solicita um USB ContainerID, o campo wValue da solicitação do descritor sempre deve ser definido como zero. Para obter mais informações sobre descritores de recursos do sistema operacional da Microsoft e solicitações de descritor, consulte Especificação de Descritores do Microsoft OS 1.0.

Um descritor ContainerID consiste em uma seção de cabeçalho.

Deslocamento Campo Tamanho Tipo Descrição
0 dwLength 4 DWord não assinado O comprimento, em bytes, de todo o descritor ContainerID. Esse campo deve sempre ser definido como um valor de 0x18.
4 bcdVersion 2 BCD O número de versão do descritor ContainerID, em BCD (decimal codificado binário), no qual cada nibble corresponde a um dígito. O byte mais significativo (MSB) contém os dois dígitos antes da vírgula decimal e o byte menos significativo (LSB) contém os dois dígitos após a vírgula decimal. Por exemplo, a versão 1.00 é representada como 0x0100. Este campo sempre deve ser definido como 0x0100.
6 wIndex 2 Word Esse campo é sempre definido como 6 para descritores USB ContainerID.

Um descritor ContainerID consiste em uma seção de ContainerID.

Deslocamento Campo Tamanho Tipo Descrição
0 bContainerID 16 DWord não assinado Dados ContainerID.

Os fabricantes de dispositivos são responsáveis por garantir que cada instância de um dispositivo tenha um valor universalmente exclusivo de 16 bytes para o ContainerID. Além disso, um dispositivo deve relatar o mesmo valor de ContainerID sempre que for ligado. Existem vários algoritmos estabelecidos para gerar UUIDs com chance quase zero de duplicação. Os fabricantes de dispositivos podem selecionar o algoritmo de geração de UUID que melhor atende às suas necessidades. Não importa qual algoritmo de geração de UUID é usado, desde que o resultado seja único.

Sintaxe USB ContainerID

Um ContainerID é relatado no formato de cadeia de caracteres UUID padrão de {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Veja a seguir um exemplo de representação no firmware para uma cadeia de caracteres 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, que é formatada como uma cadeia de caracteres UUID {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}.

UCHAR ExampleContainerIDDescriptor[24] =
{
    0x18, 0x00, 0x00, 0x00,     // dwLength - 24 bytes
    0x00, 0x01,                 // bcdVersion - 1.00
    0x06, 0x00,                 // wIndex – 6 for a ContainerID
    0x0C, 0xB4, 0xA7, 0x2C,     // bContainerID -
    0xD1, 0x7B, 0x25, 0x4F,     // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
    0xB5, 0x73, 0xA1, 0x3A,     // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
    0x97, 0x5D, 0xDC, 0x07      //
}

Observe a alteração na ordem de bytes dos primeiros 8 bytes quando ele é formatada como uma cadeia de caracteres UUID.

Alterações no descritor do sistema operacional da Microsoft

Para preservar a funcionalidade ContainerID herdada, o descritor de cadeia de caracteres do sistema operacional da Microsoft contém um campo de sinalizadores que pode ser usado para indicar suporte para o descritor ContainerID.

A definição atual do descritor de cadeia de caracteres do sistema operacional da Microsoft inclui um campo de bloco de 1 byte, bPad, no final do descritor que normalmente é definido como zero. Para dispositivos USB que dão suporte ao novo ContainerID, o campo bPad é redefinido como um campo de sinalizadores, bFlags. O bit 1 desse campo é usado para indicar suporte para o descritor ContainerID. A Tabela 3 descreve os campos do descritor de cadeia de caracteres do sistema operacional da Microsoft para dispositivos USB.

Campo Comprimento (bytes) Valor Descrição
bLength 1 0x12 Comprimento do descritor.
bDescriptorType 1 0x03 Tipo de descritor. Um valor de 0x03 indica um descritor de cadeia de caracteres do sistema operacional da Microsoft.
qwSignature 14 'MSFT100' Campo de assinatura.
bMS_VendorCode 1 Código do fornecedor Código do fornecedor.
bFlags 1 0x02 Bit 0: reservado
Bit 1: suporte ContainerID
 0: Não oferece suporte a ContainerID
 1: Suporta ContainerID
Bits 2–7: reservado

Atualmente, os dispositivos USB de envio que dão suporte ao descritor do sistema operacional da Microsoft, mas não dão suporte ao descritor ContainerID, têm o campo bPad definido como 0x00. O driver do hub USB não consulta esses dispositivos para o descritor USB ContainerID.

Exibição do contêiner de um dispositivo multifuncional USB

O ContainerID fornece informações para consolidar dispositivos para dispositivos USB multifuncionais. A Figura 1 mostra um exemplo de como todos os dispositivos em uma impressora multifuncional são consolidados em um único contêiner de dispositivo quando todos os dispositivos individuais dentro do produto usam o mesmo ContainerID.

Captura de tela do Gerenciador de Dispositivos mostrando a consolidação de todos os dispositivos em uma impressora multifuncional.

Requisitos do HCK do USB ContainerID

Os fabricantes de dispositivos devem garantir que cada instância de um dispositivo que eles produzem tenha um valor ContainerID exclusivo globalmente para que Windows possa consolidar com êxito a funcionalidade de cada dispositivo multifuncional USB. O Kit de Certificação de Hardware do Windows inclui um requisito DEVFUND-0034, para um USB ContainerID, se ele for implementado em um dispositivo. Se um dispositivo implementar um USB ContainerID, a Certificação de Hardware do Windows testará o ContainerID como parte dos testes do Descritor do Sistema Operacional da Microsoft e verificará se o valor do ContainerID é exclusivo globalmente. Para obter mais informações sobre esses requisitos de Certificação de Hardware do Windows, consulte o site de Certificação de Hardware do Windows.

Recomendações para implementar um USB ContainerID Veja a seguir recomendações para fornecedores de dispositivos que projetam, fabricam e enviam dispositivos USB:

  • Saiba como o Windows melhora o suporte para dispositivos USB multifuncionais e de transporte múltiplo usando um ContainerID. Recomendamos que você comece lendo "Suporte a dispositivos multifuncionais e agrupamentos de contêineres de dispositivos no Windows".

  • Certifique-se de que o número de série em cada dispositivo USB seja exclusivo. Um requisito de Certificação de Hardware do Windows informa que, se o dispositivo incluir um número de série, o número de série deverá ser exclusivo para cada instância do dispositivo.

  • Não forneça um ContainerID para um dispositivo USB que está inserido em um sistema. Os dispositivos USB integrados devem contar com as configurações do BIOS ACPI ou com o bit DeviceRemovable do descritor do hub USB para a porta.

  • Verifique se todos os dispositivos USB conectados a um sistema têm valores ContainerID. Não compartilhe os valores ou números de série USB ContainerID em suas linhas de produtos.

  • Certifique-se de definir o recurso de dispositivo removível corretamente para o seu dispositivo.

    Observação

    Os fornecedores de dispositivos que adicionam um descritor USB ContainerID a um dispositivo USB de envio anteriormente devem incrementar o número de versão do dispositivo (bcdDevice) no descritor do dispositivo. Isso é necessário porque o driver do hub USB armazena em cache o descritor de cadeia de caracteres do sistema operacional da Microsoft (ou a falta de um) com base na ID do fornecedor, na ID do produto e no número de versão do dispositivo. Se você não incrementar o número de versão do dispositivo, o driver do hub não consultará o USB ContainerID de um novo dispositivo se ele enumerou anteriormente uma instância do dispositivo com a mesma ID do fornecedor, ID do produto e número de versão do dispositivo que não dava suporte ao descritor USB ContainerID.