发信人: 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版直达快车
 █┃印龍┃█
 █┗━━┛█
 ██████    | 
 
 
 |