Compartir a través de


Caso práctico: Solución de problemas de un dispositivo USB desconocido mediante ETW y Netmon

En este tema se proporciona un ejemplo de cómo usar ETW USB y Netmon para solucionar problemas de un dispositivo USB que Windows no reconoce.

En este ejemplo, conectamos un dispositivo y apareció como un dispositivo desconocido en Administrador de dispositivos y otras partes de la interfaz de usuario (UI). El identificador de hardware era USB\UNKNOWN. Para diagnosticar más, desconectamos el dispositivo, iniciamos un seguimiento ETW y conectamos el dispositivo de nuevo. Después de que el dispositivo apareciera como un dispositivo desconocido, se detuvo el seguimiento.

Acerca del problema del dispositivo desconocido

Para depurar un problema desconocido de un dispositivo USB, ayuda a comprender lo que hace la pila de controladores USB para enumerar un dispositivo cuando un usuario lo conecta al sistema. Para obtener información sobre la enumeración USB, consulte la entrada de blog titulada ¿Cómo enumera una pila USB un dispositivo?

Normalmente, cuando la pila de controladores USB no puede enumerar un dispositivo, el controlador del concentrador sigue informando de la llegada del dispositivo a Windows y el dispositivo USB se marca como un dispositivo desconocido en Administrador de dispositivos. El dispositivo tiene un identificador de dispositivo de USB\VID_0000&PID_0000 y un id. de hardware y un identificador compatible de USB\UNKNOWN. Los siguientes eventos hacen que el controlador del concentrador USB enumere un dispositivo USB como un dispositivo desconocido:

  • Se agota el tiempo de espera de una solicitud de restablecimiento de puerto durante la enumeración.
  • Error en la solicitud Establecer dirección para el dispositivo USB.
  • Error en la solicitud del descriptor de dispositivo del dispositivo USB.
  • El descriptor de dispositivo USB tenía un formato incorrecto y se produjo un error en la validación.
  • Error en la solicitud del descriptor de configuración.
  • El descriptor de configuración DE USB se ha realizado de forma incorrecta y se ha producido un error en la validación.

En Windows 7, los dispositivos desconocidos que no se pueden enumerar se marcan con el código de error 43 en Administrador de dispositivos.

Si un dispositivo está marcado con el código de error 28 en Administrador de dispositivos, el dispositivo se enumera correctamente, pero sigue siendo un dispositivo desconocido. Este código de error indica que el dispositivo no proporcionó una cadena de id. de producto durante la enumeración y Windows no encontró un INF coincidente para que el dispositivo instale un controlador.

Iniciar el análisis de seguimiento de eventos

Dado que se trata de un error de dispositivo, se recomienda usar Netmon con el analizador USB para analizar el archivo de registro.

Para ver el registro de seguimiento de eventos

  1. Ejecute Netmon, haga clic en Archivo -> Abrir -> Capturary, a continuación, seleccione el archivo.

  2. Seleccione el primer evento en el panel Resumen de fotogramas, que tiene la descripción SystemTrace. Esta imagen muestra el aspecto de la pantalla al seleccionar el primer evento.

    Captura de pantalla que muestra la ventana

  3. Para personalizar las columnas que muestra Netmon, haga clic con el botón derecho en un nombre de columna y seleccione Elegir columnas.

  4. El primer evento, que se identifica como tipo SystemTrace, contiene información general sobre el registro. Puede expandir el árbol de información en el panel Detalles del marco para ver información como el número de eventos perdidos y la hora de inicio del seguimiento.

Eventos de resumen de dispositivos USB

El evento 2 es el primer evento USB del registro. Estos y varios eventos posteriores describen los controladores de host USB, los concentradores y los dispositivos que estaban conectados al sistema cuando iniciamos el seguimiento. Podemos llamar a este grupo de eventos los eventos de resumen del dispositivo o simplemente eventos de resumen. Al igual que el primer evento, los eventos de resumen no describen la actividad del controlador. Los eventos de resumen registran el estado de los dispositivos al inicio de una sesión de registro. Otros eventos representan algo que sucede en el bus, las interacciones con los controladores de cliente o el sistema, o los cambios de estado interno.

El concentrador USB y los controladores de puerto USB ambos registran eventos de resumen. El controlador que registró un evento se identifica en la columna Nombre del protocolo. Por ejemplo, un evento registrado por el controlador de puerto USB tiene el nombre del protocolo USBPort_MicrosoftWindowsUSBPORT. Normalmente, un seguimiento de eventos USB contiene una secuencia de eventos de resumen de puerto, seguida de una secuencia de eventos de resumen del concentrador. Muchos de los eventos de resumen del puerto USB y del concentrador USB tienen las palabras "Información" o "Atributos" en su descripción.

¿Cómo puede identificar el final de los eventos de resumen? Si hay una interrupción significativa en el patrón de marca de tiempo entre los eventos del concentrador USB al inicio del registro, es probable que la interrupción sea el final del resumen del dispositivo. De lo contrario, es probable que el primer evento de puerto USB después de cualquier evento de concentrador USB sea el primer evento que no sea de resumen. En la figura 3 de la página siguiente se muestra el primer evento que no es de resumen en este seguimiento de ejemplo.

En este ejemplo, el dispositivo de interés no estaba conectado al sistema cuando se inició el seguimiento, por lo que puede omitir los eventos de resumen del dispositivo por ahora.

Captura de pantalla que muestra un dispositivo de interés seleccionado en el

Descripción del evento y carga de datos

En el registro de ejemplo, el primer evento después de los eventos de resumen del dispositivo es un evento completado de wake IRP de espera del concentrador USB. Hemos conectado un dispositivo y un controlador de host o un concentrador se está despertando en respuesta. Para determinar qué componente se está despertando, examine los datos del evento. Los datos están en el panel Detalles del marco, que se muestra en una estructura de árbol con aproximadamente el siguiente formato:

Frame information
ETW event header information
    ETW event descriptor (Constant information about the event ID such
    as error level)
Event payload (Data logged at the time of the event)
    Name of a USB-specific structure
        Structure members and their values (Types: numbers, strings,
        or arrays)
    ...

Expanda los datos de carga para el evento IRP completed de espera del concentrador USB y verá una estructura ETW denominada fid_USBHUB_Hub. El nombre de la estructura tiene los siguientes componentes:

Término Descripción
Fid_ Prefijo típico para una estructura ETW USB.
USBHUB_ Indicación de que el controlador del concentrador USB registró el evento.
El resto de la cadena Nombre del objeto que describen los datos de la estructura. Para este evento, es un objeto Hub.

El controlador del concentrador USB usa la estructura fid_USBHUB_Hub para describir un concentrador USB. Los eventos que tienen esta estructura de concentrador en su carga de datos hacen referencia a un centro y podemos identificar el centro específico mediante el contenido de la estructura. En la figura 4 se muestra el panel Detalles del marco, con la estructura fid_USBHUB_Hub expandida para mostrar sus campos.

Microsoft Network Monitor: detalles de fotogramas.

La estructura del concentrador es muy similar a otras dos estructuras que suelen aparecer en eventos ETW USB:fid_USBHUB_Device y fid_USBPORT_Device. Los siguientes campos importantes son comunes a las tres estructuras:

Campo Descripción
fid_idVendor El identificador del proveedor USB (VID) del dispositivo
fid_idProduct El identificador de producto USB (PID) del dispositivo
fid_PortPath Lista de números de puerto de concentrador basados en uno a través de los cuales se conecta un dispositivo USB. El número de números de puerto de la lista se encuentra en el campo PortPathDepth . En el caso de los dispositivos del centro de conectividad raíz, esta lista es ceros. Para un dispositivo USB que está conectado directamente a un puerto de concentrador raíz, el valor de PortPath[0] es el número de puerto del concentrador raíz del puerto al que está conectado el dispositivo.

Para un dispositivo USB que está conectado a través de uno o varios concentradores USB adicionales, la lista de números de puerto del concentrador comienza con el puerto del concentrador raíz y continúa con los concentradores adicionales (en el orden de distancia desde el centro raíz). Omita los ceros. Por ejemplo:

Valor de ejemplo Descripción
[0, 0, 0, 0, 0, 0] El evento hace referencia a un concentrador raíz (un puerto en el equipo, controlado directamente por un controlador de host USB).
[3, 0, 0, 0, 0, 0] El evento hace referencia a un centro de conectividad o a un dispositivo que está conectado al número de puerto 3 de un centro de conectividad raíz.
[3, 1, 0, 0, 0, 0] Un concentrador se conecta al puerto 3 de un centro raíz. El evento hace referencia a un centro o a un dispositivo que está conectado al puerto 1 de este centro externo.

Debe supervisar las rutas de acceso de puerto de cualquier dispositivo de interés. Cuando se enumera un dispositivo, el VID y el PID son desconocidos y se registran como 0. El VID y el PID no aparecen durante algunas solicitudes de dispositivo de bajo nivel, como restablecer y suspender. Estas solicitudes se envían al centro al que está conectado el dispositivo.

En nuestro registro de ejemplo, el evento Wait Wake completion tiene una ruta de acceso de puerto con seis ceros. El evento indica una acción Esperar reactivación en un centro raíz. Esto es lógico debido a nuestras acciones: conectamos el dispositivo a un puerto de concentrador raíz, por lo que el centro raíz se está despertando.

Filtros de Netmon USB

Puede examinar cada evento en un registro en orden cronológico, si tiene el tiempo. Incluso con experiencia, es difícil identificar rápidamente los eventos importantes mediante el examen de la lista de descripciones de eventos. Para encontrar la causa del dispositivo desconocido más rápidamente, puede usar la característica de filtro Netmon.

Filtro de error USB

Para activar el filtro de error USB en Netmon, haga clic en Filtro -> Filtro de pantalla -> Filtro de carga -> Filtros estándar -> ERRORES del concentrador USB -> USB y, a continuación, haga clic en Aplicar en el panel Filtro de pantalla .

El filtro de error USB limita la lista de eventos solo a los que cumplen los criterios que se muestran en la tabla siguiente.

Filtrar texto Descripción
(USBPort_MicrosoftWindowsUSBUSBPORT AND NetEvent.Header.Descriptor.Opcode == 34) Los eventos de puerto USB que tienen el código de operación 34 son errores de puerto.
(USBHub_MicrosoftWindowsUSBUSBHUB AND NetEvent.Header.Descriptor.Opcode == 11) Los eventos del concentrador USB que tienen el código de operación 11 son errores de concentrador.
(NetEvent.Header.Descriptor.Level == 0x2) Los eventos que tienen 0x2 de nivel suelen ser errores.
(USBHub_MicrosoftWindowsUSBUSBHUB AND NetEvent.Header.Descriptor.Id == 210) Los eventos del concentrador USB con el identificador 210 son eventos de excepción del centro usb registrados. Para obtener más información, vea Descripción de los eventos de error y los códigos de estado.

Esta imagen muestra el conjunto más pequeño de eventos que aparecen en el panel Resumen de fotogramas después de aplicar el filtro de error USB al registro de seguimiento de ejemplo.

Captura de pantalla que muestra un conjunto de eventos en el panel

Para ver información general sobre la secuencia de errores, puede ver brevemente cada evento de error. Los campos importantes que se deben observar incluyen fid_NtStatus, fid_UsbdStatus y fid_DebugText. Para obtener más información, vea Descripción de los eventos de error y los códigos de estado. Para desactivar un filtro, haga clic en el botón Quitar en el panel Filtro para mostrar .

Filtros de Netmon personalizados

Puede crear filtros personalizados en Netmon. El método más sencillo es crear un filtro a partir de datos en la pantalla de una de las siguientes maneras:

  • Haga clic con el botón derecho en un campo en el panel Detalles del marco y seleccione Agregar valor seleccionado para mostrar filtro.
  • Haga clic con el botón derecho en un campo en el panel Resumen de fotogramas y seleccione Agregar [nombre del campo] al filtro para mostrar.

Puede cambiar los operadores (como OR, AND y ==) y los valores de filtro para crear las expresiones de filtro adecuadas.

Descripción de los eventos de error y los códigos de estado

En nuestro ejemplo de dispositivo desconocido, la mayoría de las excepciones del concentrador USB tienen un fid_DebugText datos de CreateDeviceFailure. No está claro lo grave que es la excepción, pero el texto de depuración proporciona una sugerencia sobre la causa: se produjo un error en una operación relacionada con el nuevo dispositivo. Por ahora, supongamos que los eventos adyacentes Create Device Failed son redundantes. Las dos últimas excepciones son CreateDeviceFailure_Popup y GenErr_UserIoctlFailed. La excepción emergente parece un error que se ha expuesto al usuario, pero todos estos errores podrían estar relacionados con el problema desconocido del dispositivo.

Los eventos de error USB y otros eventos tienen valores de estado en sus datos que proporcionan información valiosa sobre el problema. Puede encontrar información sobre los valores de estado mediante los recursos de la tabla siguiente.

Tipo de estado Recurso
fid_NtStatus Consulte Valores NTSTATUS.
Campo de estado de un bloque de solicitud USB (URB) o fid_UsbdStatus Busque el valor como un USBD_STATUS en inc\api\usb.h en el Kit de controladores de Windows (WDK). También puede usar el USBD_STATUS. En este tema se enumeran los nombres simbólicos y los significados de los valores de USBD_STATUS.

Lectura hacia atrás de eventos de problema

Los eventos registrados antes de los eventos de error pueden proporcionar pistas importantes sobre la causa del error. Debe examinar los eventos que se registran antes de los errores para intentar determinar la causa principal del dispositivo desconocido. En este ejemplo, empiece a mirar hacia atrás desde el evento CreateDeviceFailure_Popup, la segunda a la última excepción. Seleccione este evento mientras el filtro de error USB está habilitado y, a continuación, haga clic en Quitar en el panel Filtro de visualización . El filtro de error USB sigue apareciendo en el panel Filtro de pantalla y puede volver a aplicarlo más adelante. Pero ahora el filtro está deshabilitado y el panel Resumen de fotogramas muestra todos los eventos como se muestra en esta imagen.

Microsoft Network Monitor.

Los dos eventos que se registran justo antes del evento de CreateDeviceFailure_Popup son dispatch y complete de una transferencia de control USB. El campo de ruta de acceso del puerto fid_USBPORT_Device es cero para ambos eventos, lo que indica que el destino de la transferencia es el centro raíz. En la estructura fid_USBPORT_URB_CONTROL_TRANSFER del evento de finalización, el estado es cero (USBD_STATUS_SUCCESS), lo que indica que la transferencia se realizó correctamente. Continúe examinando los eventos anteriores.

Los dos siguientes eventos anteriores son el cuarto (final) Evento Create Device Failed y la cuarta excepción CreateDeviceFailure (final), que hemos examinado anteriormente.

El siguiente evento anterior es Endpoint Close. Este evento significa que un punto de conexión ya no se puede usar. Los datos del evento describen el dispositivo y el punto de conexión en ese dispositivo. La ruta de acceso del puerto del dispositivo es [1, 0, 0, 0, 0, 0]. El sistema en el que se ejecutó el seguimiento solo tiene controladores de host (concentradores raíz) más el dispositivo que se estaba conectando, por lo que esta ruta de acceso de puerto no describe un centro. El punto de conexión cerrado debe estar en el único dispositivo que conectamos y ahora sabemos que la ruta de acceso del dispositivo es 1. Es probable que los controladores hagan que el punto de conexión del dispositivo sea inaccesible debido a un problema que se encontró anteriormente. Continúe examinando los eventos anteriores.

El siguiente evento anterior es una transferencia de control USB completada. Los datos del evento muestran que el destino de la transferencia es el dispositivo (la ruta de acceso del puerto es 1). La estructura fid_USBPORT_Endpoint_Descriptor indica que la dirección del punto de conexión es 0, por lo que se trata del punto de conexión de control predeterminado definido por USB. El estado de URB es 0xC0000004. Dado que el estado no es cero, es probable que la transferencia no se haya realizado correctamente. Para obtener más información sobre este valor de USBD_STATUS, consulte usb.h y Descripción de los eventos de error y los códigos de estado.

#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L)

Significado: el dispositivo devolvió un identificador de paquete de detenida. ¿Qué solicitud ha detenido el punto de conexión? Los demás datos registrados para el evento indican que la solicitud era una solicitud de control de dispositivo estándar. Esta es la solicitud analizada:

  Frame: Number = 184, Captured Frame Length = 252, MediaType = NetEvent
+ NetEvent:
- MicrosoftWindowsUSBUSBPORT: Complete Internal URB_FUNCTION_CONTROL_TRANSFER
  - USBPORT_ETW_EVENT_COMPLETE_INTERNAL_URB_FUNCTION_CONTROL_TRANSFER: Complete Internal URB_FUNCTION_CONTROL_TRANSFER
   + fid_USBPORT_HC:
   + fid_USBPORT_Device:
   + fid_USBPORT_Endpoint:
   + fid_USBPORT_Endpoint_Descriptor:
   + fid_URB_Ptr: 0x84539008
   - ControlTransfer:
    + Urb: Status = 0xc0000004, Flags 0x3, Length = 0
    - SetupPacket: GET_DESCRIPTOR
     + bmRequestType: (Standard request) 0x80
       bRequest: (6) GET_DESCRIPTOR
       Value_DescriptorIndex: 0 (0x0)
       Value_DescriptorType: (1) DEVICE
       _wIndex: 0 (0x0)
       wLength: 64 (0x40)

Combine bRequest (GET_DESCRIPTOR) con el Value_DescriptorType (DEVICE) y puede determinar que la solicitud era get-device descriptor.

Para que la enumeración USB continúe, el dispositivo debe haber respondido a esta solicitud con su descriptor de dispositivo. En su lugar, el dispositivo ha detenido la solicitud, lo que ha provocado un error en la enumeración. Por lo tanto, los cuatro errores de creación del dispositivo se produjeron por solicitudes bloqueadas para el descriptor de dispositivo. Ha determinado que el dispositivo es desconocido porque se produjo un error en la enumeración y que se produjo un error en esa enumeración porque el dispositivo no completó la solicitud para su descriptor de dispositivo.