Como os dispositivos USB são atribuídos a IDs de contêiner
Para um dispositivo conectado ao computador por meio do USB (Barramento Serial Universal), o fluxograma a seguir mostra a heurística usada para atribuir uma ID de contêiner a um nó de dispositivo USB (devnode).
Essa heurística usa informações de várias fontes para determinar se uma das seguintes opções é verdadeira sobre um devnode USB:
O devnode representa um novo dispositivo no barramento USB? Se isso for verdadeiro, o devnode receberá uma nova ID de contêiner.
O devnode é um devnode filho de um dispositivo existente? Se isso for verdadeiro, o devnode herdará a ID do contêiner do devnode pai.
Uma ID de contêiner para um dispositivo USB é gerada de várias maneiras. Essa decisão se baseia em informações contidas no dispositivo. Essas informações são recuperadas das configurações de ACPI, do driver de barramento USB e do hub USB.
Essa heurística segue estas etapas para cada devnode que o gerenciador de Plug and Play (PnP) enumera no barramento USB.
Quando consultado pelo driver de barramento USB, o dispositivo USB pode relatar uma ID de contêiner por meio do descritor ContainerID do sistema operacional (SO) da Microsoft.
A partir do Windows 7, o sistema operacional dá suporte ao descritor ContainerID do Sistema Operacional da Microsoft. Por meio desse descritor, o IHV (fornecedor independente de hardware) pode especificar precisamente a ID do contêiner para um dispositivo. Portanto, a ID do contêiner do dispositivo é exclusiva e não é alterada em todos os computadores em que o dispositivo está instalado. Além disso, se ele relatar um descritor ContainerID do Sistema Operacional da Microsoft, o dispositivo indicará ao sistema operacional que todos os devnodes enumerados fazem parte do mesmo dispositivo físico.
O descritor ContainerID do Sistema Operacional da Microsoft destina-se a ser usado em dispositivos que dão suporte à conexão simultânea do dispositivo por meio de vários barramentos do sistema. Por exemplo, uma impressora pode dar suporte a conexões de rede USB e IP simultâneas usando extensões de Plug and Play (PnP-X). Usando um único descritor ContainerID do Sistema Operacional da Microsoft, a mesma ID de contêiner é relatada em ambos os transportes. Portanto, o gerenciador PnP determina que os devnodes enumerados por cada barramento fazem parte do mesmo dispositivo físico.
Para obter mais informações sobre o descritor containerID do Sistema Operacional da Microsoft, consulte Os Descritores do sistema operacional da Microsoft.
Se o dispositivo USB não relatar um descritor ContainerID do Sistema Operacional da Microsoft, o driver do hub USB consultará a ACPI para determinar se o dispositivo está anexado a uma porta externa.
O sistema operacional tenta localizar um objeto de endereço ACPI (_ADR) que corresponde ao endereço da porta USB à qual o dispositivo está conectado. Se um objeto de endereço correspondente for encontrado, o sistema operacional executará as seguintes etapas:
O objeto de recursos de porta USB (_UPC) é consultado e o valor PortIsConnectable é verificado. Se PortIsConnectable tiver um valor diferente de zero de 0xFF, a porta poderá ser usada para conectar dispositivos externos. Portanto, qualquer dispositivo conectado a essa porta deve ser externo ao computador.
Se o computador implementar o ACPI 3.0 e o byte PortIsConnectable for diferente de zero, o sistema operacional também consultará o objeto de descrição de local físico (_PLD). O sistema operacional verifica se o bit UserVisible (bit 64) está definido no objeto _PLD . Ele faz isso como um marcar adicional para garantir que a porta seja conectável e visível externamente para o usuário.
Se as informações coletadas da ACPI indicarem que o dispositivo é externo, o gerenciador PnP gerará uma ID de contêiner para o dispositivo. O valor ContainedID é um hash do número de série USB do dispositivo ou um valor gerado aleatoriamente. O devnode recebe essa ID de contêiner.
Nota Se o sistema operacional determinar que o dispositivo é interno para o computador, o devnode herdará a ID do contêiner do devnode pai, que (nesse caso) é a ID do contêiner do próprio computador.
Se o ACPI não retornar um objeto _ADR que corresponda ao endereço da porta USB ao qual o dispositivo está conectado, o gerenciador de PnP gerará uma ID de contêiner com base no status removível do devnode.
O driver do hub USB consulta o descritor USB RemoveAndPowerMask do hub e verifica se o bit DeviceRemovable está definido para a porta à qual o dispositivo está conectado. Se o bit DeviceRemovable estiver definido, os dispositivos anexados à porta serão removíveis do hub. Se o bit DeviceRemovable não estiver definido, os dispositivos anexados à porta não serão removíveis do hub.
O driver de barramento USB relata a porta removível/não removível status para o gerenciador PnP, que gera um ContainerId para o devnode por meio das seguintes etapas:
Se o hub indicar que os dispositivos anexados à porta fornecida são removíveis do hub, o gerenciador PnP determina que os dispositivos anexados a essa porta são externos ao computador. A ID do contêiner gerada para o devnode é um hash do número de série USB do dispositivo ou é um valor gerado aleatoriamente.
Se o hub indicar que os dispositivos anexados à porta fornecida não são removíveis do hub, o gerenciador PnP determinará que os dispositivos anexados a essa porta são subfunções de um dispositivo multifuncional. Nesse caso, o devnode herda a ID do contêiner do devnode pai.
Para obter mais informações sobre a interface ACPI 3.0, consulte Configuração avançada e revisão de especificação da interface de energia 3.0b.