Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Citanje serijskog broja hard diska - problem na nekim OS...?

[es] :: Pascal / Delphi / Kylix :: Citanje serijskog broja hard diska - problem na nekim OS...?

[ Pregleda: 2726 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
*.ftn.ns.ac.yu.

Sajt: www.linkedin.com/in/aleks..


Profil

icon Citanje serijskog broja hard diska - problem na nekim OS...?22.03.2006. u 17:58 - pre 220 meseci
Pozdrav!
Ako neko ima vremena neka pogleda ovaj kod za citanje SN HDD... Na nekim racunarima kod radi dobro, dok na nekim funkcija vraca samo prazan string...Prvo sam mislio da ne radi na XP sa SP2, ali na jednom radi na drugom ne radi...da li neko mozda zna u cemu je caka...?
Pozdrav!

Code:

procedure TForm1.Button1Click(Sender: TObject);
var
s:String;
begin
s:= GetIdeDiskSerialNumber;
ShowMessage('HDDSerial: ' + s); 
end;
///////////////////////////////////////////////////////////////////////////////
function TForm1.GetIdeDiskSerialNumber: String;
  type
       TSrbIoControl = packed record
       HeaderLength : ULONG;
       Signature : Array[0..7] of Char;
       Timeout : ULONG;
       ControlCode : ULONG;
       ReturnCode : ULONG;
       Length : ULONG;
    end;
    SRB_IO_CONTROL = TSrbIoControl;
    PSrbIoControl = ^TSrbIoControl;

    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. Must be zero.
    end;
    IDEREGS = TIDERegs;
    PIDERegs = ^TIDERegs;

    TSendCmdInParams = packed record
    cBufferSize : DWORD;
    irDriveRegs : TIDERegs;
    bDriveNumber : Byte;
    bReserved : Array[0..2] of Byte;
    dwReserved : Array[0..3] of DWORD;
    bBuffer : Array[0..0] of Byte;
    end;
    SENDCMDINPARAMS = TSendCmdInParams;
    PSendCmdInParams = ^TSendCmdInParams;

    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;
     bReserved : Array[0..127] of Byte;
     end;
      PIdSector = ^TIdSector;
  const
    IDE_ID_FUNCTION = $EC;
    IDENTIFY_BUFFER_SIZE = 512;
    DFP_RECEIVE_DRIVE_DATA = $0007c088;
    IOCTL_SCSI_MINIPORT = $0004d008;
    IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
    DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
    BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
    W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;

  var
    hDevice : THandle;
    cbBytesReturned : DWORD;
    pInData : PSendCmdInParams;
    pOutData : Pointer; // PSendCmdOutParams
    Buffer : Array[0..BufferSize-1] of Byte;
    srbControl : TSrbIoControl absolute Buffer;
begin
   Result := '';
   FillChar(Buffer,BufferSize,#0);
   if Win32Platform=VER_PLATFORM_WIN32_NT then
   begin // Windows NT, Windows 2000, Windows XP
      // Get SCSI port handle
      hDevice := CreateFile('\\.\Scsi0:',
      // Note: '\\.\C:' required administrative privileges.
      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
      srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
      System.Move('SCSIDISK',srbControl.Signature,8);
      srbControl.Timeout := 2;
      srbControl.Length := DataSize;
      srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
      pInData := PSendCmdInParams(PChar(@Buffer)
      +SizeOf(SRB_IO_CONTROL));
      pOutData := pInData;
      with pInData^ do begin
        cBufferSize := IDENTIFY_BUFFER_SIZE;
        bDriveNumber := 0;
      with irDriveRegs do begin
        bFeaturesReg := 0;
        bSectorCountReg := 1;
        bSectorNumberReg := 1;
        bCylLowReg := 0;
        bCylHighReg := 0;
        bDriveHeadReg := $A0;
        bCommandReg := IDE_ID_FUNCTION;
      end;
      end;
    if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
    @Buffer, BufferSize, @Buffer, BufferSize,
    cbBytesReturned, nil ) then Exit;
    finally
       CloseHandle(hDevice);
    end;
   end
  else begin // Windows 95 OSR2, Windows 98, Windows ME
   hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,CREATE_NEW, 0, 0 );
  if hDevice=INVALID_HANDLE_VALUE then Exit;
  try
    pInData := PSendCmdInParams(@Buffer);
    pOutData := @pInData^.bBuffer;
    with pInData^ do begin
      cBufferSize := IDENTIFY_BUFFER_SIZE;
      bDriveNumber := 0;
    with irDriveRegs do  begin
      bFeaturesReg := 0;
      bSectorCountReg := 1;
      bSectorNumberReg := 1;
      bCylLowReg := 0;
      bCylHighReg := 0;
      bDriveHeadReg := $A0;
      bCommandReg := IDE_ID_FUNCTION;
   end;
   end;
   if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,pInData, 
SizeOf(TSendCmdInParams)-1, pOutData,W9xBufferSize, cbBytesReturned, nil ) 
then Exit;
   finally
     CloseHandle(hDevice);
   end;
  end;
  with PIdSector(PChar(pOutData)+16)^ do begin
     ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
     SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
  end;

end;
///////////////////////////////////////////////////////////////////////////////
procedure TForm1.ChangeByteOrder(var Data; Size: Integer);
var ptr : PChar;
i : Integer;
c : Char;
begin
ptr := @Data;
for i := 0 to (Size shr 1)-1 do
begin
c := ptr^;
ptr^ := (ptr+1)^;
(ptr+1)^ := c;
Inc(ptr,2);
end;
end;
end.


RTFM
 
Odgovor na temu

bondja

Član broj: 10286
Poruke: 167
*.adsl.sezampro.yu.



+3 Profil

icon Re: Citanje serijskog broja hard diska - problem na nekim OS...?23.03.2006. u 08:05 - pre 220 meseci
pogledaj: http://www.elitesecurity.org/tema/141047

Obavesti nas da li navedeni kod radi u pomenutim slucajevima.. .. :)

poz.
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
62.108.123.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Citanje serijskog broja hard diska - problem na nekim OS...?23.03.2006. u 13:22 - pre 220 meseci
Kako mi je ova tema promakla.....ne znam! Hvala! Na jednom problematicnom racunaru sve radi ok ...jos cu da probam na drugom...
Hvala, pozdrav!
RTFM
 
Odgovor na temu

aleksandarpopov
IT consultant
Senta

Član broj: 57172
Poruke: 484
62.108.123.*

Sajt: www.linkedin.com/in/aleks..


Profil

icon Re: Citanje serijskog broja hard diska - problem na nekim OS...?24.03.2006. u 17:18 - pre 220 meseci
Javio mi je drug da kod radi i na njegovom racunaru koji je bio problematican...Strava...
Hvala jos jednom, pozdrav! (Verovatno je problem sa SATA -discovima, a ne sa OS)
RTFM
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Citanje serijskog broja hard diska - problem na nekim OS...?

[ Pregleda: 2726 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.