retrieve harddisk`s modell,serial,firmware (Windows only)

Share your advanced PureBasic knowledge/code with the community.
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

You have to add the following line to above the function call

Declare SNHDD(CurrentDrive, File$)
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

Exa..

Code: Select all

If Path$ = ""
  Path$ = "C:\HDD.txt"
EndIf 

Declare SNHDD(CurrentDrive, File$) ;<------ Added

If Val(Fonction$) = 1 
  SNHDD (mvarCurrentDrive, Path$)
Else
  End -2
EndIf
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
ricky
New User
New User
Posts: 8
Joined: Fri Sep 07, 2012 9:27 am
Location: Suisse

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by ricky »

Thanks a lot.
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Is there a code that supports usb disk drives?
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

doctorized wrote:Is there a code that supports usb disk drives?
This should work. :)

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

Structure MEDIA_SERIAL_NUMBER_DATA
  SerialNumberLength.l
  Result.l
  Reserved.l[2]
  Serial.b[1000]
EndStructure : Global USBDevice.MEDIA_SERIAL_NUMBER_DATA

#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
#IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER = $2D0C10 ;2952208

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
     IsUSB.b = 0
    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")
       IsUSB = 1
     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 )
     Serial.s = Trim(PeekS(@udtOut + udtOut\SerialNumberOffset) )
     PrintN("Serial=" + Serial)     
   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()
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Thunder93 wrote:This should work. :)

Code: Select all

.......
The code is giving correctly the drive's serial but the name is not correct. I have a WD external disk and ProductID is "External". Other programs return it correctly (WDC WD......). I also noticed that the serial numbers for the internal drives are the ascii codes of the letters in hex. The same does WMI. So, it seems that WMI is responding to #IOCTL_STORAGE_QUERY_PROPERTY. I would like something else.
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

The names shows correctly for me.

The Western Digital hard drives not suppose to return WDC.. for ProductID. Just seeing it begin with WD.. is correct. The other programs are combining fields.

Here is my return for C drive.

Enumerate devices
--------------------------------------------------
Drive C: is a
SATA Device
ProductID=WD15EARS-60MVWB0
ProductRevision=51.0
VendorID=WDC
Serial=WD-WCAZA5043287
--------------------------------------------------


... and this is exactly correct returns.
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Thunder93 wrote:The names shows correctly for me.

The Western Digital hard drives not suppose to return WDC.. for ProductID. Just seeing it begin with WD.. is correct. The other programs are combining fields.

Here is my return for C drive.

Enumerate devices
--------------------------------------------------
Drive C: is a
SATA Device
ProductID=WD15EARS-60MVWB0
ProductRevision=51.0
VendorID=WDC
Serial=WD-WCAZA5043287
--------------------------------------------------


... and this is exactly correct returns.
Take a look here: http://loggialogic.blogspot.gr/2012/03/ ... usb30.html
the page is in Japanese but look at the picture. WDC is always there in the beginning and it is treated as VendorID.
It is not vendor and Product ID. It is the model number that comes from the drive via #DFP_RECEIVE_DRIVE_DATA.
Last edited by doctorized on Sun Sep 07, 2014 10:49 am, edited 1 time in total.
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

Yes but like I said.. The other programs are combining fields to give you that. The 'ProductID' for the hard drive doesn't begin with WDC, it begins with WD.
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

Btw; already with CrystalDiskInfo. CrystalDiskInfo confirms my other results.
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Thunder93 wrote:Yes but like I said.. The other programs are combining fields to give you that. The 'ProductID' for the hard drive doesn't begin with WDC, it begins with WD.
I have a code that reads the info from internal drives. I do no combination. I just call #DFP_RECEIVE_DRIVE_DATA and in the model number I get "WDC WD.....". Maybe the combination is done by the call. But it is not the point. The point is that you get WD15EARS in the productID (as it is internal drive) and I am taking just "External".
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

I don't have an external Western Digital HDD near, but I do have other externals HDD. The information is exact still!
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Thunder93 wrote:I don't have an external Western Digital HDD near, but I do have other externals HDD. The information is exact still!
In my case, a docking station is used. I have a WD10EARS plugged in.

EDIT: this is what I get:

Code: Select all

Drive L: is a 
 USB Device
ProductID=External        
ProductRevision=2.10
VendorID=Generic 
Serial=WD-WCAV5H710181
I get the same if I change:

Code: Select all

strDrive.s="\\.\" + Chr(64+Drives) + ":"
to:

Code: Select all

strDrive.s="\\.\PhysicalDrive" + Str(Drives)
But CrystalDiskInfo says these:
Image
I took a look in CrystalDiskInfo's source code, I am not very familiar with C/C++ but I think that WMI is used, without being very sure for this.
User avatar
Thunder93
Addict
Addict
Posts: 1788
Joined: Tue Mar 21, 2006 12:31 am
Location: Canada

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by Thunder93 »

I fetched my external WD My Passport 0820.

PB results:

Drive J: is a
USB Device
ProductID=My Passport 0820
ProductRevision=1007
VendorID=WD
Serial=WX91A9332589


However CrystalDiskInfo shows for serial WD-WX91A9332589

lol.
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley
User avatar
doctorized
Addict
Addict
Posts: 882
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: retrieve harddisk`s modell,serial,firmware (Windows only

Post by doctorized »

Thunder93 wrote:I fetched my external WD My Passport 0820.

PB results:

Drive J: is a
USB Device
ProductID=My Passport 0820
ProductRevision=1007
VendorID=WD
Serial=WX91A9332589


However CrystalDiskInfo shows for serial WD-WX91A9332589

lol.
Your drive is a true external drive. My drive is not. CreateFile_() with "\\.\PhysicalDrive2" gets a handle but I have no idea how to continue.

EDIT: above I wrote serial number for "WDC WD...". My mistake. Model number I wanted to say. Sorry. :oops:
Post Reply