Stop bugcheck D1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL) w GENEROWANYCH podczas przesyłania danych USB i wybierając interfejsu USB


Objawy


Podczas inicjowania i komunikowania się z urządzeniem USB podłączonych do komputera z systemem Windows 7 lub Windows Server 2008 R2, komputer może ulec awarii i może zostać wyświetlony komunikat o błędzie zatrzymania podobny do następującego:

STOP 0x000000D1 (0000000000000000, 0000000000000002, 0000000000000000, parametr4 )
DRIVER_IRQL_NOT_LESS_OR_EQUAL


Przyczyna


Przyczyną tego problemu jest błąd w programie Microsoft USB 1.1 i 2.0 sterowniki Port kontrolera hosta (tj. SYS). GENEROWANYCH nie można zsynchronizować dostęp do listy potoku dla urządzenia USB, które mogą powodować liście niespójne potoku (uszkodzone) pod pewnymi warunkami.

Ten błąd jest tylko być mogą być narażeni, jeśli urządzenie USB jest urządzenie kompozytowe, z kilkoma urządzeniami logicznymi USB implementowane jako dzieci jednego fizycznego (nadrzędnej) urządzenia USB.

W tym scenariuszu jeden sterownik funkcji jest wybór interfejsu dla jego funkcji, która usuwa rury związane z poprzedniego interfejsu z listy rur urządzeń. Ta operacja nie jest chroniony przez blokady (nie jest Atomowej) i pozostawia na liście potoku w niespójnym stanie krótki okres czasu.

Tymczasem inny sterownik funkcji wykonuje przeniesienia do lub z jednego z jego rury. Podczas przetwarzania nowy transfer USB, GENEROWANYCH po liście rur urządzeń do sprawdzania poprawności USB rur oznacza to miejsce docelowe przekazywania, napotka potok usuwana z listy, rozstrzyga wskaźnik o wartości NULL łącze z potoku usuwana i powoduje zatrzymanie D1 operacji wykrywania błędów.

Rozwiązanie


Aby obejść ten problem, deweloper kompozytowe USB device driver (wymiana Usbccgp) może być synchronizowana żądań wybierz interfejs żądań We/Wy, w następujący sposób.

Po odebraniu żądania wybierz interfejs dla jednej funkcji:
  1. Kolejka (Oczekujący) jakikolwiek nowy transfer dla wszystkich funkcji urządzenie kompozytowe, inne niż funkcja skojarzonej z żądaniem wybierz interfejs.
  2. Po krótkiej zwłoce (Aby zezwolić na rozpocząć przetwarzanie żądań oczekujących transfer) przesyła żądanie wybierz interfejs (PDO koncentrator USB [obiektu urządzenia fizycznego] urządzenie kompozytowe) i poczekaj na zakończenie żądania wybierz interfejs.
  3. Po zakończeniu żądanie wybierz interfejs wznowić przesyłanie dla wszystkich funkcji i przekazania wszelkich transferów wcześniej kolejce.
Należy zauważyć, że powyższe rozwiązania nie może całkowicie wyeliminować operacji wykrywania błędów, w zależności od szczegółów implementacji i scenariusz dokładną. Jednak ta metoda obejścia problemu oczekuje się znacznie zmniejszyć szybkość występowania tego problemu.

Ponadto ta metoda obejścia problemu może mieć konsekwencje dla których transfery są tymczasowo umieszczane w kolejce podczas przetwarzania żądania interfejsu wybierz sterowniki funkcji USB. Deweloperzy urządzenia lub sterownika USB, którzy wystąpienia tego problemu są zachęcani do włączania wsparcia Microsoft Windows Driver Kit dla bardziej szczegółowe wytyczne z zastosowaniem tego obejścia.

Więcej informacji


Poprawkę dotyczącą tego problemu mogą być uznane za dla przyszłych wersji systemu Windows.

Aby uzyskać więcej informacji o opcjach pomocy technicznej Windows Driver Kit Zobacz następujące łącza:
Obsługa Driver Kit i narzędzia
Wsparcie Windows Driver Kit 7.0