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