Autor |
Beitrag |
delphiuserno1
      
Beiträge: 82
Delphi 7 enterprise, Delphi 2007
|
Verfasst: Sa 21.07.07 18:21
Hallo
Ich bin n bisschen verwirrt. ich hab ne procedure die mit hilfe der WMI die Seriennummer der Festplatte ermittelt. diese wird dann in eine String Variable gespeichert. Das Problem ist, bei USB-Festplatten kann keine Seriennummer ausgelesen werden. Ich kann dann aber auch nicht auf einen leeren String vergleichen, weil er eigentlich nicht leer ist!
In der Variable steht dann folgender Wert: #$1F
aber nicht als String sondern als Wert!
Bei der normalen Festplatte steht in der Variable: '24323535'
Wie soll man das jez deuten? Ich muss das irgendwie vergleichen können mit einem abgespeichertem Wert in einer Textdatei.
|
|
Lhid
      
Beiträge: 831
|
Verfasst: Sa 21.07.07 20:27
Mich und bitte alle meine Beiträge löschen. Habe mich und meine Meinung stark verändert
Zuletzt bearbeitet von Lhid am Di 20.10.09 16:42, insgesamt 1-mal bearbeitet
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Sa 21.07.07 20:27
Hast du den String vorher initialisiert? Versuch mal den String vorher auf '' zu setzen. Notfalls kannst du ja auch prüfen, ob in der Variable ein sinnvoller Integer drinsteht.
@Lhid: Nee, ich denke er will wissen, ob in der String-Variable ein sinnvoller Wert drinsteht, oder keiner.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 21.07.07 20:35
Das geht auch bei USB:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143:
| . . . var Form1: TForm1;
Type TIDERegs = packed record bFeaturesReg : Byte; bSectorCountReg : Byte; bSectorNumberReg : Byte; bCylLowReg : Byte; bCylHighReg : Byte; bDriveHeadReg : Byte; bCommandReg : Byte; bReserved : Byte; end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs;
TIdSector = packed record wGenConfig : Word; wNumCyls : Word; wReserved : Word; wNumHeads : Word; wBytesPerTrack : Word; wBytesPerSector : Word; wSectorsPerTrack : Word; wVendorUnique : Array[0..2] of Word; sSerialNumber : Array[0..19] of Char; wBufferType : Word; wBufferSize : Word; wECCSize : Word; sFirmwareRev : Array[0..7] of Char; sModelNumber : Array[0..39] of Char; wMoreVendorUnique : Word; wDoubleWordIO : Word; wCapabilities : Word; wReserved1 : Word; wPIOTiming : Word; wDMATiming : Word; wBS : Word; wNumCurrentCyls : Word; wNumCurrentHeads : Word; wNumCurrentSectorsPerTrack : Word; ulCurrentSectorCapacity : ULONG; wMultSectorStuff : Word; ulTotalAddressableSectors : ULONG; wSingleWordDMA : Word; wMultiWordDMA : Word; wFlowControlPIOSupported : Word; wMinimumMultiWordDMA : Word; wRecommendedMultiWordDMA : Word; wMinimumPIOCycleWOFlow : Word; wMinimumPIOCycleIORDYFlow : Word; bReserved1 : Array[0..21] of Byte; wMajorVersionNumber : Word; wMinorVersionNumber : Word; wCommandSetSupported : Word; wCommandSetSupported2 : Word; wCommandSetExtension : Word; wCommandSetFeatureEnabled1 : Word; wCommandSetFeatureEnabled2 : Word; wCommandSetFeatureEnabled3 : Word; wUltraDMAMode : Word; wTimeRequiredErase : Word; wTimeRequiredEnhancedErase : Word; wAbleMode : Word; bReserved2 : Array[0..71] of Byte; wSecurityModeFeature : Word; wCurrentFeatureOption : Word; wReserved2 : Word; wInitialPowerMode : Word; bReserved3 : Array[0..247] of Byte; end; PIdSector = ^TIdSector;
const BufferSize = SizeOf(TIDERegs)+4; IOCTL_IDE_PASS_THROUGH = $0004d028;
implementation
{$R *.dfm}
Function IdeRegPassThrough(Device: String; var ideregs: TIDERegs ): Boolean; var ret:BOOL; hDevice : THandle; cbBytesReturned : DWORD; pInData : PIDERegs; pOutData : Pointer; Buffer : Array[0..BufferSize-1] of Byte; begin Result := False; FillChar(Buffer,BufferSize,#0);
hDevice := CreateFile( PChar(Device), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); if hDevice=INVALID_HANDLE_VALUE then Exit; try pInData := @Buffer; pOutData := pInData; pInData^ := ideregs; ret := DeviceIoControl( hDevice, IOCTL_IDE_PASS_THROUGH, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ); if not ret then begin Exit; end; ideregs := PIDERegs(pOutData)^; finally CloseHandle(hDevice); end; Result := True; end;
function GetSerialNumber(const ADrive: Char): Integer; var SerialNum: DWORD; Dummy: DWord; Buffer: array[0..255] of Char; begin Result := 0; if GetVolumeInformation(PChar(ADrive+':\'), Buffer, SizeOf(Buffer), @SerialNum, Dummy, Dummy, nil, 0) then Result:=SerialNum else RaiseLastOSError; end;
function GetHardDiskSerial(const DriveLetter: Char): string; var NotUsed: DWORD; VolumeFlags: DWORD; VolumeInfo: array[0..MAX_PATH] of Char; VolumeSerialNumber: DWORD; begin GetVolumeInformation(PChar(DriveLetter + ':\'), nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed, VolumeFlags, nil, 0); Result := Format('Label: %s,VolSer: %8.8X',[VolumeInfo, VolumeSerialNumber]) end; |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 21.07.07 21:14
Hast Du für IDERegPassThru bitte mal ein Beispiel?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 21.07.07 21:55
Aber ja:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function SendToSleep(Device: String): Boolean; var ideregs : TIDERegs; begin Result := False; with ideregs do begin bFeaturesReg := 0; bSectorCountReg := 0; bSectorNumberReg := 0; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := $E6; bReserved := 0; end; if not IdeRegPassThrough(Device, ideregs ) then Exit else Result := True; end; |
|
|
delphiuserno1 
      
Beiträge: 82
Delphi 7 enterprise, Delphi 2007
|
Verfasst: So 22.07.07 13:42
Chryzler hat folgendes geschrieben: |
@Lhid: Nee, ich denke er will wissen, ob in der String-Variable ein sinnvoller Wert drinsteht, oder keiner. |
Genau so ist es! Ich werde mal versuchen den String vorher zu initialisieren. Dann sollte der je den wert habe, den ich initialisiert habe.
Aber das mit der Seriennummer über USB werd ich mir mal näher anschauen. Das wäre nämlich viel besser!
Warum zeigt Delphi denn da überhaupt so einen komischen Wert an, wenn eigentlich gar nix im String steht?
[EDIT] Ich glaube diesen code habe ich schonmal gesehen. Kann man denn dami auch wirklich die Seriennummer der Festplatte ermitteln oder nur von den Partitionen?
Soweit ich weiß gibt GetVolumeInformation() nur die Seriennummer der Partition raus, nicht aber die der pysikalischen Festplatte
[EDIT2]
Also ich hab es jez mal versucht den string vorher zu initialisieren. allerdings wird der dann wieder überschrieben. Um mal zu verdeutlichen, was ich meine hab ich mal n screenshot gemacht:
Jedenfalls hab ich es jez so gemacht, das ich prüfe ob die länge des strings <=1 ist. wenn ja ersetze ich ihn dur einen leeren string. der vergleich mit 0 funktioniert nicht, weil er offensichtlich nicht leer ist!
Ich kann auch nicht auf einen Integer wert prüfen, weil ich ja gar nicht weiß ob die seriennummer immer nur zahlen enthält!
Wenn jemand noch ne bessere lösung hat dann bitte melden!
Gruß
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 22.07.07 19:35
Hier habe ich eine HDD-Serial-Number Lösung gefunden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure tform1.PrintIdSectorInfo( IdSector : TIdSector ); var szOutBuffer : Array [0..40] of Char; begin {$ifdef debug} OutputDebugString('PrintIdSectorInfo'); {$endif}
with IdSector do begin ChangeByteOrder( sModelNumber, SizeOf(sModelNumber) ); szOutBuffer[SizeOf(sModelNumber)] := #0; StrLCopy( szOutBuffer, sModelNumber, SizeOf(sModelNumber) ); label1.caption :='Model : ' + szOutBuffer ;
ChangeByteOrder( sFirmwareRev, SizeOf(sFirmwareRev) ); szOutBuffer[SizeOf(sFirmwareRev)] := #0; StrLCopy( szOutBuffer, sFirmwareRev, SizeOf(sFirmwareRev) ); label2.caption := 'Firmware Rev : ' + szOutBuffer ;
ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) ); szOutBuffer[SizeOf(sSerialNumber)] := #0; StrLCopy( szOutBuffer, sSerialNumber, SizeOf(sSerialNumber) ); label3.caption := 'Serial Number : '+ szOutBuffer ; end; {$ifdef debug} OutputDebugString('PrintIdSectorInfo end'); {$endif} end; |
Komplett im Anhang:
Einloggen, um Attachments anzusehen!
|
|
delphiuserno1 
      
Beiträge: 82
Delphi 7 enterprise, Delphi 2007
|
Verfasst: So 22.07.07 23:48
Hab den Code mal ausprobiert, aber es ist wie ich es mir gedacht habe! Von der internen Festplatte is es kein Problem die seriennummer auszulesen, aber bei der USB Festplatte passiert gar nichts.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure tform1.DirectIdentify; var hDevice : THandle; rc : DWORD; nIdSectorSize : LongInt; aIdBuffer : Array [0..IDENTIFY_BUFFER_SIZE-1] of Byte; IdSector : TIdSector absolute aIdBuffer; begin FillChar(aIdBuffer,SizeOf(aIdBuffer),#0); hDevice := GetPhysicalDriveHandle( 0, GENERIC_READ or GENERIC_WRITE ); |
wenn ich den code richtig verstehe, dann muss ich in diesem Teil:
Delphi-Quelltext 1:
| hDevice := GetPhysicalDriveHandle( 0, GENERIC_READ or GENERIC_WRITE ) |
die 0 in eine 1 ändern, damit ich die 2 Festplatte bekomme. Hab ich gemacht aber letztendlich wird nichts angezeigt!
|
|
|