Wenn der Hardware-Assistent blind ist

... muss man ihm den Weg weisen.

Schon seit einigen Wochen/Monaten funktionierte auf meinem Laptop die automatische Installation von Treibern (z. B. bei neuen USB-Sticks) nicht mehr. Eine manuelle Treibersuche unter Angabe des Ordners mit den Treiberdateien – in dem Falle C:\Windows\inf – führte dann aber stets zum Ziel. Vor ein paar Tagen beschloss ich dem Problem endlich auf den Grund zu gehen und den Hardware-Assistenten von seiner temporären Erblindung zu kurieren.

Ich begann damit alle USB-Sticks aus dem Gerätemanager zu entfernen, auch die, die nicht angeschlossen waren (Wie kann man die anzeigen?). Wenn nun ein (bekannter) USB-Stick wieder angeschlossen wird, kommt der übliche "Neu Hardware"-Dialog und der Hardware-Assistent wird versuchen Treiber zu installieren – was leider scheitern wird. Bevor ich aber auf "weiter" klicke und den Vorgang startete, rief ich Sysinternals Process Monitor auf. Über den Button "Include Process From Window" fügte ich den zugehörigen Prozess hinzu, so dass nur noch dessen Events angezeigt werden.

Process Monitor Toolbar
Process Monitor Toolbar: Menüelemente des Tools Process Monitor. Option "Include Process From Window" hervorgehoben

Jetzt konnte es losgehen und der Assistent generierte fleißig Events. Darunter waren auch Events vom Typ ReadFile und QueryOpen, bei denen der HW-Assistent versuchte Verzeichnisse zu lesen. Unter den vielen Events fielen einige besonders heraus: Zugriff auf das Verzeichnis C:\Windows\system32\SystemRoot%\inf\! Was macht das einzelne %-Zeichen in dem Pfadnamen und überhaupt, der Windows-inf-Ordner liegt unter C:\Windows\inf! Natürlich gab es das Verzeichnis nicht (quasi "Kein Anschluss unter diese Nummer" ;-)) und auch sonst tauchte C:\Windows\inf bei keinem der Events auf. Das brachte mich der Lösung ein großes Stück näher, denn offenbar war die Pfadangabe zum Inf-Ordner nicht korrekt gesetzt. Das "SystemRoot%" sagte mir, dass die Umgebungsvariable SystemRoot verwendet werden sollte aber hierfür muss auch vor dem Variablennamen ein %-Zeichen stehen (also %SystemRoot%, welches üblicherweise "C:\Windows" enthält und mit der Variable windir – ein Relikt aus alten Zeiten – identisch ist)! Bliebe noch zu klären woher der Hardware-Assistent die Verzeichnisse nimmt in denen er suchen soll. Eine Datei oder die Registry? Meine Erfahrung sagte mir es ist die Registry. Jedoch war es an der Stelle zu spät, um den genauen Pfad mit Process Monitor (Procmon) zu ermitteln. Jetzt hatte ich noch zwei Möglichkeiten: entweder den Filter von Procmon ändern und den Assistenten erneut starten oder die Registry nach dem falschen Pfad zu durchsuchen. Ich entschloss mich für letzteres.

Für die Suche nutzte ich als Suchbegriff "SystemRoot%\inf" und beschränkte die Suche auf Daten und Werte – (Registry-)Schlüssel erschienen mir unlogisch in diesem Zusammenhang. Da ich bei dem Suchbegriff natürlich auch Ergebnisse mit korrektem %-Zeichen vor SystemRoot fand, waren die ersten Ergebnisse nieten. Doch es dauerte nicht lange bis ich einen Volltreffer landete! Unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion fand ich den entscheidenden Eintrag Namens DevicePath. Dieser Eintrag enthält eine durch Semikolon getrennte Liste von Verzeichnissen, in den der Hardware-Assistent automatisch nach Treibern sucht. Und in der Tat war die erste Auflistung "SystemRoot%\inf" ohne %-Zeichen am Anfang. Nachdem das fehlende Zeichen eingefügt war (und noch ein paar nicht-existente Pfade entfernt wurden), war der Hardware-Assisten geheilt und die automatische Treiberinstallation funktionierte wieder. Heureka!

Eine kleine Beschreibung des Eintrags findet man im MSDN-Artikel Modify the DevicePath Registry Key. %SystemRoot%\inf sollte stets Teil dieses Eintrags sein!