Hard disk serial number
Question
Is there anyone who knows how to obtain the hard disk serial number?
Answer
I have an unit to get the Hd Name and the Hd Serial number for Borland
Pascal 7.0. I don't know if it's working with Delphi and the other thing is
that it is in dutch and I don't have time to translate it in englisch. Mayby
you can use it, otherwise drop it out of the window.
Unit HardDisk;
INTERFACE
FUNCTION  GetHardDiskNaam  : STRING;
FUNCTION  GetHardDiskSerieNummer        : STRING;
FUNCTION  GetHardDiskControlleNummer    : STRING;
PROCEDURE GetHardDiskGegevens;
CONST
  CodeerTabel : ARRAY[0..24] OF BYTE =
(3,1,2,1,4,1,3,2,6,4,6,5,1,2,6,4,2,6,3,4,6,2,4,1,2);
TYPE
  CharArray = ARRAY[0..24] OF CHAR;
VAR
  HardDiskGegevens          : ARRAY[1..256] OF INTEGER;
  HardDiskNaam  : CharArray;
  SerieNummer  : CharArray;
  ControlleNummer          : CharArray;
  C_HardDiskNaam: STRING;
  C_HardDiskSerieNummer    : STRING;
  C_HardDiskControlleNummer : STRING;
  C_LicentieNaam: STRING;
IMPLEMENTATION
FUNCTION GetHardDiskNaam : STRING;
VAR
  Teller : INTEGER;
  Lus    : INTEGER;
BEGIN
    GetHardDiskNaam := '';
    Teller := 1;
    FOR Lus := 1 TO 18 DO
    BEGIN
      HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] DIV 256 ));
      Inc(Teller);
      HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] MOD 256 ));
      Inc(Teller);
    END;
    GetHardDiskNaam := HardDiskNaam;
END;
FUNCTION GetHardDiskSerieNummer : STRING;
VAR
  Teller : INTEGER;
  Lus    : INTEGER;
BEGIN
    GetHardDiskSerieNummer := '';
    Teller := 1;
    FOR Lus := 1 TO 8 DO
    BEGIN
      SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] DIV 256 ));
      Inc(Teller);
      SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] MOD 256 ));
      Inc(Teller);
    END;
    GetHardDiskSerieNummer := SerieNummer;
END;
FUNCTION GetHardDiskControlleNummer : STRING;
VAR
  Teller : INTEGER;
  Lus    : INTEGER;
BEGIN
    GetHardDiskControlleNummer := '';
    Teller := 1;
    FOR Lus := 1 TO 3 DO
    BEGIN
      ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] DIV 256 ));
      Inc(Teller);
      ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] MOD 256 ));
      Inc(Teller);
    END;
    GetHardDiskControlleNummer := ControlleNummer;
END;
PROCEDURE GetHardDiskGegevens;
VAR
  Lus    : INTEGER;
BEGIN
  WHILE ( Port[$1f7] <> $50) DO ;
  Port[$1F6] := $A0 ;
  Port[$1F7] := $EC ;
  WHILE ( Port[$1f7] <> $58 ) DO ;
  FOR Lus := 1 TO 256 DO
  BEGIN
    HardDiskGegevens[Lus] := Portw[$1F0] ;
  END;
END;
END.

解决方案 »

  1.   

    //==============================================================================
    //获得硬盘序列号****************************************************************
    //==============================================================================
    function GetHardDiskSerial(Drive: string): string;
    var VolumeSerialNumber: DWORD;
        MaximumComponentLength: DWORD;
        FileSystemFlags: DWORD;
    begin
      if Drive[Length(Drive)]=':' then Drive := Drive + '\';
      GetVolumeInformation(PChar(Drive), nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0);
      Result := IntToHex(HiWord(VolumeSerialNumber), 4) + '-' + IntToHex(LoWord(VolumeSerialNumber), 4);
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);  
    var SerialNum : pdword; a, b : dword; Buffer : array [0..255] of char;  
    begin  
      if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then Label1.Caption := IntToStr(SerialNum^); end; 
      

  3.   

    我想问问  quark(夸克) 、 lin513(东方求救) ,
    格式化硬盘 、 或重新分区 后,硬盘的序列号会不会变???
      

  4.   

    用VC编写的DLL,可以获得硬盘的型号、序列号以及计算机 ID,带Delphi的源程序
    http://www.applevb.com/lib/diskio.rar
    VC源程序 
    http://www.applevb.com/DiskID.rar不会随格式化改变
      

  5.   

    可以试一试:
    var 
    pdw : pDWord;
    mc, fl : dword;
    begin
    try
      New(pdw);
      if GetVolumeInformation(nil,nil,0,pdw,mc,fl,nil,0) then
      serialnumber:= pdw^
      else serialnumber:=0;
     finally
      dispose(pdw);
     end;
    end;
    如果格式化、重新分区后序列号没有改变,请告诉我。[email protected]
      

  6.   

    到这里瞧瞧:
    http://www.csdn.net/Expert/TopicView1.asp?id=586709
      

  7.   

    或者到:http://www.csdn.net/expert/topic/593/593137.xml?temp=.3639337