Seriennummer von meinem USB-Stick auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Seriennummer von meinem USB-Stick auslesen

Beitrag von Rudi »

Hier gibt es noch etwas, nicht nur zum Seriennummer auslesen.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
deify
Beiträge: 141
Registriert: 29.03.2010 22:01
Computerausstattung: Win7 64bit
AMD Phenom II X4 940
NVIDIA GeForce GTS 250
4GB RAM
Kontaktdaten:

Re: Seriennummer von meinem USB-Stick auslesen

Beitrag von deify »

hab da mal nen code zusammengebastelt gehabt... nicht zu viel erwarten ist von meiner anfangszeit mit pb und da ist bestimmt das ein oder andere unnütz oder nicht so top (:
War dazu geplant den pc zu sperren wenn ein als "Master" gesetzter usbstick entfernt wird ^^ hat auch gut funktioniert, habs leider nichtmehr weitergeführt, weil man den schutz mit dem taskmanager umgehen konnte. Hätte zwar via registry mit XP funktioniert aber vista und 7 haben ja das securitycenter und das habe ich nie wegbekommen (:

hoffe der code hilft dir weiter wenn du noch was brauchst

arbeitet mit winapi und coMate soweit ich das noch durchblicke (:

Code:

Code: Alles auswählen

Enumeration
  #DiskNr
  #List_partition
  #Check_USB
  #Button
EndEnumeration

Enumeration
  #Menu
EndEnumeration

Enumeration
  #Menu_Refresh
  #Menu_Minimize
  #Menu_Exit
EndEnumeration

IncludeFile "COMate.pbi"

Structure PartitionInfo
 
  Partition.s
  DriveLetter.s
  FileSystem.s
  FreeSpace.s
  Size.s
  VolumeName.s
  VolumeSerialNumber.s
  Bootable.l
  BootPartition.l
  PrimaryPartition.l
  Type.s
         
EndStructure

Structure DiskInfo
  DiskNr.s
  PartNr.PartitionInfo
  DeviceID.s
  PNPDeviceID.s
  FirmwareRevision.s
  InterfaceType.s
  MediaType.s
  Model.s
  Status.s
  Name.s
EndStructure

Global NewList masters.s()
Global NewList info.DiskInfo(),Laufwerk.s, Exit = #False,currentid.s = ""
OpenFile(0,GetHomeDirectory()+"\Desktop\usb.log")

Procedure ListSearch(item.s)
  ResetList(masters())
  While NextElement(masters())
    If masters() = item
      ProcedureReturn(#True)
      Break
    EndIf
  Wend 
  ProcedureReturn(#False)
EndProcedure

Procedure Partition_To_DiskDrive(devID.s)
 
  Define.COMateObject objWMIService, USBCfg,EnumUSB
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
    EnumUSBset.COMateEnumObject
    x=0
    EnumUSBset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_DiskDrive Where DeviceID= $0027" + devID +"$0027')")
    If EnumUSBset
      EnumUSB = EnumUSBset\GetNextObject()
      While EnumUSB
        If EnumUSB
          info()\FirmwareRevision=EnumUSB\GetstringProperty("FirmwareRevision")
          info()\InterfaceType=EnumUSB\GetstringProperty("InterfaceType")
          info()\MediaType=EnumUSB\GetstringProperty("MediaType")
          info()\Model=EnumUSB\GetstringProperty("Model")
          info()\PNPDeviceID=EnumUSB\GetstringProperty("PNPDeviceID")
          info()\Status=EnumUSB\GetstringProperty("Status")
          EnumUSB\Release()
          x=x+1
        EndIf
        EnumUSB = EnumUSBset\GetNextObject()
      Wend
      EnumUSBset\Release()
    EndIf
    objWMIService\Release()
  EndIf
   
EndProcedure   

Procedure Win32_DiskDrivePhysicalMedia()

  Define.COMateObject objWMIService, EnumDiskDrive
  EnumDiskDriveset.COMateEnumObject
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
   
    x=0
    EnumDiskDriveset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_DiskDrivePhysicalMedia')")
    If EnumDiskDriveset
     EnumDiskDrive = EnumDiskDriveset\GetNextObject()
     While EnumDiskDrive
        If EnumDiskDrive
          physdrive.l=FindString(EnumDiskDrive\GetstringProperty("Antecedent"),"\\\\.\\PHYSICALDRIVE",1)
          If physdrive
            diskpart.s=RemoveString(Mid(EnumDiskDrive\GetstringProperty("Antecedent"),physdrive,Len("\\\\.\\PHYSICALDRIVE")+2),Chr(34))
            Partition_To_DiskDrive(diskpart)
          EndIf
        EndIf
        EnumDiskDrive = EnumDiskDriveset\GetNextObject()
      Wend
      EnumDiskDriveset\Release()
    EndIf
    objWMIService\Release()
  EndIf

EndProcedure

Procedure.s Diskpartition(diskpart.s)

  found.l= FindString(diskpart,Chr(34),1)
  ProcedureReturn  Mid(diskpart,found,Len(diskpart)-found+1)
 
EndProcedure

Procedure LogicalDiskToPartition(antecedent.s)

  Define.COMateObject objWMIService, EnumLDisk
  EnumLDiskset.COMateEnumObject
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
    x=0
    antecedent=ReplaceString(antecedent, "\", "\\")
    EnumLDiskset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_LogicalDiskToPartition Where Antecedent= $0027" + antecedent +"$0027')")
    If EnumLDiskset
      EnumLDisk = EnumLDiskset\GetNextObject()
      While EnumLDisk
        If EnumLDisk
          driveletter.s=EnumLDisk\GetstringProperty("Dependent")
          info()\PartNr\DriveLetter=RemoveString(diskpartition(driveletter),Chr(34))
          EnumLDisk\Release()
        EndIf
        EnumLDisk = EnumLDiskset\GetNextObject()
      Wend
      EnumLDiskset\Release()
    EndIf
    objWMIService\Release()
  EndIf

EndProcedure

Procedure Win32_DiskDriveToDiskPartition()

  Define.COMateObject objWMIService, EnumDisk
  EnumDiskset.COMateEnumObject
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
    x=0
    EnumDiskset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_DiskDriveToDiskPartition')"); Where DeviceID= $0027" + devID +"$0027')")
    If EnumDiskset
      EnumDisk = EnumDiskset\GetNextObject()
      While EnumDisk
        If EnumDisk
          AddElement(Info())
          diskpart.s=  EnumDisk\GetstringProperty("Dependent")
          LogicalDiskToPartition(diskpart)
          diskpartition(diskpart)
          For xx=1 To CountString(diskpartition(diskpart),",")+1
            Ergebnis$ = StringField(diskpartition(diskpart), xx, ",")
            Ergebnis$= RemoveString(Ergebnis$,Chr(34))
            If xx=1
              Info()\DiskNr=Ergebnis$
              If tmp$<>Ergebnis$
                tmp$=Ergebnis$
                diskNr.s=RemoveString(tmp$,"Disk #")
              EndIf
              y=x
            Else
              Info()\PartNr\Partition=Ergebnis$
              y=x
              x=x+1
            EndIf     
          Next
          physdrive.l=FindString(EnumDisk\GetstringProperty("Antecedent"),"\\\\.\\PHYSICALDRIVE",1)
          If physdrive
            diskpart.s=RemoveString(Mid(EnumDisk\GetstringProperty("Antecedent"),physdrive,Len("\\\\.\\PHYSICALDRIVE")+2),Chr(34))
            If tmpdisk$<>diskpart
              tmpdisk$=diskpart
              Info()\DeviceID=EnumDisk\GetstringProperty("Antecedent")
              Partition_To_DiskDrive(diskpart)
            EndIf
          EndIf
        EndIf
        EnumDisk = EnumDiskset\GetNextObject()
      Wend
      EnumDiskset\Release()
    EndIf
    objWMIService\Release()
  EndIf

EndProcedure

Procedure Win32_DiskPartition(DeviceID.s)


  Define.COMateObject objWMIService, EnumPart
  EnumPartset.COMateEnumObject
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
    x=0
    EnumPartset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_DiskPartition Where DeviceID= $0027" + DeviceID +"$0027')")
    If EnumPartset
      EnumPart = EnumPartset\GetNextObject()
      While EnumPart
        If EnumPart
          Info()\PartNr\Bootable=EnumPart\GetIntegerProperty("Bootable")
          Info()\PartNr\BootPartition=EnumPart\GetIntegerProperty("BootPartition")
          Info()\PartNr\PrimaryPartition=EnumPart\GetIntegerProperty("PrimaryPartition")
          Info()\PartNr\Type=EnumPart\GetstringProperty("Type")
        EndIf
        EnumPart = EnumPartset\GetNextObject()
      Wend
      EnumPartset\Release()
    EndIf
    objWMIService\Release()
  EndIf

EndProcedure

Procedure.s DiskSpace(strval.s)
 
  Protected lpTotalNumberOfBytes.q, res.f, CapStr.s
 
  lpTotalNumberOfBytes=ValQ(strval.s)
  res=  lpTotalNumberOfBytes/(1024*1024*1024)
  CapStr= StrD(res,2)
  ProcedureReturn CapStr

EndProcedure

Procedure Win32_LogicalDisk(Driveletter.s)

  Define.COMateObject objWMIService, EnumDrive
  EnumDriveset.COMateEnumObject
  strComputer.s = "."
  objWMIService = COMate_GetObject("winmgmts:\\" + strComputer + "\root\cimv2", "")
  If objWMIService
    x=0
    EnumDriveset = objWMIService\CreateEnumeration("ExecQuery('Select * From Win32_LogicalDisk Where Caption= $0027" + Driveletter +"$0027')")
    If EnumDriveset
      EnumDrive = EnumDriveset\GetNextObject()
      While EnumDrive
        If EnumDrive
          Info()\PartNr\FileSystem=EnumDrive\GetstringProperty("FileSystem")
          Info()\PartNr\FreeSpace=DiskSpace(EnumDrive\GetstringProperty("FreeSpace"))
          Info()\PartNr\Size=DiskSpace(EnumDrive\GetstringProperty("Size"))
          Info()\PartNr\VolumeName=EnumDrive\GetstringProperty("VolumeName")
          Info()\PartNr\VolumeSerialNumber= EnumDrive\GetstringProperty("VolumeSerialNumber")
        EndIf
        EnumDrive = EnumDriveset\GetNextObject()
      Wend
      EnumDriveset\Release()
    EndIf
    objWMIService\Release()
  EndIf

EndProcedure

Procedure listFilesByLetter(dl)
  Protected Name.s = Space(256)
  ClearList(Info())
  Win32_DiskDriveToDiskPartition()
  ResetList(Info())
   While NextElement(Info())
    If dl = 0
       If Info()\PartNr\Driveletter = Left(Laufwerk,2)
          GetVolumeInformation_(info()\PartNr\DriveLetter, @Name, 255,0,0,0,0,0)
          info()\Name = name  
          currentid = info()\PNPDeviceID
          For i = 0 To CountGadgetItems(0)
            If GetGadgetItemText(0,i,0) <> info()\PartNr\DriveLetter
              If GetGadgetItemText(0,i,0) > info()\PartNr\DriveLetter 
                AddGadgetItem(0,i,info()\PartNr\DriveLetter + Chr(10) + info()\Name + Chr(10) + info()\InterfaceType + Chr(10) + info()\Model + Chr(10) + info()\PNPDeviceID + Chr(10) + info()\MediaType)
                WriteStringN(0,"Insert Device @ "+FormatDate("%dd.%mm.%yyyy  %hh:%ii:%ss",Date())+":   "+info()\PartNr\DriveLetter + "   " + info()\Name + "   " + info()\InterfaceType + "   " + info()\Model + "   " + info()\PNPDeviceID + "   " + info()\MediaType)
                Break
              ElseIf i = CountGadgetItems(0) And GetGadgetItemText(0,i,0) <> info()\PartNr\DriveLetter
                AddGadgetItem(0,-1,info()\PartNr\DriveLetter + Chr(10) + info()\Name + Chr(10) + info()\InterfaceType + Chr(10) + info()\Model + Chr(10) + info()\PNPDeviceID + Chr(10) + info()\MediaType)
                WriteStringN(0,"Insert Device @ "+FormatDate("%dd.%mm.%yyyy  %hh:%ii:%ss",Date())+":   "+info()\PartNr\DriveLetter + "   " + info()\Name + "   " + info()\InterfaceType + "   " + info()\Model + "   " + info()\PNPDeviceID + "   " + info()\MediaType)
                Break
              EndIf
              Delay(10)
            Else
              Break
            EndIf
          Next
         Break
       EndIf
       Delay(10)
     Else
      If CountGadgetItems(0) = 0
        GetVolumeInformation_(info()\PartNr\DriveLetter, @Name, 255,0,0,0,0,0)
        info()\Name = name
        AddGadgetItem(0,-1,info()\PartNr\DriveLetter + Chr(10) + info()\Name + Chr(10) + info()\InterfaceType + Chr(10) + info()\Model + Chr(10) + info()\PNPDeviceID + Chr(10) + info()\MediaType)
      Else
        For i = 0 To CountGadgetItems(0)
          If GetGadgetItemText(0,i,0) <> info()\PartNr\DriveLetter
            GetVolumeInformation_(info()\PartNr\DriveLetter, @Name, 255,0,0,0,0,0)
            info()\Name = name
            If GetGadgetItemText(0,i,0) > info()\PartNr\DriveLetter 
              AddGadgetItem(0,i,info()\PartNr\DriveLetter + Chr(10) + info()\Name + Chr(10) + info()\InterfaceType + Chr(10) + info()\Model + Chr(10) + info()\PNPDeviceID + Chr(10) + info()\MediaType)
              Break
            ElseIf i = CountGadgetItems(0) 
              AddGadgetItem(0,-1,info()\PartNr\DriveLetter + Chr(10) + info()\Name + Chr(10) + info()\InterfaceType + Chr(10) + info()\Model + Chr(10) + info()\PNPDeviceID + Chr(10) + info()\MediaType)
              Break
            EndIf 
            Delay(10)
          Else
            Break
          EndIf
        Next
      EndIf
      Delay(10)
     EndIf  
   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
          Laufwerk = GetDevice(*dbv\dbcv_unitmask) + ":\"
          thread = CreateThread(@listFilesByLetter(),0)
          If ListSearch(currentid) = #True And currentid <> ""
            BlockInput_(#False)
          EndIf 
        EndIf
       
      Case #DBT_DEVICEREMOVECOMPLETE
       
        *db = lParam
       
        If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
          *dbv = *db
          Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
           For i=0 To CountGadgetItems(0)
             If GetGadgetItemText(0,i,0) = Left(Laufwerk,2) And Not ListSearch(GetGadgetItemText(0,i,4))
                WriteStringN(0,"Removed Device @ "+FormatDate("%dd.%mm.%yyyy  %hh:%ii:%ss",Date())+":   "+ GetGadgetItemText(0,i,0) + "   " + GetGadgetItemText(0,i,1)+ "   "+ GetGadgetItemText(0,i,2)+ "   " + GetGadgetItemText(0,i,3)+ "   " + GetGadgetItemText(0,i,4)+ "   " + GetGadgetItemText(0,i,5))
                RemoveGadgetItem(0,i)
              ElseIf ListSearch(GetGadgetItemText(0,i,4)) = #True And currentid <> ""
                WriteStringN(0,"Removed Master (lock pc) @ "+FormatDate("%dd.%mm.%yyyy  %hh:%ii:%ss",Date()))
                RemoveGadgetItem(0,i)
                BlockInput_(#True)
             EndIf
           Next
        EndIf
       
    EndSelect
    ProcedureReturn 1
  EndIf

  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure  

If OpenWindow(0, 100, 100, 700, 350, "USB Recognition", #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_Invisible)
   ListIconGadget(0, 0, 0, 700, 300, "Drive Letter", 116, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 1, "Name",116)
   AddGadgetColumn(0, 2, "Interface Type",116)
   AddGadgetColumn(0, 3, "Model",116)
   AddGadgetColumn(0, 4, "PNP Device-ID",116)
   AddGadgetColumn(0, 5, "Media Type",116)
   ButtonGadget(#Button,290,310,120,30,"Set device as master")
   CreateThread(@listFilesByLetter(),1)
   SetWindowCallback(@CB(),0)
   
   hIcon1 = LoadIcon_(0, #IDI_APPLICATION)
   hidden = 1
 
    AddSysTrayIcon(1, WindowID(0), hIcon1)
    SysTrayIconToolTip(1, "USB Recognition")
  
    If CreatePopupMenu(#Menu)
      MenuItem(#Menu_Refresh, "Refresh")
      MenuItem(#Menu_Minimize,"Maximize Window")
      MenuBar()
      MenuItem(#Menu_Exit, "Exit")
    EndIf
    
   Repeat
    Event = WaitWindowEvent()
   
    Select Event
      Case #PB_Event_SysTray
        If EventType() = #PB_EventType_LeftClick Or EventType() = #PB_EventType_RightClick
          DisplayPopupMenu(#Menu, WindowID(0))
        EndIf
     
      Case #PB_Event_Menu
        Select EventMenu()
          Case #Menu_Refresh
            If hidden = 0 And Not IsThread(refresh)
              ClearGadgetItems(0)
              refresh = CreateThread(@listFilesByLetter(),1)
            EndIf
          Case #Menu_Minimize
            If hidden = 0
              HideWindow(0,1)
              SetMenuItemText(#Menu,#Menu_Minimize,"Maximize window")
              hidden = 1
            Else
              HideWindow(0,0)
              SetMenuItemText(#Menu,#Menu_Minimize,"Minimize to tray")
              hidden = 0
            EndIf
          Case #Menu_Exit
            exit = #True  
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Button
            For i = 0 To CountGadgetItems(0)
              If GetGadgetItemState(0,i) = #PB_ListIcon_Selected
                WriteStringN(0,"Device: "+GetGadgetItemText(0,i,1)+" ("+GetGadgetItemText(0,i,4)+")   Set As Master@ "+FormatDate("%dd.%mm.%yyyy  %hh:%ii:%ss",Date()))            
                AddElement(masters())
                masters() = GetGadgetItemText(0,i,4)
                If masters() = ""
                  DeleteElement(masters())
                EndIf
              EndIf
            Next
        EndSelect
      Case #PB_Event_CloseWindow
        HideWindow(0,1)
        SetMenuItemText(#Menu,#Menu_Minimize,"Maximize window")
        hidden = 1
       
    EndSelect
   
  Until exit
 EndIf
mfg deify
Windows 7 | 64bit | PureBasic 4.51 (x64/x86)
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Seriennummer von meinem USB-Stick auslesen

Beitrag von Velindos »

Hallo,
danke für deinen Tip und Source. Werde mich mal durchlesen und das Thema weiterverfolgen!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten