USB-Geräte ab- und -zuschalten

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

USB-Geräte ab- und -zuschalten

Beitrag von Helle »

Mitunter vertragen sich gleichzeitig angeschlossene USB-Geräte nicht. Bei mir "stänkerte" ein TV-Stick, der z.B. Kopier-Operationen eines normalen Sticks verhinderte. Den TV-Stick abzuschalten geht ja, aber wie wieder aktivieren ohne PC-Neustart, Aktionen über den Geräte-Manager oder erneutes Einstecken (hinten am PC, und das bei meinem Bierbauch)? Die Lösung liefert MS mit dem wirklich guten Tool Devcon. Diese Exe (knapp 60KB) gibts incl. Source-Code bei MS zum freien Download. Mit Devcon kann man hardware-mässig eine ganze Menge machen, hier mein Beispiel zum Schalten von USB-Geräten:

Code: Alles auswählen

;- Ein- und Aus-Schalten von angeschlossenen USB-Geräten
;- "Helle" Klaus Helbing, 04.09.2008, PB v.4.20 
;- Die Datei "devcon.exe" kann in einem beliebigen Ordner liegen, hier selber Ordner wie das Programm  
;- Bitte die Zwangspausen (Delay(2000)) beachten! Kann auf schnellen Rechnern runtergesetzt werden
;- Also etwas Geduld zwischen den einzelnen Aktionen!
;- Benutzung auf eigene Gefahr! Ist aber harmlos; wer seine USB-Maus oder -Tastatur beendet, braucht
;-  schlimmstenfalls ein Zweit-Gerät an einem anderen Anschluß und kann das beendete Gerät wieder
;-  starten. Trotzdem aufpassen! Oder im Programm als Gerät ausblenden.    
;- Getestet mit W2k und XP. Auf eine Auswertung von Rückgabewerten (Fehler) wurde hier verzichtet.

USBR$ = "USB\ROOT"
Activ$ = "running"
Dis$ = "disabled"

Structure USB
  Name$
  VID$
  PID$
  Status$
EndStructure

If OpenWindow(0, 0, 0, 400, 200, "USB-Geräte verwalten, linker Maus-Doppelklick ändert Status", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListIconGadget(0, 10, 10, 380, 180, "Geräte-Name", 180, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(0, 1, "VID", 65)
  AddGadgetColumn(0, 2, "PID", 65)
  AddGadgetColumn(0, 3, "Status", 60)
  ;Pfad von devcon evtl.anpassen
  ProgID = RunProgram("devcon", "find usb\*", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  Delay(2000)                               ;muss sein! Bei Bedarf höher!
  Laenge = AvailableProgramOutput(ProgID)
  Buffer = AllocateMemory(Laenge)
  ReadProgramData(ProgID, Buffer, Laenge)

  Dim Geraet.USB(Laenge)                    ;gaaaanz sicher! Kann man natürlich verkleinern

  For i = 0 To Laenge - 1
    If PeekB(Buffer + i) = 13
      USB$ = PeekS(Buffer + j, i-j, #PB_Ascii)
      j = i
      If FindString(USB$, USBR$, 1) = 0
        AddGadgetItem(0, -1, "")
        If FindString(USB$, "VID", 1) > 0   ;sonst Käse bei kein Gerät 
          USB$ = RTrim(USB$)                ;zeigt hier auch ausgeschaltete Geräte an!
          Geraet(z)\VID$ = Mid(USB$, 7, 8)  ;8 Zeichen lang, Position ermittelt
          SetGadgetItemText(0, z, Geraet(z)\VID$, 1)
          Geraet(z)\PID$ = Mid(USB$, 16, 8)
          SetGadgetItemText(0, z, Geraet(z)\PID$, 2)
          k = FindString(USB$, ":", 20)     ;oder mehr als 20
          Geraet(z)\Name$ = Mid(USB$, k+2, i-k)  ;oder bei bekannter VID/PID eigenen Namen setzen
          SetGadgetItemText(0, z, Geraet(z)\Name$, 0)   
          ProgID2 = RunProgram("devcon", "status usb\"+Geraet(z)\VID$+Chr(38)+Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
          Delay(2000)
          Laenge2 = AvailableProgramOutput(ProgID2)
          Buffer2 = AllocateMemory(Laenge2)
          ReadProgramData(ProgID2, Buffer2, Laenge2)
          Act$ = PeekS(Buffer2, Laenge2, #PB_Ascii)
          KillProgram(ProgID2)
          CloseProgram(ProgID2)      
          FreeMemory(Buffer2)
          If FindString(Act$, Activ$, 1) <> 0
            Geraet(z)\Status$ = Activ$
           Else
            Geraet(z)\Status$ = Dis$
          EndIf 
          SetGadgetItemText(0, z, Geraet(z)\Status$, 3)
          z + 1   
          If i > Laenge - 50                ;50 oder so in etwa
            Break
          EndIf
        EndIf 
      EndIf 
    EndIf
  Next 

  KillProgram(ProgID)                       ;sicher ist sicher
  CloseProgram(ProgID)

  Repeat
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_CloseWindow
        End 
      EndIf   
    Until EventType() = #PB_EventType_LeftDoubleClick 

  z = GetGadgetState(0)

  If z >= 0
    ;Status switchen
    If Geraet(z)\Status$ = Activ$
      ProgID2 = RunProgram("devcon", "disable usb\" + Geraet(z)\VID$ + Chr(38) + Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Hide)
     Else 
      ProgID2 = RunProgram("devcon", "enable usb\" + Geraet(z)\VID$ + Chr(38) + Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Hide)
    EndIf 

    ;aktuellen Status des geswitchten Gerätes abfragen
    Delay(2000)                                ;evtl. anpassen 
    ProgID3 = RunProgram("devcon", "status usb\"+Geraet(z)\VID$+Chr(38)+Geraet(z)\PID$, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    Delay(2000)
    Laenge3 = AvailableProgramOutput(ProgID3)
    Buffer3 = AllocateMemory(Laenge3)
    ReadProgramData(ProgID3, Buffer3, Laenge3)
    Act$ = PeekS(Buffer3, Laenge3, #PB_Ascii)
    KillProgram(ProgID3)
    CloseProgram(ProgID3)      
    FreeMemory(Buffer3)
    If FindString(Act$, Activ$, 1) <> 0
      Geraet(z)\Status$ = Activ$
     Else
      Geraet(z)\Status$ = Dis$
    EndIf 
    SetGadgetItemText(0, z, Geraet(z)\Status$, 3)
  EndIf 
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 
Gruß
Helle

Edit: 5.9.2008 Kosmetik, wenn kein USB-Gerät angeschlossen ist
Zuletzt geändert von Helle am 05.09.2008 17:00, insgesamt 2-mal geändert.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Beitrag von 7x7 »

Ich habe so das Gefühl, als ob dein Programm mein Problem lösen könnte. Habe einen Serial-USB-Konverter
der vermutlich Treiberprobleme hat und sich gelegentlich einfach mal so verabschiedet. Gezieltes ab- und
anmelden könnte vielleicht helfen.

Hast du mal einen direkten Link zu "devcon.exe"? Finde nichts bei MS.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

[offtopic]
"devcon" ist ja auch ein nettes wortspielchen.... Bild
[/offtopic]
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

7x7 hat geschrieben:Hast du mal einen direkten Link zu "devcon.exe"? Finde nichts bei MS.
http://support.microsoft.com/kb/311272
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Beitrag von 7x7 »

Kaeru Gaman hat geschrieben:[offtopic]
"devcon" ist ja auch ein nettes wortspielchen.... Bild
[/offtopic]
In der Tat ('Defense Condition')
Oh nein, das Pentagon wird doch wohl nicht Windows benutzen...?! :wink:


Danke Rings für den Link!
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

@Helle: Super! (und das ohne Assembler :D )
Ich hab` natürlich nichts gegen Assembler - Ich versteh`s nur überhaupt nicht.
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

7x7 hat geschrieben:In der Tat ('Defense Condition')
yo, der Bezug zur Abkürzung DEFCON ist das wortspielchen.
die Abkürzung devcon heißt device control.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46
Wohnort: Luxemburg
Kontaktdaten:

Beitrag von hardfalcon »

MORE INFORMATION
DevCon is not redistributable. It is provided for use as a debugging and development tool. You can freely modify DevCon for private use. The sample demonstrates how to use the SetupAPI and CfgMgr32 functions together effectively to enumerate devices and perform device operations. The following file is available for download from the Microsoft Download Center:
Das ist ja mal doof... :|
„Warum siehst du den Splitter im Auge deines Bruders, aber den dicken fetten schwarzen Zensurbalken vor deinem Auge bemerkst du nicht?“
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »



eher schlau

hier gehts zum quellcode (u.a.)
http://www.microsoft.com/whdc/devtools/ddk/default.mspx

viel Spass beim Lernen
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten