试试这个:
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.   

    几个基本的例子,由此可演化得到许多硬件信息。
    结果放在Memo1中。
    procedure TForm1.Button1Click(Sender: TObject);
    var
            systeminfo: SYSTEM_INFO;
            memory: MEMORYSTATUS;
            sector,byte,cluster,free: DWORD;
            freespace,totalspace: longint;
            CDtype: UINT;
            name: CHAR;
            drvname: string;
            volname,filesysname: PCHAR;
            sno,maxl,fileflag: DWORD;
    begin
            Memo1.Lines.Clear();
            //获得CPU型号
            GetSystemInfo(systeminfo);
            Memo1.Lines.Add('您的CPU类型是:' + inttostr(systeminfo.dwProcessorType));        //获得内存状态
            memory.dwLength := sizeof(memory); //初始化
            GlobalMemoryStatus(memory);
            Memo1.Lines.Add('您的物理内存是(' + inttostr(integer(memory.dwTotalPhys div 1024 div 1024)) + 'MB)。');
            Memo1.Lines.Add('其中可用内存是(' + inttostr(integer(memory.dwTotalPhys div 1024)) + 'KB)。');        //获得C盘可用空间
            GetDiskFreeSpace('C:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数
            totalspace := cluster * byte * sector div 1024 div 1024; //计算总容量
            freespace := free * byte * sector div 1024 div 1024; //计算可用空间
            Memo1.Lines.Add('C盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');
            Memo1.Lines.Add('C盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');        //检测CD-ROM,是否有光盘
            GetMem(volname, 255);
            GetMem(filesysname, 100);
            for name :='C' to 'Z'  do//循环检测A~Z
            begin
                    drvname := name + ':';
                    CDtype := GetDriveType(PCHAR(@drvname[1])); //获得磁盘类型
                    if (CDtype = DRIVE_CDROM) then
                    begin
                            Memo1.Lines.Add('您的光驱盘符为[' + drvname + ']');
                            volname^ := Chr(0);
                            filesysname^ := Chr(0);
                            if ( not (GetVolumeInformation(PCHAR(@drvname[1]), volname, 250, LPDWORD(@sno), LPDWORD(@maxl)^, LPDWORD(@fileflag)^, filesysname,100))) then
                                    Memo1.Lines.Add(drvname + '驱中没有发现光盘') //如果返回值为假
                            else //如果返回值为真
                            begin
                                    Memo1.Lines.Add (drvname + '驱中光盘卷标为: [' + String(volname) + ']');
                                    Memo1.Lines.Add (drvname + '驱中光盘序号为: [' + inttostr(sno) + ']');
                            end;
                    end;
            end;
            FreeMem(volname);
            FreeMem(filesysname)
    end;
      

  2.   

    下面代码可以得到cpu,bios信息:因为要得到硬盘序列号在windows2000下程序必须能运行在ring0级
    type
      TCpuInformation = record
        IDs: array[0..3]of Longint;
        vendor: Shortstring;
      end;
      TBiosInformation = array [0..3] of shortstring;function GetCpuInfo: TCpuInformation;
    type
      TCpuIDs = array[0..3] of Longint;
      TCpuvendor = array [0..11] of char;  function GetCpuIDs : TCpuIDs; assembler; register;
      asm
          PUSH     EBX
          PUSH     EDI
          MOV      EDI, EAX
          MOV      EAX, 1
          DW       $A20F
          STOSD
          MOV      EAX, EBX
          STOSD
          MOV      EAX, ECX
          STOSD
          MOV      EAX, EDX
          STOSD
          POP      EDI
          POP      EBX
      end;  function GetCpuvendor: TCpuvendor; assembler; register;
      asm
          PUSH     EBX
          PUSH     EDI
          MOV      EDI, EAX
          MOV      EAX, 0
          DW       $A20F      MOV      EAX, EBX
          XCHG     EBX, ECX
          MOV      ECX, 4
        @1:
          STOSB
          SHR      EAX, 8
          LOOP     @1      MOV      EAX, EDX
          MOV      ECX, 4
        @2:
          STOSB
          SHR      EAX, 8
          LOOP     @2      MOV      EAX, EBX
          MOV      ECX, 4
        @3:
          STOSB
          SHR      EAX, 8
          LOOP     @3      POP      EDI
          POP      EBX
      end;
    var
      i:integer;
      CpuIDs: TCpuIDs;
    begin
      CpuIDs:=GetCpuIDs;
      for i:=0 to 3 do result.IDs[i]:=CpuIDs[i];
      result.vendor:=string(GetCpuvendor);
    end;function GetBiosInfo: TBiosInformation;
    const
      Addr: array[0..3]of integer=
            ($000FE061, $000FE090, $000FFFF5, $000FEC71);
    var
      i:integer;
      Registry: TRegistry;
      Biosver: array[0..127]of char;
    begin
      for i:=0 to 3 do result[i]:='';
      if GetPlatform=os_WINDOWSNT then
      begin
        Registry:=TRegistry.Create;
        try
          Registry.RootKey:=HKEY_LOCAL_MACHINE;
          Registry.OpenKey('\HARDWARE\DESCRIPTION\System',false);
          if Registry.valueExists('SystemBiosVersion')then
          begin
            Registry.ReadBinaryData('SystemBiosVersion',Biosver,128);
            result[0]:=string(Biosver);
          end;
          if Registry.valueExists('SystemBiosDate')then
            result[1]:=Registry.ReadString('SystemBiosDate');
        finally
          Registry.Closekey;
          Registry.free;
        end;
      end
      else
        for i:=0 to 3 do result[i]:=string(PChar(Ptr(Addr[i])));
    end;
      

  3.   

    inbud(清风侠) 也太................!!!!!!!!
      

  4.   

    不用那么麻烦吧,给你一个例子,可以由此得到许多硬件信息:
    procedure TForm1.Button1Click(Sender: TObject);
    var
            systeminfo: SYSTEM_INFO;
            memory: MEMORYSTATUS;
            sector,byte,cluster,free: DWORD;
            freespace,totalspace: longint;
            CDtype: UINT;
            name: CHAR;
            drvname: string;
            volname,filesysname: PCHAR;
            sno,maxl,fileflag: DWORD;
    begin
            Memo1.Lines.Clear();
            //获得CPU型号
            GetSystemInfo(systeminfo);
            Memo1.Lines.Add('您的CPU类型是:' + inttostr(systeminfo.dwProcessorType));        //获得内存状态
            memory.dwLength := sizeof(memory); //初始化
            GlobalMemoryStatus(memory);
            Memo1.Lines.Add('您的物理内存是(' + inttostr(integer(memory.dwTotalPhys div 1024 div 1024)) + 'MB)。');
            Memo1.Lines.Add('其中可用内存是(' + inttostr(integer(memory.dwTotalPhys div 1024)) + 'KB)。');        //获得C盘可用空间
            GetDiskFreeSpace('C:', LPDWORD(@sector)^, LPDWORD(@byte)^, LPDWORD(@free)^, LPDWORD(@cluster)^); //获得返回参数
            totalspace := cluster * byte * sector div 1024 div 1024; //计算总容量
            freespace := free * byte * sector div 1024 div 1024; //计算可用空间
            Memo1.Lines.Add('C盘总空间(' + inttostr(integer(totalspace)) + 'MB)。');
            Memo1.Lines.Add('C盘可用空间(' + inttostr(integer(freespace)) + 'MB)。');        //检测CD-ROM,是否有光盘
            GetMem(volname, 255);
            GetMem(filesysname, 100);
            for name :='C' to 'Z'  do//循环检测A~Z
            begin
                    drvname := name + ':';
                    CDtype := GetDriveType(PCHAR(@drvname[1])); //获得磁盘类型
                    if (CDtype = DRIVE_CDROM) then
                    begin
                            Memo1.Lines.Add('您的光驱盘符为[' + drvname + ']');
                            volname^ := Chr(0);
                            filesysname^ := Chr(0);
                            if ( not (GetVolumeInformation(PCHAR(@drvname[1]), volname, 250, LPDWORD(@sno), LPDWORD(@maxl)^, LPDWORD(@fileflag)^, filesysname,100))) then
                                    Memo1.Lines.Add(drvname + '驱中没有发现光盘') //如果返回值为假
                            else //如果返回值为真
                            begin
                                    Memo1.Lines.Add (drvname + '驱中光盘卷标为: [' + String(volname) + ']');
                                    Memo1.Lines.Add (drvname + '驱中光盘序号为: [' + inttostr(sno) + ']');
                            end;
                    end;
            end;
            FreeMem(volname);
            FreeMem(filesysname)
    end;
      

  5.   

    给个你取主板BIOS的var
      mbserial:string;nbserial:=string(pchar(ptr($FFFF5)));