Autor Beitrag
delphiuserno1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 831



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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



BeitragVerfasst: Sa 21.07.07 20:35 
Das geht auch bei USB:

ausblenden volle Höhe 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:
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; // Used for specifying SMART "commands". 
    bSectorCountReg  : Byte; // IDE sector count register 
    bSectorNumberReg : Byte; // IDE sector number register 
    bCylLowReg       : Byte; // IDE low order cylinder value 
    bCylHighReg      : Byte; // IDE high order cylinder value 
    bDriveHeadReg    : Byte; // IDE drive/head register 
    bCommandReg      : Byte; // Actual IDE command. 
    bReserved        : Byte; // reserved for future use.  Must be zero. 
  end
  IDEREGS   = TIDERegs; 
  PIDERegs  = ^TIDERegs; 

TIdSector = packed record 
    wGenConfig                 : Word; //00 
    wNumCyls                   : Word; 
    wReserved                  : Word; 
    wNumHeads                  : Word; 
    wBytesPerTrack             : Word; 
    wBytesPerSector            : Word; 
    wSectorsPerTrack           : Word; 
    wVendorUnique              : Array[0..2of Word; 
    sSerialNumber              : Array[0..19of Char; //10-19 
    wBufferType                : Word; 
    wBufferSize                : Word; 
    wECCSize                   : Word; 
    sFirmwareRev               : Array[0..7of Char;  //23-26 
    sModelNumber               : Array[0..39of Char; //27-46 
    wMoreVendorUnique          : Word; 
    wDoubleWordIO              : Word; 
    wCapabilities              : Word; 
    wReserved1                 : Word; 
    wPIOTiming                 : Word; 
    wDMATiming                 : Word; 
    wBS                        : Word; 
    wNumCurrentCyls            : Word; 
    wNumCurrentHeads           : Word; 
    wNumCurrentSectorsPerTrack : Word; 
    ulCurrentSectorCapacity    : ULONG; //57-58 
    wMultSectorStuff           : Word; 
    ulTotalAddressableSectors  : ULONG; //60-61 
    wSingleWordDMA             : Word; 
    wMultiWordDMA              : Word;  //63 
    wFlowControlPIOSupported   : Word;  //64 
    wMinimumMultiWordDMA       : Word;  //65 
    wRecommendedMultiWordDMA   : Word;  //66 
    wMinimumPIOCycleWOFlow     : Word;  //67 
    wMinimumPIOCycleIORDYFlow  : Word;  //68 
    bReserved1                 : Array[0..21of Byte; //69-79 
    wMajorVersionNumber        : Word;  //80 
    wMinorVersionNumber        : Word;  //81 
    wCommandSetSupported       : Word;  //82 
    wCommandSetSupported2      : Word;  //83 
    wCommandSetExtension       : Word;  //84 
    wCommandSetFeatureEnabled1 : Word;  //85 
    wCommandSetFeatureEnabled2 : Word;  //86 
    wCommandSetFeatureEnabled3 : Word;  //87 
    wUltraDMAMode              : Word;  //88 
    wTimeRequiredErase         : Word;  //89 
    wTimeRequiredEnhancedErase : Word;  //90 
    wAbleMode                  : Word;  //91 
    bReserved2                 : Array[0..71of Byte; //92-127 
    wSecurityModeFeature       : Word;  //128 
    wCurrentFeatureOption      : Word;  //129 
    wReserved2                 : Word;  //130 
    wInitialPowerMode          : Word;  //131 
    bReserved3                 : Array[0..247of Byte; //132-255 
  end
  PIdSector = ^TIdSector;

 const 
  BufferSize = SizeOf(TIDERegs)+4
  IOCTL_IDE_PASS_THROUGH        = $0004d028;


implementation

{$R *.dfm}

Function IdeRegPassThrough(Device: Stringvar ideregs: TIDERegs ): Boolean; 
var 
  ret:BOOL; 
  hDevice : THandle; 
  cbBytesReturned : DWORD; 
  pInData : PIDERegs; 
  pOutData : Pointer; 
  Buffer : Array[0..BufferSize-1of 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, 00 ); 
  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..255of Char;
begin
  Result := 0;
  if GetVolumeInformation(PChar(ADrive+':\'),
     Buffer, SizeOf(Buffer), @SerialNum, Dummy, Dummy, nil0then
    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, nil0);
  Result := Format('Label: %s,VolSer: %8.8X',[VolumeInfo, VolumeSerialNumber])
//  ShowMessage(GetHardDiskSerial('c'));
end;
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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



BeitragVerfasst: Sa 21.07.07 21:55 
Aber ja:

ausblenden 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;
//BoolToStr(SendToSleep('\\.\PhysicalDrive1'));
//BoolToStr(SendToSleep('\\.\PhysicalDrive0'));
delphiuserno1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: So 22.07.07 13:42 
user profile iconChryzler 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:user defined image

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



BeitragVerfasst: So 22.07.07 19:35 
Hier habe ich eine HDD-Serial-Number Lösung gefunden:

ausblenden 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..40of Char;
begin
{$ifdef debug}
OutputDebugString('PrintIdSectorInfo');
{$endif}

  with IdSector do
  begin
    ChangeByteOrder( sModelNumber, SizeOf(sModelNumber) ); // Change the WORD array to a BYTE array
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82


Delphi 7 enterprise, Delphi 2007
BeitragVerfasst: 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.

ausblenden 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-1of 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:

ausblenden 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!