Wie setze ich USB-Geräte mithilfe der Windows-API?
Kennen Sie einen Weg, um die Windows XP-API-reset des USB-bus? In anderen Worten, ich würde die OS kick out alle USB-Geräte, die aktuell verbunden sind, und dann auto-detect alles neu.
Ich bin mir dessen bewusst,devcon, und ich glaube, ich könnte das system ruft es, aber ich bin der Hoffnung, für eine direkte Aufruf der API.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom kernel-Modus: Sie können erzwingen, dass ein bestimmtes USB-Gerät neu angeschlossen, als ob es nicht angeschlossen war und wieder umgebogen, indem er eine
IOCTL_INTERNAL_USB_CYCLE_PORT
seiner PDO. (Dies kann nur von einem kernel-mode, z.B. durch Helfer-Treiber.) Dieser 'Zyklus' - operation dazu, dass ein USB-reset auftreten, nach der das Gerät wäre neu aufgelistet. Zum Beispiel, wenn das Gerät kommt zurück mit einem anderen USB-device-Deskriptor, einem anderen Fahrer kann angepasst werden, damit es.Von Benutzer-Modus: Sie können dies tun, durch das Auswerfen des Geräts über die CfgMgr-API. Zum Beispiel, gehen über alle USB-hubs und vertreibt alle Geräte:
GUID_DEVINTERFACE_USB_HUB
mitSetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE)
.SetupDiEnumDeviceInfo
).DevInst
Mitglied:CM_Get_Child(DevInst)
und dannCM_Get_Sibling
wiederholt, um alle untergeordneten Knoten des hub (also USB-Geräte).CM_Request_Device_Eject
.Gut verwenden können, verwenden Sie die Setup-API (setupdi XXX Funktionen) zum auflisten der USB-Geräte in das system ein, und rufen Sie dann WinUsb_ResetPipe auf jeden, aber ich bin mir nicht sicher, ob das, was Sie suchen. Es ist schon eine Weile her, seit ich arbeitete mit USB Geräten, aber soweit ich mich erinnere, es gibt keine standard-Weg, um ein Gerät zurückzusetzen (d.h., simulieren Sie einen power-off/power-on-Zyklus). Wenn es möglich ist für ein bestimmtes Gerät, Sie würde senden Sie eine entsprechende IOCTL (mit DeviceIOControl) an den Fahrer. Der IOCTL-Aufruf würde variieren von Hersteller zu Hersteller.
Ist es möglich, Zyklus der Eltern-port USB-hub an das Gerät angeschlossen ist, als auch. Dies führt, unter anderem, apparrent unplug/replug-Aktionen, wie Sie sehen werden, ein Ballon-popup, wenn dies der Fall ist.
Vieles davon ist schlecht dokumentiert, und ehrlich gesagt, habe ich mittlerweile den Eindruck es gibt nur eine Handvoll Leute bei Microsoft, die sich wirklich gut verstehen. Die design-Entscheidung, die ich gemacht habe, für zukünftige Geräte, die ich entwerfe, ist, dass ich die Absicht habe, zu zählen watchdog-Funktionalität auf beiden Seiten, sowie eine device-side-vollständige reset-Funktion. Auf diese Weise, wenn das Gerät rechnet aus, es ist verwirrt, es kann nur schneiden eigener Kraft für eine zweite und vollständig zurückgesetzt, wenn der host kann nicht mit ihm kommunizieren, es könnte das gleiche tun, und wenn das Gerät denkt, alles ist in Ordnung, aber der Gastgeber besser weiß, der host konnte, um es zurückzusetzen.
Gibt es mindestens drei APIs, lohnt ein Blick in für dieses problem: das Setup-API, Config Manager API und verschiedene WMI-Erweiterungen. Jedoch, seien Sie vorsichtig über das Tauchen in WMI wenn Sie beabsichtigen, verwenden Sie ein Eingebettetes XP-Ziel, wie Sie müssen eine Menge andere Dinge in Ihrem OS-image, die Sie sonst nicht brauchen.
Soweit ich weiß, gibt es keine Möglichkeit, dies zu tun - Sie können einen Befehl zu haben, PnP rescan den bus nach neuen Geräten, aber das ist nicht das gleiche wie die Ausstellung eines bus-reset aus.
Außerdem, nur weil die von einem hardware-Perspektive, die Sie ausgestellt hat, ein bus-reset bedeutet nicht, dass Windows entfernt die PDOs, die für die Kinder der hub-und erkennen Sie; der USB-bus-Treiber kann (und tut) tut genau das, was ich beschreiben (d.h. Problem-hardware-bus-resets, ohne die Geräte-Baum), und nur nach das Gerät nicht reagieren, tut es Problem die überraschung Entfernung und reißen es aus dem Baum.