Seite 1 von 1

usberkennung

Verfasst: 24.04.2010 17:54
von deify
hey jungs!
ich habe mir hier einige codefetzen aus dem forum zusammen gesucht und mir ein programm geschrieben welches usb devices erkennen soll!
alles schön und gut, das programm listet die sticks auf! aber wenn man einen neuen stick hinzufügt wird dieser nicht in die liste eingefügt ):

wenn ich einen stick entferne soltle der debugger eigentlich ein "changed" ausspucken, er tut dies aber nur bei meiner sd karte und nicht bei meinem stick oder meinem iPod ):

hier mein code!

Code: Alles auswählen

IncludeFile "wmi.pbi"
Global NewList devices.s(),NewList devicetype.s(),found = #False ,Exit = #False

Procedure usbErkennung(x)
  WMI_INIT()    
  Repeat
    WMI_Call("SELECT * FROM Win32_DiskDrive", "InterfaceType, Model, PNPDeviceID, MediaType, Name, Size, Status")
    ResetList(wmidata())
    device = 0
    While NextElement(wmidata())  ; Wert 1
      cur_Type.s = wmidata()
     
      NextElement(wmidata())     ; Wert 2
      cur_Model.s = wmidata()
     
      NextElement(wmidata())     ; Wert 3
      cur_PNPDeviceID.s = wmidata()
          
     
      NextElement(wmidata())     ; Wert 4
      cur_Media.s = wmidata()
     
      NextElement(wmidata())     ; Wert 5
      cur_Name.s = wmidata()
     
      NextElement(wmidata())     ; Wert 6
      cur_Size.f = ValF(wmidata())
      cur_Size.f = cur_Size.f / 1024 ; kbytes
      cur_Size.f = cur_Size.f / 1024 ; mbytes
      ;cur_Size.f = cur_Size.f / 1024 ; gbytes
     
      NextElement(wmidata())     ; Wert 7
      cur_State.s = wmidata()
      
      If SelectElement(devices(),device) And devices() = cur_PNPDeviceID And SelectElement(devicetype(),device) And devicetype() <> cur_Media
        Debug "changed"
        devicetype() = cur_Media
      EndIf
      ResetList(devices())
      While NextElement(devices())
        If  devices() = cur_PNPDeviceID
          found = #True
          Break
        EndIf 
      Wend
      If Not found
          AddElement(devices())
          AddElement(devicetype())
          devices() = cur_PNPDeviceID 
          devicetype() = cur_Media   
      EndIf
      If cur_Media <> "n/a" And Not found
        AddGadgetItem(0,-1,cur_Type+Chr(10)+cur_Model+Chr(10)+cur_PNPDeviceID+Chr(10)+cur_Media+Chr(10)+cur_Name+Chr(10)+Str(cur_Size)+" Mb"+Chr(10)+cur_State)
        found = 0
      EndIf
      device +1
    Wend
  Until Exit  
  WMI_RELEASE("OK")
  EndProcedure
  
  
  If OpenWindow(0, 100, 100, 700, 300, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 690, 290, "Interface Type", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 2, "Model",100)
   AddGadgetColumn(0, 3, "PNP Device-ID",100)
   AddGadgetColumn(0, 4, "Media Type",100)
   AddGadgetColumn(0, 5, "Name",100)
   AddGadgetColumn(0, 6, "Size",100)
   AddGadgetColumn(0, 7, "Status",86)
   CreateThread(@usbErkennung(),0)
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
   Exit = #True
 EndIf
ich hoffe ihr könnt mir helfen!

mfg deify

Re: usberkennung

Verfasst: 24.04.2010 18:17
von HeX0R
Was meinst du:
Wie groß stehen die Chancen, dass jemand zufällig diese ominöse "wmi.pbi" kennt und vielleicht sogar zur Hand hat?

Re: usberkennung

Verfasst: 24.04.2010 18:21
von deify
sry tut mir leid :P

Code: Alles auswählen

;- WMI Intialisierung, Datenabruf und Deinitialisierung
; rewritten for PB4 and use as an "IncludeFile"
; save this code as "wmi.pb"
; use it in your project with:
;
; includefile "wmi.pb"
; WMI_INIT()
; WMI_Call("Select * FROM Win32_OperatingSystem", "Caption, CSDVersion, SerialNumber, RegisteredUser, Organization")
; ResetList(wmidata())
; While NextElement(wmidata())
;   Debug wmidata()  ; Alle Listenelemente darstellen / show all elements
; Wend
; WMI_RELEASE("OK")
;
;----------------------------------------------------------------------------------------------------------------
; Update für PB4 Final by ts-soft
; unnötige Konstanten und Structuren entfernt (sind in PB enthalten)
; voller Unicode support
; ---------------------------------------------------------------------------------------------------------------
;- KONSTANTEN  PROZEDUREN  STRUKTUREN

#COINIT_MULTITHREAD = 0
#RPC_C_AUTHN_LEVEL_CONNECT = 2
#RPC_C_IMP_LEVEL_IDENTIFY = 2
#EOAC_NONE = 0
#RPC_C_AUTHN_WINNT = 10
#RPC_C_AUTHZ_NONE = 0
#RPC_C_AUTHN_LEVEL_CALL = 3
#RPC_C_IMP_LEVEL_IMPERSONATE = 3
#CLSCTX_INPROC_SERVER = 1
#wbemFlagReturnImmediately = 16
#wbemFlagForwardOnly = 32
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly
#WBEM_INFINITE = $FFFFFFFF
#WMISeparator = ","

Procedure StringToBStr(string$)
  Protected Unicode$ = Space(StringByteLength(string$, #PB_Unicode) + 1)
  Protected bstr_string.l
  PokeS(@Unicode$, String$, -1, #PB_Unicode)
  bstr_string = SysAllocString_(@Unicode$)
  ProcedureReturn bstr_string
EndProcedure

Procedure.s UniToPB(*Unicode)
  ProcedureReturn PeekS(*Unicode, #PB_Any, #PB_Unicode)
EndProcedure


Global txt$, loc.IWbemLocator, svc.IWbemServices, pEnumerator.IEnumWbemClassObject, pclsObj.IWbemClassObject, x.Variant, error.l
Global NewList wmidata.s()

ProcedureDLL.s wmi_release(dumdum$)
  ;- WMI Release
  svc\release()
  loc\release()
  pEnumerator\release()
  If error=0
    pclsObj\release()
  EndIf
  CoUninitialize_()
  If FindString(dumdum$, "ERROR", 1)
    MessageRequester("", dumdum$)
    End
  EndIf
EndProcedure

ProcedureDLL.s wmi_init()
  ;- WMI Initialize
  txt$=""
  CoInitializeEx_(0,#COINIT_MULTITHREAD)
  hres=CoInitializeSecurity_(0, -1,0,0,#RPC_C_AUTHN_LEVEL_CONNECT,#RPC_C_IMP_LEVEL_IDENTIFY,0,#EOAC_NONE,0)
  If hres <> 0: txt$="ERROR: unable To call CoInitializeSecurity": wmi_release(txt$): EndIf
  hres=CoCreateInstance_(?CLSID_WbemLocator,0,#CLSCTX_INPROC_SERVER,?IID_IWbemLocator,@loc.IWbemLocator)
  If hres <> 0: txt$="ERROR: unable To call CoCreateInstance": wmi_release(txt$): EndIf
  hres=loc\ConnectServer(StringToBStr("root\cimv2"),0,0,0,0,0,0,@svc.IWbemServices)
  If hres <> 0: txt$="ERROR: unable To call IWbemLocator::ConnectServer": wmi_release(txt$): EndIf
  hres=svc\queryinterface(?IID_IUnknown,@pUnk.IUnknown)
  hres=CoSetProxyBlanket_(svc,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE)
  If hres <> 0: txt$="ERROR: unable To call CoSetProxyBlanket": wmi_release(txt$): EndIf
  hres=CoSetProxyBlanket_(pUnk,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE)
  If hres <> 0: txt$="ERROR: unable To call CoSetProxyBlanket": wmi_release(txt$): EndIf
  pUnk\release()
  ProcedureReturn txt$
EndProcedure

ProcedureDLL.s WMI_Call(WMISelect.s, WMICommand.s)
  ;- Call Data
  error=0
  WMICommand=WMISelect+","+WMICommand
  ClearList(wmidata())
  k=CountString(WMICommand,#WMISeparator)
  Dim wmitxt$(k)
  For i=0 To k
    wmitxt$(i) = Trim(StringField(WMICommand,i+1,#WMISeparator))
  Next

  hres=svc\ExecQuery(StringToBStr("WQL"),StringToBStr(wmitxt$(0)), #IFlags,0,@pEnumerator.IEnumWbemClassObject)
  If hres <> 0: txt$="ERROR: unable To call IWbemServices::ExecQuery": wmi_release(txt$): EndIf
  hres=pEnumerator\reset()
  Repeat
    hres=pEnumerator\Next(#WBEM_INFINITE, 1, @pclsObj.IWbemClassObject, @uReturn)
    For i=1 To k
      Sleep_(0)
      If uReturn <> 0

        hres=pclsObj\get(StringToBStr(wmitxt$(i)), 0, @x.Variant, 0, 0)

        type=x\vt

        Select type

          Case 8200
            val.s=""
            nDim=SafeArrayGetDim_(x\lVal)
            SafeArrayGetUBound_(x\lVal, nDim, @plUbound)
            For z=0 To plUbound
              SafeArrayGetElement_(x\lVal, @z, @rgVar)
              val.s=val.s+", "+UniToPB(rgVar)
            Next
            val.s=Mid(val.s, 3, Len(val.s))

          Case 8195
            val.s=""
            nDim=SafeArrayGetDim_(x\scode)
            SafeArrayGetUBound_(x\scode, nDim, @plUbound)
            For z=0 To plUbound
              SafeArrayGetElement_(x\scode, @z, @rgVar)
              val.s=val.s + ", " +  Str(rgVar)
            Next
            val.s=Mid(val.s, 3, Len(val.s))

          Case 11
            If x\boolVal=0
              val.s="FALSE"
            ElseIf x\boolVal=-1
              val.s="TRUE"
            EndIf

          Case 8
            val.s=UniToPB(x\bstrVal)

          Case 3
            val.s=Str(x\lVal)

          Case 1
            val.s="n/a"

          Default
            val.s=""

        EndSelect

        If FindString(wmitxt$(i), "Date", 1) Or FindString(wmitxt$(i), "Time", 1)
          AddElement(wmidata())
          wmidata()=Mid(val, 7, 2)+"."+Mid(val, 5, 2)+"."+Mid(val, 1, 4)+" "+Mid(val, 9, 2)+":"+Mid(val, 11,2)+":"+Mid(val, 13,2) ;+Chr(10)+Chr(13)
        Else
          AddElement(wmidata())
          wmidata()=Trim(val) ;+Chr(10)+Chr(13)
        EndIf
      EndIf
    Next

  Until uReturn = 0
  If CountList(wmidata())=0
    For i=1 To k
      AddElement(wmidata())
      wmidata()="n/a"
    Next
    error=1
  EndIf
  ProcedureReturn wmidata()
EndProcedure

;- Data Section
DataSection
  CLSID_IEnumWbemClassObject:
  ;1B1CAD8C-2DAB-11D2-B604-00104B703EFD
  Data.l $1B1CAD8C
  Data.w $2DAB, $11D2
  Data.b $B6, $04, $00, $10, $4B, $70, $3E, $FD
  IID_IEnumWbemClassObject:
  ;7C857801-7381-11CF-884D-00AA004B2E24
  Data.l $7C857801
  Data.w $7381, $11CF
  Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
  CLSID_WbemLocator:
  ;4590f811-1d3a-11d0-891f-00aa004b2e24
  Data.l $4590F811
  Data.w $1D3A, $11D0
  Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24
  IID_IWbemLocator:
  ;dc12a687-737f-11cf-884d-00aa004b2e24
  Data.l $DC12A687
  Data.w $737F, $11CF
  Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
  IID_IUnknown:
  ;00000000-0000-0000-C000-000000000046
  Data.l $00000000
  Data.w $0000, $0000
  Data.b $C0, $00, $00, $00, $00, $00, $00, $46

EndDataSection

Re: usberkennung

Verfasst: 24.04.2010 18:41
von HeX0R
Das erscheint mir auch ein ziemlich unkonventioneller Weg zu sein...

Ich würde:
  • Am Start alle USB-Devices auflisten (evtl. taugt diese wmi.pbi dazu, ich hab es nicht probiert, aber dafür den Original-Beitrag gefunden, den man in solchen Fällen eher verwenden sollte, als den Code)
  • Und dann im Window-Callback auf #WM_DEVICECHANGE reagieren.
    Siehe hierzu dann #DBT_DEVICEARRIVAL und #DBT_DEVICEREMOVECOMPLETE (einfach die Boardsuche oder Google damit füttern).

Re: usberkennung

Verfasst: 24.04.2010 19:37
von deify
danke! ich werde mal schauen was ich rausbekomme :D

Re: usberkennung

Verfasst: 25.04.2010 14:57
von deify
hey :)

also ich hab das etzt nochmal probiert und habe beim erkennen, dass der stick eingefügt worden ist gleich den serial mit erkennen lasse! danach gleich die wmi durchlaufen lassen und mit dem debugger geschaut ob irgendeine volumeserials übereinstimmt!

tuts aber leider nicht ): hat jemand ne idee wo das problem ist? oder wie ich sonst mit hilfe der wmifunktionen das laufwerk identifizeren kann? (driveletter geht nicht... lieferr \\.\PhysicalDrive2 oder so zurück anstatt E:\)

hier die seite welche rückgabewerte unterstütz werden!
http://msdn.microsoft.com/en-us/library ... 85%29.aspx


hier mein code :D

Code: Alles auswählen

IncludeFile "wmi.pbi"

Structure device
  serial.l
  DriveLetter.s
  InterfaceType.s
  Model.s
  PNPDeviceID.s
  MediaType.s
  Name.s
  Size.i
EndStructure

Global NewList deviceList.device()

Procedure usb(x)
  WMI_Init()
  WMI_Call("SELECT * FROM Win32_DiskDrive", "InterfaceType, Model, PNPDeviceID, MediaType, Name, Size, VolumeSerialNumber")
    ResetList(wmidata())
    device = 0
    While NextElement(wmidata())  ; Wert 1
      deviceList()\InterfaceType = wmidata()
      
      NextElement(wmidata())     ; Wert 2
      deviceList()\Model = wmidata()
      Debug wmidata()
     
      NextElement(wmidata())     ; Wert 3
      deviceList()\PNPDeviceID = wmidata()
          
     
      NextElement(wmidata())     ; Wert 4
      deviceList()\MediaType = wmidata()
     
      NextElement(wmidata())     ; Wert 5
      deviceList()\Name = wmidata()
     
      NextElement(wmidata())     ; Wert 6
      deviceList()\Size = (ValF(wmidata()) / 1024) / 1024      
      
      NextElement(wmidata())
      Debug wmidata()
    Wend
    
EndProcedure
 
 Procedure.s GetDevice(Bits)
  For i = 'A' To 'Z'
    If Bits & 1 = 1
      Laufwerk.s = Chr(i)
    EndIf
    Bits = Bits >> 1
  Next
  ProcedureReturn Laufwerk
EndProcedure

Procedure CB(hwnd,msg,wParam,lParam)

  Protected *db.DEV_BROADCAST_HDR
  Protected *dbv.DEV_BROADCAST_VOLUME
  If msg = #WM_DEVICECHANGE
    Select wParam
      Case #DBT_DEVICEARRIVAL       
       
        *db = lParam
       
        If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
          *dbv = *db
          Name.s = Space(256)
          serial.l = 0
          Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
          GetVolumeInformation_(Laufwerk, @Name, 255, @serial, 0, 0, @fType, 255)
          Debug Str(serial)+" insert"
          AddElement(deviceList())
          deviceList()\DriveLetter = Laufwerk
          deviceList()\serial = serial
          CreateThread(@usb(),0)
        EndIf
       
      Case #DBT_DEVICEREMOVECOMPLETE
       
        *db = lParam
       
        If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
          *dbv = *db
          Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
          Debug "removed"
        EndIf
       
    EndSelect
    ProcedureReturn 1
  EndIf

  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure  



  If OpenWindow(0, 100, 100, 700, 300, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 690, 290, "Interface Type", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 2, "Model",100)
   AddGadgetColumn(0, 3, "PNP Device-ID",100)
   AddGadgetColumn(0, 4, "Media Type",100)
   AddGadgetColumn(0, 5, "Name",100)
   AddGadgetColumn(0, 6, "Size",100)
   AddGadgetColumn(0, 7, "Status",86)
   SetWindowCallback(@CB(),0)
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
   Exit = #True
 EndIf

Re: usberkennung

Verfasst: 27.04.2010 16:40
von deify
Also ich habs über CoMate geschafft! danke trotzdem!