Compartir a través de


Descriptores de cadena USB

Los descriptores de dispositivo, configuración e interfaz pueden contener referencias a descriptores de cadena. En este tema se describe cómo obtener un descriptor de cadena determinado del dispositivo.

El número de índice basado en uno hace referencia a los descriptores de cadena. Un descriptor de cadena contiene una o varias cadenas Unicode; cada cadena es una traducción de los demás a otro idioma.

Los controladores de cliente usan UsbBuildGetDescriptorRequest, con DescriptorType = USB_STRING_DESCRIPTOR_TYPE, para compilar la solicitud para obtener un descriptor de cadena. El parámetro Index especifica el número de índice y el parámetro LanguageID especifica el identificador de idioma (se usan los mismos valores que en los valores LANGID de Microsoft Win32). Los controladores pueden solicitar el número de índice especial de cero para determinar qué identificadores de idioma admite el dispositivo. Para este valor especial, el dispositivo devuelve una matriz de identificadores de idioma en lugar de una cadena Unicode.

Dado que el descriptor de cadena consta de datos de longitud variable, el controlador debe obtenerlo en dos pasos. En primer lugar, el controlador debe emitir la solicitud, pasando un búfer de datos lo suficientemente grande como para contener el encabezado de un descriptor de cadena, una estructura de USB_STRING_DESCRIPTOR. El miembro bLength de USB_STRING_DESCRIPTOR especifica el tamaño en bytes del descriptor completo. A continuación, el controlador realiza la misma solicitud con un búfer de datos de tamaño bLength.

En el código siguiente se muestra cómo solicitar el descriptor de cadena i-th, con id. de idioma langID:

USB_STRING_DESCRIPTOR USD, *pFullUSD;
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string.
    &USD, // points to a USB_STRING_DESCRIPTOR.
    NULL,
    sizeof(USB_STRING_DESCRIPTOR),
    NULL
);
pFullUSD = ExAllocatePool(NonPagedPool, USD.bLength);
UsbBuildGetDescriptorRequest(
    pURB, // points to the URB to be filled in
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_STRING_DESCRIPTOR_TYPE,
    i, // index of string descriptor
    langID, // language ID of string
    pFullUSD,
    NULL,
    USD.bLength,
    NULL
);