Seite 1 von 1

SN,Type und Firmware der physikalische Festplatte auslesen

Verfasst: 15.10.2006 10:39
von legion
Hallo !
Habe einen Code zum Auslesen der Hardware-SN der Festplatte gebastelt.
Funktioniert und getestet auf Samsung und IBM HD's mit SMART-Funktion.
An einem Programm das die SMART-Version feststellt arbeite ich noch.
Funktioniert leider nicht unter 95/98/ME.

Code: Alles auswählen

;********************************************
;* SN der physikalische Festplatte auslesen *
;* Windows NT/2000/XP und HD mit SMART      *
;* Info to: fremdenlegion[at]gmail.com      * 
;******************************************** 

 #IDENTIFY_BUFFER_SIZE = 512
 #SMART_RCV_DRIVE_DATA = $0007C088
 #SMART_RCV_OUT_BUFFER_SIZE = 528
 
 Structure TIDERegs 
     bFeaturesReg.b          
     bSectorCountReg.b       
     bSectorNumberReg.b       
     bCylLowReg.b             
     bCylHighReg.b            
     bDriveHeadReg.b          
     bCommandReg.b            
     bReserved.b              
 EndStructure

 Structure TSendCmdInParams 
    cBufferSize.l               
    irDriveRegs.TIDERegs    
    bDriveNumber.b            
    bReserved.b[3]
    dwReserved.l[4]
    bBuffer.b[1]            
 EndStructure
  
  Structure TDriverStatus
    bDriverError.b
    bIDEStatus.b
    bReserved.b[2]
    dwReserved.l[2]
  EndStructure


  Structure TSendCmdOutParams
    cBufferSize.l
    DriverStatus.TDriverStatus
    bBuffer.b[1]
  EndStructure
  
   cbBytesReturned.l
   IP.TSendCmdInParams
   Dim aIdOutCmd.b(SizeOf(TSendCmdOutParams) + #IDENTIFY_BUFFER_SIZE - 1)  

   ;\\.\PhysicalDrive0 ist die erste physikalische Festplatte
   hDevice = CreateFile_("\\.\PhysicalDrive0", #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, 0, 0)
   If hDevice = INVALID_HANDLE_VALUE 
    MessageRequester("Fehler", "HD-Zugriff fehlgeschlagen !")
    Goto Exit
   EndIf

   cbBytesReturned = 0
   IP\cBufferSize = #IDENTIFY_BUFFER_SIZE
   IP\irDriveRegs\bSectorCountReg = 1
   IP\irDriveRegs\bSectorNumberReg = 1
   IP\irDriveRegs\bDriveHeadReg = $A0
   IP\irDriveRegs\bCommandReg = $EC  ;SMART HD Info
   
   If DeviceIoControl_(hDevice, #SMART_RCV_DRIVE_DATA, @IP, SizeOf(TSendCmdInParams) - 1, @aIdOutCmd(), #SMART_RCV_OUT_BUFFER_SIZE, @cbBytesReturned, #Null) = 0                           
    MessageRequester("Fehler", "SMART-Zugriff fehlgeschlagen !")
    CloseHandle_(hDevice)
    Goto Exit
   EndIf
   
   ;Die Byteorder muß korr. werden
   Dim CorrBuffer.b(19)
   For i = 0 To 19 Step 2
    CorrBuffer(i) = aIdOutCmd(36+i+1)
   Next i
   For i = 1 To 19 Step 2
    CorrBuffer(i) = aIdOutCmd(36+i-1)
   Next i   
   *PCorrBuffer = @CorrBuffer()
   MessageRequester("HD-Info", "HD_Serial: " + RTrim(PeekS(@CorrBuffer())))
   CloseHandle_(hDevice)
   exit:
   
   End


Verfasst: 15.10.2006 11:08
von HeX0R
Ich finde deine Beiträge sehr nützlich, aber sie wären noch sehr viel benutzerfreundlicher, wenn du sie in Prozeduren packen würdest :allright: .
Also so z.B.:

Code: Alles auswählen

;********************************************
;* SN der physikalische Festplatte auslesen *
;* Windows NT/2000/XP und HD mit SMART      *
;* Info to: fremdenlegion[at]gmail.com      *
;********************************************

#IDENTIFY_BUFFER_SIZE      = 512
#SMART_RCV_DRIVE_DATA      = $0007C088
#SMART_RCV_OUT_BUFFER_SIZE = 528
 
Structure TIDERegs
	bFeaturesReg.b         
	bSectorCountReg.b       
	bSectorNumberReg.b       
	bCylLowReg.b             
	bCylHighReg.b           
	bDriveHeadReg.b         
	bCommandReg.b           
	bReserved.b             
EndStructure

Structure TSendCmdInParams
	cBufferSize.l               
	irDriveRegs.TIDERegs   
	bDriveNumber.b           
	bReserved.b[3]
	dwReserved.l[4]
	bBuffer.b[1]           
EndStructure
 
Structure TDriverStatus
	bDriverError.b
	bIDEStatus.b
	bReserved.b[2]
	dwReserved.l[2]
EndStructure


Structure TSendCmdOutParams
	cBufferSize.l
	DriverStatus.TDriverStatus
	bBuffer.b[1]
EndStructure

Procedure.s GetSerialNumberOfHd(HD.l = 0)
 
	Protected cbBytesReturned.l, IP.TSendCmdInParams, hDevice.l, i.l, Result.s
	Dim aIdOutCmd.b(SizeOf(TSendCmdOutParams) + #IDENTIFY_BUFFER_SIZE - 1) 

	;\\.\PhysicalDrive0 ist die erste physikalische Festplatte
	hDevice = CreateFile_("\\.\PhysicalDrive" + Str(HD), #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, 0, 0)
	If hDevice = INVALID_HANDLE_VALUE
		MessageRequester("Fehler", "HD-Zugriff fehlgeschlagen !")
		ProcedureReturn ""
	EndIf

	cbBytesReturned                 = 0
	IP\cBufferSize                  = #IDENTIFY_BUFFER_SIZE
	IP\irDriveRegs\bSectorCountReg  = 1
	IP\irDriveRegs\bSectorNumberReg = 1
	IP\irDriveRegs\bDriveHeadReg    = $A0
	IP\irDriveRegs\bCommandReg      = $EC  ;SMART HD Info
   
	If DeviceIoControl_(hDevice, #SMART_RCV_DRIVE_DATA, @IP, SizeOf(TSendCmdInParams) - 1, @aIdOutCmd(), #SMART_RCV_OUT_BUFFER_SIZE, @cbBytesReturned, #Null) = 0                           
		MessageRequester("Fehler", "SMART-Zugriff fehlgeschlagen !")
		CloseHandle_(hDevice)
    ProcedureReturn ""
	EndIf
   
	;Die Byteorder muß korr. werden
	Dim CorrBuffer.b(19)
	For i = 0 To 19 Step 2
		CorrBuffer(i) = aIdOutCmd(36+i+1)
	Next i
	For i = 1 To 19 Step 2
		CorrBuffer(i) = aIdOutCmd(36+i-1)
	Next i   
	Result = RTrim(PeekS(@CorrBuffer()))
	CloseHandle_(hDevice)
	
	ProcedureReturn Result
EndProcedure

Debug GetSerialNumberOfHd()

Verfasst: 15.10.2006 11:14
von legion
Da hast du recht !
Aber ich wollte noch einige Funktionen (HD-Type, Anzahl der Sectoren, usw..) hinzupacken bevor ich das machen. Wollte euch den Code bis dahin nicht vorenthalten.

Verfasst: 15.10.2006 14:49
von legion
UPDATE:
Habe jetzt Type und Firmware mit rein genommen und das ganze in Proceduren gepackt. Ausgabe auf Konsole.

Code: Alles auswählen

;**************************************************************
;* SN,Type und Firmware der physikalische Festplatte auslesen *
;* Nur unter Windows NT/2000/XP und HD mit SMART              *
;* Info to: fremdenlegion[at]gmail.com                        * 
;************************************************************** 

 #IDENTIFY_BUFFER_SIZE = 512
 #SMART_RCV_DRIVE_DATA = $0007C088
 #SMART_RCV_OUT_BUFFER_SIZE = 528
 
  Structure TIDERegs 
     bFeaturesReg.b          
     bSectorCountReg.b       
     bSectorNumberReg.b       
     bCylLowReg.b             
     bCylHighReg.b            
     bDriveHeadReg.b          
     bCommandReg.b            
     bReserved.b              
 EndStructure

 Structure TSendCmdInParams 
    cBufferSize.l               
    irDriveRegs.TIDERegs    
    bDriveNumber.b            
    bReserved.b[3]
    dwReserved.l[4]
    bBuffer.b[1]            
 EndStructure
  
  Structure TDriverStatus
    bDriverError.b
    bIDEStatus.b
    bReserved.b[2]
    dwReserved.l[2]
  EndStructure

  Structure TSendCmdOutParams
    cBufferSize.l
    DriverStatus.TDriverStatus
    bBuffer.b[1]
  EndStructure
  
   Global cbBytesReturned.l
   Global IP.TSendCmdInParams  
   Global Dim aIdOutCmd.b(SizeOf(TSendCmdOutParams) + #IDENTIFY_BUFFER_SIZE - 1)
  
  Procedure GetSmartInfo(HD.l = 0)  
   ;\\.\PhysicalDrive0 ist die erste physikalische Festplatte
   Result = 0
   hDevice = CreateFile_("\\.\PhysicalDrive"+ Str(HD), #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, 0, 0)
   If hDevice = INVALID_HANDLE_VALUE 
    MessageRequester("Fehler", "HD-Zugriff fehlgeschlagen !")
    Result = 1
    Goto Exit
   EndIf

   cbBytesReturned = 0
   IP\cBufferSize = #IDENTIFY_BUFFER_SIZE
   IP\irDriveRegs\bSectorCountReg = 1
   IP\irDriveRegs\bSectorNumberReg = 1
   IP\irDriveRegs\bDriveHeadReg = $A0
   IP\irDriveRegs\bCommandReg = $EC  ;SMART HD Info
   
   If DeviceIoControl_(hDevice, #SMART_RCV_DRIVE_DATA, @IP, SizeOf(TSendCmdInParams) - 1, @aIdOutCmd(), #SMART_RCV_OUT_BUFFER_SIZE, @cbBytesReturned, #Null) = 0                           
    MessageRequester("Fehler", "SMART-Zugriff fehlgeschlagen !")
    CloseHandle_(hDevice)
    Result = 1
   EndIf
   Exit:
   ProcedureReturn Result
 EndProcedure 
  
   ;Die Byteorder muß korr. werden
   Procedure.s ChangeByteOrder(Steps,BufferPos);8,62  
   Dim CorrBuffer.b(Steps)
   For i = 0 To Steps-1 Step 2
    CorrBuffer(i) = aIdOutCmd(BufferPos+i+1)
   Next i
   For i = 1 To Steps-1 Step 2
    CorrBuffer(i) = aIdOutCmd(BufferPos+i-1)
   Next i   
   *PCorrBuffer = @CorrBuffer()
   Result$ = RTrim(PeekS(@CorrBuffer())) 
   ProcedureReturn Result$
EndProcedure
   
   Procedure.s GetHD_FirmwareRev(HD.l = 0)
   If GetSmartInfo(HD) = 0
    Result$= ChangeByteOrder(8,62)
   EndIf
   ProcedureReturn Result$
   EndProcedure
   
   Procedure.s GetHD_SerialNr(HD.l = 0)
   If GetSmartInfo(HD) = 0
    Result$= ChangeByteOrder(19,36)
   EndIf
   ProcedureReturn Result$
   EndProcedure
   
   Procedure.s GetHD_HD_Type(HD.l = 0)
   If GetSmartInfo(HD) = 0
    Result$= ChangeByteOrder(39,70)
   EndIf
   ProcedureReturn Result$
   EndProcedure
   
   If OpenConsole()
    ConsoleColor(10,0)
    ClearConsole()
    ConsoleTitle("HD-Info wird ausgefuehrt...")
    PrintN("ModelNumber      " + GetHD_HD_Type(0))
    PrintN("FirmwareRev.     " + GetHD_FirmwareRev(0))
    PrintN("SerialNumber     " + GetHD_SerialNr(0))
    PrintN("")
    Print("Abbruch mit <ESC>")   
   Repeat
   KeyPressed$ = Inkey()
   Until KeyPressed$ = Chr(27)
    ConsoleColor(7,0)
    CloseConsole()
   EndIf    
   End

Verfasst: 15.10.2006 15:38
von Kiffi
Hallo legion,

thx für's teilen! :allright:

kleiner Verbesserungsvorschlag: Variablen, die Du nur innerhalb einer
Prozedur benötigst, solltest Du mit Protected kennzeichnen, damit sie nicht
aus Versehen globale Variablen der 'Wirts-Applikation' überschreiben.

Code: Alles auswählen

Procedure.s GetHD_FirmwareRev(HD.l = 0)
  Protected Result$
  If GetSmartInfo(HD) = 0
    Result$= ChangeByteOrder(8,62)
  EndIf
  ProcedureReturn Result$
EndProcedure
Grüße ... Kiffi

Verfasst: 15.10.2006 15:58
von legion
Danke !
Bin für jede Info dankbar !
Ich beschäftige mich erst seit zwei Wochen mit PB.
Habe bis jetzt nur mit Pascal/Delphi programmiert.
Muß mich erst einarbeiten.

Gruß Legion

Verfasst: 15.10.2006 16:05
von ts-soft
>> Habe bis jetzt nur mit Pascal/Delphi programmiert.
Sieht man am T bei den Structuren :wink:

Funktioniert Fehlerfrei bei meinen beiden IBMs

Frage: Kann ich auch meine USB-Platte auslesen?

Gruß
Thomas

Verfasst: 15.10.2006 16:10
von legion
Ich glaube die USB Platte kann man nicht über
"\\.\PhysicalDrive" ansprechen.
Bei meiner TEAC250 funktioniert es auf alle Fälle nicht!
Werde mal darüber nachdenken.

Verfasst: 17.10.2006 12:36
von Shardik
Ein Beispiel aus dem englischen Forum, das neben Modellname, Serien-Nr. und Firmware-Version auch noch etliche Smart-Attribute ausgibt:
http://www.purebasic.fr/english/viewtopic.php?t=17635

Active SMART Attribute Definitions List

Verfasst: 17.10.2006 20:21
von legion
Damit man mit den SMART Werten auch was
anfangen kann ...

Active SMART Attribute Definitions List

1 Raw Read Error Rate Frequency of errors appearance while reading RAW data from a disk
2 Throughput Performance The average efficiency of hard disk
3 Spin Up Time Time needed by spindle to spin-up
4 Start/Stop Count Number of start/stop cycles of spindle
5 Reallocated Sector Count Quantity of remapped sectors
6 Read Channel Margin Reserve of channel while reading
7 Seek Error Rate Frequency of errors appearance while positioning
8 Seek Time Performance The average efficiency of operations while positioning
9 Power-On Hours Count Quantity of elapsed hours in the switched-on state
10 Spin-up Retry Count Number of attempts to start a spindle of a disk
11 Calibration Retry Count Number of attempts to calibrate a drive
12 Power Cycle Count Number of complete start/stop cycles of hard disk
13 Soft Read Error Rate Frequency of "program" errors appearance while reading data from a disk
191 G-Sense Error Rate Frequency of mistakes appearance as a result of impact loads
192 Power-Off Retract Cycle Number of the fixed 'turning off drive' cycles (Fujitsu: Emergency Retract Cycle Count)
193 Load/Unload Cycle Count Number of cycles into Landing Zone position
194 HDA Temperature Temperature of a Hard Disk Assembly
195 Hardware ECC Recovered Frequency of the on the fly errors (Fujitsu: ECC On The Fly Count)
196 Reallocated Event Count Quantity of remapping operations
197 Current Pending Sector Count Current quantity of unstable sectors (waiting for remapping)
198 Off-line Scan Uncorrectable Count Quantity of uncorrected errors
199 UltraDMA CRC Error Rate Total quantity of errors CRC during UltraDMA mode
200 Write Error Rate Frequency of errors appearance while recording data into disk (Western Digital: Multi Zone Error Rate)
201 Soft Read Error Rate Frequency of the off track errors (Maxtor: Off Track Errors)
202 Data Address Mark Errors Frequency of the Data Address Mark errors
203 Run Out Cancel Frequency of the ECC errors (Maxtor: ECC Errors)
204 Soft ECC Correction Quantity of errors corrected by software ECC
205 Thermal Asperity Rate Frequency of the thermal asperity errors
206 Flying Height The height of the disk heads above the disk surface
207 Spin High Current Quantity of used high current to spin up drive
208 Spin Buzz Quantity of used buzz routines to spin up drive
209 Offline Seek Performance Drive's seek performance during offline operations
220 Disk Shift Shift of disk is possible as a result of strong shock loading in the store, as a result of it's falling or for other reasons (sometimes: Temperature)
221 G-Sense Error Rate This attribute is an indication of shock-sensitive sensor - total quantity of errors appearance as a result of impact loads (dropping drive, for example)
222 Loaded Hours Loading on drive caused by the general operating time of hours it stores
223 Load/Unload Retry Count Loading on drive caused by numerous recurrences of operations like: reading, recording, positioning of heads, etc.
224 Load Friction Loading on drive caused by friction in mechanical parts of the store
225 Load/Unload Cycle Count Total of cycles of loading on drive
226 Load-in Time General time of loading for drive
227 Torque Amplification Count Quantity efforts of the rotating moment of a drive
228 Power-Off Retract Count Quantity of the fixed turning off's a drive
230 GMR Head Amplitude Amplitude of heads trembling (GMR-head) in running mode
231 Temperature Temperature of a drive
240 Head Flying Hours Time while head is positioning
250 Read Error Retry Rate Frequency of errors appearance while reading data from a disk

http://smartlinux.sourceforge.net/smart/index.php