Detener bugcheck D1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL) en USBPORT al transferir datos USB y seleccionar interfaz USB


Síntomas


Mientras que inicializar y comunicarse con un dispositivo USB conexión a un equipo que ejecuta Windows 7 o Windows Server 2008 R2, el equipo puede bloquearse y puede recibir un mensaje de error Stop similar al siguiente:

STOP 0x000000D1 (0000000000000000, 0000000000000002, 0000000000000000, parámetro4 )
DRIVER_IRQL_NOT_LESS_OR_EQUAL


Causa


Este problema se debe a un error en el Microsoft USB 1.1 y 2.0 controlador de puerto de controlador de Host (USBPORT. (SYS). Se produce un error en el USBPORT sincronizar el acceso a la lista de canalización para un dispositivo USB, lo que puede provocar una lista incoherente de canalización (dañado) bajo ciertas condiciones.

Este error sólo es ser que puedan estar expuestas cuando el dispositivo USB es un dispositivo compuesto con varios dispositivos USB lógicos implementado como elementos secundarios de física de un dispositivo USB (primario).

En este escenario, un controlador de función es la selección de la interfaz para la función que quita los tubos asociados a la interfaz anterior de la lista del dispositivo canalización. Esta operación no está protegida por un bloqueo (no es atómica) y deja la lista canalización en un estado incoherente durante un breve período de tiempo.

Mientras tanto, otro controlador de función es realizar transferencias hacia o desde uno de sus tuberías. Al procesar a una nueva transferencia USB, recorridos de USBPORT lista de canalización del dispositivo para validar la conexión USB de tubería, es decir, el destino de la transferencia, encuentra una canalización que se quitará de la lista, desreferencia el puntero NULL desde el tubo que se va a quitar y hace que la comprobación de errores de parada D1.

Solución


Para evitar este problema, el desarrollador de un controlador de dispositivo USB compuesto (Usbccgp reemplazo) puede sincronizar solicitudes a la interfaz de Active con solicitudes de E/S, como sigue.

Cuando se recibe una solicitud de seleccionar interfaz para una función:
  1. Todas las transferencias de nuevo para todas las funciones del dispositivo compuesto, distinto de la función asociada a la solicitud de seleccionar interfaz en cola (pendiente).
  2. Transcurridos unos segundos (para permitir solicitudes de transferencia pendientes comenzar el procesamiento), reenviar la solicitud de seleccionar interfaz (para el PDO Usbhub [objeto de dispositivo físico] para el dispositivo compuesto) y espere a que la solicitud de seleccionar interfaz completar.
  3. Al finalizar la solicitud de seleccionar interfaz, reanudar a transferencias para todas las funciones y reenviar a todas las transferencias en cola previamente.
Tenga en cuenta que la solución anterior no puede eliminar completamente la comprobación de errores, dependiendo de los detalles de implementación y el escenario de reproducción exacta. Sin embargo, esta solución se espera reducir considerablemente la velocidad de aparición de este problema.

Además, esta solución puede tener consecuencias para los controladores de función USB cuyas transferencias temporalmente se ponen en cola mientras se procesa la solicitud de seleccionar interfaz. Desarrolladores de dispositivo o controlador USB que se encuentren con este problema se recomienda que haga participar a la compatibilidad de Microsoft Windows Driver Kit para obtener instrucciones más específicas con la implementación de esta solución.

Más información


Una solución para este problema se puede considerar para una versión futura de Windows.

Para obtener más información sobre opciones de soporte técnico de Windows Driver Kit, consulte los siguientes vínculos:
Soporte para Kits de controladores y herramientas
Soporte técnico de Windows Driver Kit 7.0