Compartir a través de


ContainerIDs de USB en Windows

En este artículo se proporciona información sobre los ContainerID USB para el sistema operativo Windows. Incluye directrices para que los fabricantes de dispositivos programen sus dispositivos USB multifunción para que Windows los detecte correctamente.

Los usuarios pueden aprovechar todas las funcionalidades de los dispositivos que están conectados a sus equipos. Esto incluye dispositivos multifunción, como una combinación de impresora, escáner y copiadora. Windows incluye compatibilidad para consolidar toda la funcionalidad de un único dispositivo físico en un contenedor de dispositivos. Un contenedor de dispositivos es una representación virtual del dispositivo físico. Esta consolidación se logra asignando una propiedad ContainerID a cada función de dispositivo que se enumera para el dispositivo físico. Al asignar el mismo valor de ContainerID a cada función de dispositivo, Windows reconoce que todas las funciones de dispositivo pertenecen al mismo dispositivo físico.

Todos los tipos de dispositivos que se conectan a un equipo a través de diferentes tipos de bus pueden admitir contenedores de dispositivos. Sin embargo, no todos los tipos de bus usan el mismo mecanismo para generar un ContainerID. En el caso de los dispositivos USB, los proveedores de dispositivos pueden usar un descriptor de ContainerID para describir el ContainerID para un dispositivo físico. Un descriptor de ContainerID es un descriptor de características del sistema operativo de Microsoft que se puede almacenar en el firmware del dispositivo USB. Los fabricantes de dispositivos USB deben implementar correctamente estos descriptores de ContainerID en sus dispositivos para aprovechar las nuevas funcionalidades de dispositivo que están disponibles en Windows. Los fabricantes de dispositivos USB deben implementar solo un ContainerID para cada dispositivo físico, independientemente de cuántas funciones de dispositivo sean compatibles con el dispositivo.

Para obtener más información sobre cómo consolidar toda la funcionalidad de un único dispositivo en un contenedor de dispositivos, consulte Cómo se generan los identificadores de contenedor.

Para obtener más información sobre los descriptores del SO de Microsoft para dispositivos USB, consulte Descriptores del SO de Microsoft para dispositivos USB.

Cómo se genera un ContainerID USB

A continuación se muestran dos maneras de generar un ContainerID para un dispositivo USB:

  • El fabricante del dispositivo USB especifica el ContainerID en el firmware del dispositivo mediante un descriptor de ContainerID del SO Microsoft.
  • El controlador del concentrador USB de Microsoft crea automáticamente un ContainerID para el dispositivo a partir de la combinación del identificador de producto (PID), el identificador de proveedor (VID), el número de revisión y el número de serie del dispositivo. En esta situación, el controlador del concentrador USB de Microsoft crea un ContainerID con una funcionalidad mínima. Este método solo se aplica a los dispositivos que tienen un número de serie único.

Contenido del ContainerID de USB

Un ContainerID USB se presenta al sistema operativo en forma de una cadena de identificador único universal (UUID). El UUID del ContainerID se encuentra dentro de un descriptor de ContainerID. Un descriptor de ContainerID es un descriptor de características del SO Microsoft en el nivel de dispositivo. Por lo tanto, cuando el sistema operativo solicita un ContainerID USB, el campo wValue de la solicitud del descriptor siempre debe establecerse en cero. Para obtener más información sobre los descriptores de características y las solicitudes de descriptores del SO Microsoft, consulte Especificación de descriptores del SO Microsoft 1.0.

Un descriptor de ContainerID consta de una sección de encabezado.

Desplazamiento Campo Size Tipo Descripción
0 dwLength 4 DWord sin signo Longitud, en bytes, del descriptor de todo el ContainerID. Este campo siempre debe establecerse en un valor de 0x18.
4 bcdVersion 2 BCD Número de versión del descriptor de ContainerID, en decimal codificado binario (BCD), donde cada nibble corresponde a un dígito. El byte más significativo (MSB) contiene los dos dígitos antes del separador decimal y el byte menos significativo (LSB) contiene los dos dígitos después del separador decimal. Por ejemplo, la versión 1.00 se representa como 0x0100. Este campo siempre debe establecerse en 0x0100.
6 wIndex 2 Word Este campo siempre se establece en 6 para descriptores de ContainerID USB.

Un descriptor de ContainerID consta de una sección de ContainerID.

Desplazamiento Campo Size Tipo Descripción
0 bContainerID 16 DWord sin signo Datos de ContainerID.

Los fabricantes de dispositivos son responsables de garantizar que cada instancia de un dispositivo tenga un valor universal de 16 bytes para ContainerID. Además, un dispositivo debe notificar el mismo valor ContainerID cada vez que se enciende. Hay varios algoritmos establecidos para generar UUID con casi cero probabilidad de duplicación. Los fabricantes de dispositivos pueden seleccionar el algoritmo de generación UUID que mejor se adapte a sus necesidades. No importa qué algoritmo de generación UUID se use siempre que el resultado sea único.

Sintaxis de ContainerID USB

Se notifica un ContainerID con el formato de cadena UUID estándar de {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. A continuación se muestra una representación de ejemplo en firmware para un ContainerID USB 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07, que tiene el formato de cadena 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 el cambio en el orden de bytes de los primeros 8 bytes cuando tiene el formato de una cadena UUID.

Cambios en el descriptor del SO Microsoft

Para conservar la funcionalidad de ContainerID heredada, el descriptor de cadena del SO Microsoft contiene un campo de marcas que se puede usar para indicar la compatibilidad con el descriptor de ContainerID.

La definición actual del descriptor de cadena del SO Microsoft incluye un campo de relleno de 1 byte, bPad, al final del descriptor que normalmente se establece en cero. En el caso de los dispositivos USB que admiten el nuevo ContainerID, el campo bPad se vuelve a definir como un campo de marcas, bFlags. El bit 1 de este campo se usa para indicar la compatibilidad con el descriptor de ContainerID. En la tabla 3 se describen los campos del descriptor de cadena del SO Microsoft para dispositivos USB.

Campo Longitud (bytes) Valor Descripción
BLength 1 0x12 Longitud del descriptor.
bDescriptorType 1 0x03 Tipo de descriptor. Un valor de 0x03 indica un descriptor de cadena del SO Microsoft.
qwSignature 14 'MSFT100' Campo de firma.
bMS_VendorCode 1 Código de proveedor Código de proveedor.
bFlags 1 0x02 Bit 0: reservado
Bit 1: Compatibilidad con ContainerID
 0: No admite ContainerID
 1: Admite ContainerID
Bits de 2 a 7: reservados

Actualmente, los dispositivos USB que admiten el descriptor del SO Microsoft, pero que no admiten el descriptor de ContainerID tienen el campo bPad establecido en 0x00. El controlador del concentrador USB no consulta el ContainerID USB en estos dispositivos.

Vista de contenedor de un dispositivo multifunción USB

El ContainerID proporciona información para consolidar dispositivos para dispositivos USB multifunción. En la figura 1 se muestra un ejemplo de cómo todos los dispositivos de una impresora multifunción se consolidan en un único contenedor de dispositivos cuando todos los dispositivos individuales del producto usan el mismo ContainerID.

Captura de pantalla de Administrador de dispositivos que muestra la consolidación de todos los dispositivos en una impresora multifunción.

Requisitos de HCK de ContainerID USB

Los fabricantes de dispositivos deben asegurarse de que cada instancia de un dispositivo que producen tenga un valor de ContainerID único global para que Windows pueda consolidar correctamente la funcionalidad de cada dispositivo multifunción USB. El Kit de certificación de hardware de Windows incluye un requisito, DEVFUND-0034, para un ContainerID USB si se implementa en un dispositivo. Si un dispositivo implementa un ContainerID USB, la certificación de hardware de Windows prueba el ContainerID como parte de las pruebas del descriptor del SO Microsoft y comprueba si el valor de ContainerID es globalmente único. Para obtener más información sobre estos requisitos de certificación de hardware de Windows, consulte el sitio web de certificación de hardware de Windows.

Recomendaciones para implementar un ContainerID USB. Las siguientes son recomendaciones para los proveedores de dispositivos que diseñan, fabrican y envían dispositivos USB:

  • Obtenga información sobre cómo Windows mejora la compatibilidad con multifunción y varios dispositivos USB de transporte mediante ContainerID. Le recomendamos que empiece por leer "Compatibilidad con dispositivos multifunción y agrupaciones de contenedores de dispositivos en Windows".

  • Asegúrese de que el número de serie de cada dispositivo USB sea único. Un requisito de certificación de hardware de Windows indica que, si el dispositivo incluye un número de serie, este debe ser único para cada instancia del dispositivo.

  • No proporcione un ContainerID para un dispositivo USB incrustado en un sistema. Los dispositivos USB integrados deben depender de la configuración del BIOS ACPI o del bit DeviceRemovable del descriptor de concentrador USB para el puerto.

  • Asegúrese de que todos los dispositivos USB conectados a un sistema tengan valores de ContainerID únicos. No comparta valores de ContainerID ni números de serie USB en las líneas de producto.

  • Asegúrese de establecer correctamente la funcionalidad del dispositivo extraíble para el dispositivo.

    Nota:

    Los proveedores de dispositivos que agreguen un descriptor de ContainerID USB a un dispositivo USB que previamente enviado deben incrementar el número de versión del dispositivo (bcdDevice) en el descriptor del dispositivo. Esto es necesario porque el controlador del concentrador USB almacena en caché el descriptor de cadena del SO Microsoft (o la falta de uno) en función del identificador de proveedor, el identificador de producto y el número de versión del dispositivo de un dispositivo. Si no incrementa el número de versión del dispositivo, el controlador del concentrador no consulta el ContainerID USB de un nuevo dispositivo si ha enumerado previamente una instancia del dispositivo con el mismo ID de proveedor, ID de producto y número de versión del dispositivo que no admitía el descriptor de ContainerID USB.