Arrêter le contrôle de bogue D1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL) dans le port USB lors du transfert de données USB et de sélection d’interface USB


Symptômes


Pendant l’initialisation et la communication avec un périphérique USB concernant à un ordinateur exécutant Windows 7 ou Windows Server 2008 R2, l’ordinateur peut se bloquer et vous pouvez recevoir un message d’erreur Stop semblable au suivant :

STOP 0x000000D1 (0000000000000000, 0000000000000002, 0000000000000000, paramètre 4 )
DRIVER_IRQL_NOT_LESS_OR_EQUAL


Cause


Ce problème est dû à un bogue dans le Microsoft USB 1.1 et 2.0 pilote de Port de contrôleur hôte (port USB. (SYS). Port USB ne parvient pas à synchroniser l’accès à la liste des canaux pour un périphérique USB, ce qui peut entraîner une liste incohérente tuyau (endommagée) sous certaines conditions.

Ce bogue n’est susceptible d’être exposé lorsque le périphérique USB est un périphérique Composite, avec plusieurs périphériques USB logiques sont implémentées en tant qu’enfants d’un physique (parent) périphérique USB.

Dans ce scénario, un pilote de fonction consiste à sélectionner l’Interface de sa fonction, ce qui supprime les canaux associés à l’Interface précédente à partir de la liste des canaux du périphérique. Cette opération n’est pas protégée par un verrou (n’est pas atomique) et conserve la liste des canaux dans un état incohérent pendant une courte période de temps.

Pendant ce temps, un autre pilote de fonction effectue les transferts vers ou à partir d’un de ses canaux de communication. Tandis que la transformation d’un nouveau transfert USB, liste des canaux du périphérique pour valider la souris USB de tuyau qui est la cible du transfert, rencontre un canal qui est supprimé de la liste, les parcours de port USB déréférence le pointeur NULL du canal en cours de suppression entraîne la vérification d’erreur Stop D1.

Résolution


Pour contourner ce problème, le développeur d’un pilote de périphérique USB Composite (remplacement Usbccgp) peut synchroniser demandes d’Interface de sélectionner les demandes d’e/s, comme suit.

Lors de réception d’une demande de sélectionner une Interface pour une fonction :
  1. La file d’attente (en attente) les nouveaux transferts pour toutes les fonctions du périphérique Composite, autre que la fonction associée à la demande de sélectionner une Interface.
  2. Après un court délai (pour autoriser les demandes en attente de transfert commencer le traitement), transmet la demande de sélectionner l’Interface (au PDO Usbhub (objet du périphérique physique) pour le périphérique Composite) et attendez que la demande de sélectionner une Interface terminer.
  3. À la fin de la demande de sélectionner une Interface, reprendre les transferts de toutes les fonctions et les transmettre les transferts précédemment-en file d’attente.
Notez que la solution ci-dessus ne peut totalement éliminer la vérification d’erreur, en fonction des détails de mise en œuvre et le scénario de reproduction exacte. Toutefois, cette solution de contournement est prévue de réduire sensiblement le taux d’occurrence de ce problème.

En outre, cette solution de contournement peut avoir des conséquences pour les pilotes de fonction USB dont les transferts sont temporairement en file d’attente pendant le traitement de la demande de sélectionner une Interface. Développeurs de périphérique ou le pilote USB qui rencontrent ce problème sont invités à s’engager la prise en charge du Kit de pilotes de Microsoft Windows pour obtenir des instructions plus spécifiques à l’implémentation de cette solution de contournement.

Plus d'informations


Un correctif pour ce problème sera peut-être incluse dans une future version de Windows.

Pour plus d’informations sur les options de prise en charge du Kit de pilotes Windows, consultez les liens suivants :
Prise en charge pour les Kits de pilote et les outils
Prise en charge du Kit de pilotes Windows 7.0