http://www.purebasic.fr/english/viewtop ... 99&start=0 ,
here is another method to find more infos about your devices(Disk's).
Works only Win2k, XP and Vista , also in Usermode (no admin rights).
Code: Select all
Structure STORAGE_PROPERTY_QUERY
    PropertyId.l;STORAGE_PROPERTY_ID
    QueryType.l;STORAGE_QUERY_TYPE
    AdditionalParameters.l
EndStructure
Structure STORAGE_DEVICE_DESCRIPTOR
    Version.l
    Size.l;                                    As Long
    DeviceType.b;                              As Byte
    DeviceTypeModifier.b;                      As Byte
    RemovableMedia.b;                          As Byte
    CommandQueueing.b;                         As Byte
    VendorIdOffset.l;                          As Long
    ProductIdOffset.l;                         As Long
    ProductRevisionOffset.l;                   As Long
    SerialNumberOffset.l;                      As Long
    BusType.w;                                 As Integer
    RawPropertiesLength.l;                     As Long
    RawDeviceProperties.b;                     As Byte
    Reserved.b[1024]
EndStructure
    #BusTypeUnknown = 0
    #BusTypeScsi=1
    #BusTypeAtapi=2
    #BusTypeAta=3
    #BusType1394=4
    #BusTypeSsa=5
    #BusTypeFibre=6
    #BusTypeUsb=7
    #BusTypeRAID=8
    #BusTypeMaxReserved = $7F
    
#IOCTL_STORAGE_QUERY_PROPERTY  = $2D1400
Procedure.l Hex2Dec(h$)
  h$=UCase(h$)
  For r=1 To Len(h$)
    d<<4 : a$=Mid(h$,r,1)
    If Asc(a$)>60
      d+Asc(a$)-55
    Else
      d+Asc(a$)-48
    EndIf
  Next
  ProcedureReturn d
EndProcedure 
OpenConsole()
 PrintN("Enumerate devices")
 For Drives=1 To 26
 
  strDrive.s="\\.\" + Chr(64+Drives) + ":"
  
  hDrive = CreateFile_(strDrive, 0,#FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
  If hDrive<>-1
  
   PrintN("--------------------------------------------------")
   udtQuery.STORAGE_PROPERTY_QUERY
   udtOut.STORAGE_DEVICE_DESCRIPTOR
   ;clear advanced Info....
   For p=0 To 1023
    udtOut\Reserved[p]=0
   Next p 
   lngResult = DeviceIoControl_(hDrive, #IOCTL_STORAGE_QUERY_PROPERTY, udtQuery,SizeOf(udtQuery), @udtOut, SizeOf(udtout), @dwOutBytes, 0)
   If lngResult 
    PrintN("Drive " + Chr(64+Drives) + ": is a ")
    Select(udtOut\Bustype) 
     Case     #BusTypeUnknown 
     Case #BusTypeScsi
      PrintN(" SCSI Device")
     Case #BusTypeAtapi
      PrintN(" Atapi Device")
     Case #BusTypeAta
      PrintN(" Ata Device")
     Case #BusType1394
     Case #BusTypeSsa
     Case #BusTypeFibre
     Case #BusTypeUsb
      PrintN(" USB Device")
     Case #BusTypeRAID
     Case #BusTypeMaxReserved 
     Default
     PrintN("Bustype=" + Str(udtOut\BusType))
    EndSelect
    If udtout\RemovableMedia
     PrintN("Device is Removable Media")
    EndIf
    If udtOut\ProductIdOffset > 0
     PrintN("ProductID=" + PeekS(@udtOut + udtOut\ProductIdOffset))
    EndIf
    If udtOut\ProductRevisionOffset > 0
     PrintN("ProductRevision=" + PeekS(@udtOut +  udtOut\ProductRevisionOffset))
    EndIf
    If udtOut\VendorIdOffset  > 0
     PrintN("VendorID=" + PeekS(@udtOut +  udtOut\VendorIdOffset ))
    EndIf
    If udtOut\SerialNumberOffset  > 0
     SerialNumber.s=PeekS(@udtOut +  udtOut\SerialNumberOffset )
     ;Now convert into readable format, coz its encrypted in HEX-Ascii
     sdummy.s=""
     For t=1 To Len(SerialNumber) Step 2
        sdummy + Chr(Hex2Dec(Mid(SerialNumber,t,2)))
     Next t 
     PrintN("SerialNumber=" + sdummy)
    EndIf
     
   Else
    PrintN("No Device-IO info available.. for "+Chr(64+Drives) + ":")
   EndIf
  EndIf
  CloseHandle_(hDrive)
 Next Drives
 
wait.s=Input()
CloseConsole()





