Seite 1 von 1

USB-Geräte ab- und -zuschalten

Verfasst: 16.07.2008 17:13
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

Verfasst: 21.07.2008 12:04
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.

Verfasst: 21.07.2008 12:19
von Kaeru Gaman
[offtopic]
"devcon" ist ja auch ein nettes wortspielchen.... Bild
[/offtopic]

Verfasst: 21.07.2008 12:41
von Rings
7x7 hat geschrieben:Hast du mal einen direkten Link zu "devcon.exe"? Finde nichts bei MS.
http://support.microsoft.com/kb/311272

Verfasst: 21.07.2008 15:51
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!

Verfasst: 21.07.2008 19:25
von marco2007
@Helle: Super! (und das ohne Assembler :D )
Ich hab` natürlich nichts gegen Assembler - Ich versteh`s nur überhaupt nicht.

Verfasst: 21.07.2008 19:56
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.

Verfasst: 21.07.2008 23:27
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... :|

Verfasst: 22.07.2008 14:25
von bobobo


eher schlau

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

viel Spass beim Lernen