Re: retrieve harddisk`s modell,serial,firmware (Windows only
Posted: Thu Mar 21, 2013 4:58 pm
You have to add the following line to above the function call
Declare SNHDD(CurrentDrive, File$)
Declare SNHDD(CurrentDrive, File$)
http://www.purebasic.com
https://www.purebasic.fr/english/
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
This should work.doctorized wrote:Is there a code that supports usb disk drives?
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()
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.Thunder93 wrote:This should work.![]()
Code: Select all
.......
Take a look here: http://loggialogic.blogspot.gr/2012/03/ ... usb30.htmlThunder93 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.
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".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.
In my case, a docking station is used. I have a WD10EARS plugged in.Thunder93 wrote:I don't have an external Western Digital HDD near, but I do have other externals HDD. The information is exact still!
Code: Select all
Drive L: is a
USB Device
ProductID=External
ProductRevision=2.10
VendorID=Generic
Serial=WD-WCAV5H710181
Code: Select all
strDrive.s="\\.\" + Chr(64+Drives) + ":"
Code: Select all
strDrive.s="\\.\PhysicalDrive" + Str(Drives)
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.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.