Mittwoch, 3. Juni 2009

USB-Probleme - Verschwundener CardReader und Fehler in der Hotplug.dll

USB-Geräte haben bei mir bisher unter Windows XP noch nie irgendein Problem verursacht... bis eben... und dann auch noch gleich zwei Probleme auf einmal. :-) Meine Lösung möchte ich teilen, damit andere ggf. schneller zum Ziel kommen.

Probleme

1. Beim Schreiben einer größeren Datenmenge auf eine SD-Karte in meinem _internen_ USB-CardReader meldete Windows Datenverlust. Anschließend war der CardReader verschwunden. Auch ein mehrmaliger Neustart des Rechners brachte den CardReader nicht zurück.

2. Bei einem Klick mit der rechten Maustaste auf das "Hardware sicher entfernen"-Tray-Icon und Auswahl von "Hardware sicher entfernen" erschien statt des erwarteten Dialogs lediglich die Meldung:

Beim Ausführen von "shell32.dll,Control_RunDLL hotplug.dll" ist eine Ausnahme aufgetreten.

Lösung 1: CardReader reaktivieren

Die Lösung ist relativ unspektakulär:

1. Rechner herunterfahren.

2. Netzteil ausschalten, oder falls kein Schalter vorhanden, Netzstecker ziehen.

3. Power-Knopf für einige Sekunden gedrückt lassen um Spannung aus Netzteil zu ziehen.

4. Netzteil einschalten, bzw. Netzstecker wieder einstecken.

5. Rechner starten -> der CardReader wird wieder erkannt.

Wer den Rechner offen hat, oder den Rechner nicht herunterfahren kann/will (Server?) einfach Gehäuse öffnen, Stecker des CardReaders vom Mainboard ziehen und wieder einstecken.

Hintergrund:

Dieser CardReader (VID 07CC, PID 0301, REV 0005) hängt sich gerne mal beim Schreiben großer Datenmengen auf. Das ist ein Problem des Geräts und nicht von Windows, da dieser Fehler auch auf anderen Rechnern unter Linux auftritt (siehe Beitrag von Thomas Thanner hier). Da USB-Geräte selbst bei ausgeschaltetem Rechner mit Strom versorgt werden, verbleibt das Gerät nun ewig im abgestürztem Zustand. Über den USB-Bus kann man es auch nicht mehr ansprechen, da es mit diesem nicht mehr kommuniziert. Einen externen CardReader hätte man jetzt schnell vom USB-Port abgezogen (Strom weg) und wieder angesteckt (Gerät startet neu), was aber bei internen Geräten ohne das Öffnen des Gehäuses nicht möglich ist. Zudem ist es unmöglich USB-Controller, die in handelsüblichen Rechnern verbaut werden, dazu zu bekommen die Stromzufuhr zu USB-Geräten zu unterbrechen. Das ist zwar in der EHCI-Spezifikation (USB 2.0) vorgesehen, aber selbst die EHCI-Controller der neusten Intel ICH-Familie unterstützen dieses Feature nicht (siehe z.B. im Datasheet den Kommentar zu Bit 12 der PORTSC-Struktur). Wer Glück hat, der hat ein Mainboard dessen BIOS es zumindest erlaubt die Stromzufuhr bei ausgeschaltetem Rechner abzustellen.

Zusammenfassend ergibt sich:

  • Kommandos am USB-Port (ein-/ausschalten, Reset, o.ä.) nimmt das Gerät nicht an, da es abgestürzt ist und gar nicht mehr mit dem USB-Port kommuniziert.

  • Es ist NICHT möglich die Stromzufuhr zum Gerät per Software zu unterbrechen (z.B. über den USB-Hub).

  • Auch bei ausgeschaltetem Rechner werden USB-Ports mit Strom versorgt.

  • Es existiert meist keine BIOS-Option um die Stromversorgung der USB-Ports bei ausgeschaltetem Rechner abzustellen.

  • => Um ein abgestürztes, internes USB-Gerät wieder in Betrieb zu nehmen, muss der Rechner "hart" vom Strom getrennt werden (Netzteil aus!).


Eine ganz andere Situation ergibt sich, wenn das Gerät gar nicht abgestürzt ist, sondern z.B. aus Versehen über "Hardware sicher entfernen" entfernt wurde. Hier genügt es den USB-Hub zu deaktivieren und anschließend wieder zu aktivieren. Hierbei fordert der Hub die Geräte beim Deaktivieren auf sich auszuschalten, bzw. in Standby zu gehen. Beim Reaktivieren sender der Hub an alle Geräte Kommandos damit diese wieder erwachen und sich neu anmelden. Ist das Gerät nicht abgestürzt, so ragiert es auf die Kommandos und erscheint wieder neu (im Falle von Massenspeichern inkl. aller Laufwerke). Das ganze lässt sich bequem über die Kommandozeile mit dem Tool Devcon von Microsoft erledigen:

>devcon disable @USB\ROOT_HUB*
>devcon enable @USB\ROOT_HUB*
>devcon rescan


Wer sich alle Geräte anschauen möchte die jemals am Rechner über USB angeschlossen waren:

>devcon findall @USB\*

Eine schöne Übersicht über all diese Geräte gibt auch das Tool USBDeview. Eine Auflösung der VendorID und ProductID von USB-Geräten ist z.B. über die USB-ID-Liste von Stephen J. Gowdy möglich.

Wer sich mit der Programmierung rund um USB beschäftigen möchte findet z.B. hier Einstiegsmöglichkeiten / Bibliotheken:

Lösung 2: Hotplug.dll-Fehler beheben

Dieser Fehler wird aller Wahrscheinlichkeit nach durch "Standardvolumes" mit falsch hinterlegtem Treiber verursacht. Um dies zu beheben folgendermaßen vorgehen:

  • Im Gerätemanager aus dem Menü "Ansicht" wählen und auf "Ausgeblendete Geräte anzeigen" klicken.

  • Jetzt auf das "+" bei "Speichervolumes" klicken um die Baumansicht zu öffnen.

  • Ziel sind nun alle Geräte namens "Standartvolume" (auch falls hinter Standardvolume noch irgendwelche zusätzliche Zeichen stehen).

  • Die Standardvolumes durchgehen und über das Kontextmenü (rechte Maustaste) die Treiber aktualisieren.

  • Bei einigen (nicht allen) wird der Treiber aktualisiert werden.


Das hat bei mir gereicht um das Problem zu behben.

Sollte das nicht ausreichen um das Problem zu beheben, kann man zusätzlich versuchen die USB-Controller neu zu installieren:

  • Alle USB-Controller-Treiber im Gerätemanager deinstallieren, d.h. alle Geräte unterhalb von "USB-Controller" im Gerätemanagerbaum.

  • Neu Booten. Nach dem Neustart werden die Treiber der USB-Controller automatisch neu installiert.


An dieser Stelle herzlichen Dank an Johannes, der diesen Fix in seinem Blog beschreibt und damit nicht nur mir, sondern auch vielen anderen bereits damit geholfen hat.

Ansonsten empfiehlt sich bei kleineren USB-Problemen durchaus mal ein schneller Blick in die diversen USB-FAQs der Consumer-Seiten, wie z.B. diesen hier.

Keine Kommentare:

Kommentar veröffentlichen