精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>Windows API函数>>[转贴]delphi中如何取得CPU或harddisk号

主题:[转贴]delphi中如何取得CPU或harddisk号
发信人: kingron(金龍)
整理人: teleme(2001-04-19 23:27:42), 站内信件
//关于硬盘S/N
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.
//CPUID:
用CPUID指令,首先你可以确定你用的CPU是Intel的。
然后执行:
    MOV EAX,01H
    CPUID
如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。
此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。
再执行:
    MOV EAX,03H
    CPUID
此时的EDX:ECX就是序列号的第64位。
回复人:westaf(2000-7-28 21:22:00)  得80分 
不敢当。
要想关闭这个ID,可执行下列代码:

    MOV ECX,119H
    RDMSR
    OR EAX,00200000H
    WRMSR

不过,一旦执行上述代码,cpu将一直不能取id,直到下次reset。 
 



----
██████
█┏━━┓█
█┃之金┃█   Delphi版直达快车
█┃印龍┃█
█┗━━┛█
██████
   

[关闭][返回]