Cómo se asignan los identificadores de contenedor de dispositivos USB
En el caso de un dispositivo conectado al equipo a través del Bus serie universal (USB), el siguiente diagrama de flujo muestra la heurística usada para asignar un identificador de contenedor a un nodo de dispositivo USB (devnode).
Esta heurística usa información de varios orígenes para determinar si uno de los siguientes es true sobre un devnode USB:
¿Representa el devnode un nuevo dispositivo en el bus USB? Si esto es true, el devnode recibiría un nuevo identificador de contenedor.
¿Es el devnode un devnode secundario de un dispositivo existente? Si esto es true, el devnode heredaría el identificador de contenedor del devnode primario.
Un identificador de contenedor para un dispositivo USB se genera de varias maneras. Esta decisión se basa en la información contenida en el dispositivo. Esta información se recupera de la configuración ACPI, el controlador del bus USB y el concentrador USB.
Esta heurística sigue estos pasos para cada nodo de desarrollo que el administrador de Plug and Play (PnP) enumera en el bus USB.
Cuando el controlador de bus USB consulta, el dispositivo USB puede notificar un identificador de contenedor a través del descriptor ContainerID del sistema operativo (SO) de Microsoft.
A partir de Windows 7, el sistema operativo admite el descriptor ContainerID de Microsoft OS. A través de este descriptor, el proveedor de hardware independiente (IHV) puede especificar con precisión el identificador de contenedor de un dispositivo. Por lo tanto, el identificador de contenedor del dispositivo es único y no cambia en todos los equipos en los que está instalado el dispositivo. Además, si informa de un descriptor ContainerID de So de Microsoft, el dispositivo indica al sistema operativo que todos los nodos de desarrollo enumerados forman parte del mismo dispositivo físico.
El descriptor ContainerID de Microsoft OS está pensado para usarse en dispositivos que admiten la conexión simultánea del dispositivo a través de varios buses del sistema. Por ejemplo, una impresora puede admitir conexiones de red USB e IP simultáneas mediante Plug and Play Extensiones (PnP-X). Con un único descriptor ContainerID de Microsoft OS, se notifica el mismo identificador de contenedor en ambos transportes. Por lo tanto, el administrador de PnP determina que los nodos de desarrollo enumerados por cada bus forman parte del mismo dispositivo físico.
Para obtener más información sobre el descriptor ContainerID de Microsoft OS, consulte Los descriptores del sistema operativo de Microsoft.
Si el dispositivo USB no informa de un descriptor ContainerID de Microsoft OS, el controlador del concentrador USB consulta ACPI para determinar si el dispositivo está conectado a un puerto externo.
El sistema operativo intenta localizar un objeto de dirección ACPI (_ADR) que coincide con la dirección del puerto USB al que está conectado el dispositivo. Si se encuentra un objeto de dirección coincidente, el sistema operativo realiza los pasos siguientes:
Se consulta el objeto de funcionalidades de puerto USB (_UPC) y se comprueba el valor PortIsConnectable . Si PortIsConnectable tiene un valor distinto de cero de 0xFF, el puerto se puede usar para conectar dispositivos externos. Por lo tanto, cualquier dispositivo conectado a este puerto debe ser externo al equipo.
Si el equipo implementa ACPI 3.0 y el byte PortIsConnectable es distinto de cero, el sistema operativo también consulta el objeto de descripción de ubicación física (_PLD). El sistema operativo comprueba si el bit UserVisible (bit 64) está establecido en el objeto _PLD . Esto se realiza como una comprobación adicional para asegurarse de que el puerto es accesible y visible externamente para el usuario.
Si la información recopilada de ACPI indica que el dispositivo es externo, el administrador de PnP genera un identificador de contenedor para el dispositivo. El valor containedID es un hash del número de serie USB del dispositivo o un valor generado aleatoriamente. El devnode se asigna a este identificador de contenedor.
Nota Si el sistema operativo determina que el dispositivo es interno para el equipo, el devnode heredará el identificador de contenedor del nodo primario, que (en este caso) es el identificador de contenedor del propio equipo.
Si ACPI no devuelve un objeto de _ADR que coincida con la dirección del puerto USB a la que está conectado el dispositivo, el administrador de PnP genera un identificador de contenedor basado en el estado extraíble del nodo de desarrollo.
El controlador del concentrador USB consulta el descriptor RemoveAndPowerMask usb del concentrador y comprueba si el bit DeviceRemovable está establecido para el puerto al que está conectado el dispositivo. Si se establece el bit DeviceRemovable , los dispositivos conectados al puerto se pueden mover desde el centro. Si no se establece el bit DeviceRemovable , los dispositivos conectados al puerto no se pueden mover desde el centro.
El controlador de bus USB notifica el estado extraíble o no extraíble del puerto al administrador de PnP, que genera un ContainerId para el nodo dev a través de los pasos siguientes:
Si el concentrador indica que los dispositivos conectados al puerto especificado se pueden mover desde el concentrador, el administrador de PnP determina que los dispositivos conectados a este puerto son externos al equipo. El identificador de contenedor que genera para el devnode es un hash del número de serie USB del dispositivo o es un valor generado aleatoriamente.
Si el concentrador indica que los dispositivos conectados al puerto especificado no se pueden mover desde el concentrador, el administrador de PnP determina que los dispositivos conectados a este puerto son subfunciones de un dispositivo multifunción. En este caso, el devnode hereda el identificador de contenedor del nodo primario.
Para obtener más información sobre la interfaz ACPI 3.0, vea Advanced Configuration and Power Interface Specification Revision 3.0b.