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.   

    /*************************************************
         (C)Copyright by XXXXXXXXXXXXXXXXXXXXXX
         File..................gethardid.cpp
         UnitName..............Get hard disk Serials
         Version...............1.0
         AUTHCR................WangYuBao
         Create................July 1,2001
         Update................
    **************************************************/
    #include <vcl.h>
    #pragma hdrstop
    #include <stdlib.h>#include "gethardid.h"//---------------------------------------------------------------------------#pragma package(smart_init)
    WORD    pw[256];static  DWORD   idt, int_idt;
    static  DWORD   Base;
    static  WORD    Entry;#pragma warning (disable:4035)
    static int inp(WORD rdx)
    {
        _asm xor eax, eax
        _asm mov dx, rdx
        _asm in al, dx
    }static WORD inpw(WORD rdx)
    {
        _asm xor eax, eax
        _asm mov dx, rdx
        _asm in  ax, dx
    }static void outp(WORD rdx, int ral)
    {
        _asm mov dx, rdx
        _asm mov eax, ral
        _asm out dx, al
    }static int WaitIde()
    {
       int   al;   while ((al=inp(0x1F7))>=0x80) ;
       return al;
    }static void ReadIDE()
    {
       int   al;
       int   i;   WaitIde();
       outp(0x1F6,0xA0);
       al = WaitIde();
       if ((al&0x50)!=0x50) return;   outp(0x1F6,0xA0);
       outp(0x1F7,0xEC);
       al = WaitIde();
       if ((al&0x58)!=0x58) return;   for (i=0;i<256;i++) {
          pw[i] = inpw(0x1F0);
       }
    }static void __declspec( naked ) NowInRing0()
    {
        _asm {
            push    ebp
            mov     ebp,esp        call    ReadIDE        cli
            mov     ebx, int_idt
            mov     ax, Entry
    mov     word ptr [ebx-4], ax
            mov     eax, Base
    shr     eax, 16
    mov     [ebx+2], ax
            sti
            leave
            iretd
        }
    }void GetIDEInfo()
    {
        DWORD   dwExcept;    dwExcept = (DWORD)NowInRing0;    _asm {
            mov     eax, fs:[0]
        push eax
            sidt    [esp-02h]
            pop     ebx
            mov     idt, ebx
            add     ebx, 0x1C
            mov     int_idt, ebx        mov     eax, [ebx]
            mov     [Base], eax
            mov     ax, [ebx-4]
            mov     [Entry], ax        cli
            mov     esi, dwExcept
    push esi
    mov     [ebx-4], si
        shr     esi, 16
    mov     [ebx+2], si
    pop     esi
            sti        int     3
        }
    }GetHardID(char *s,int &aaa)
    {
        register i,j;    GetIDEInfo();
        aaa = 0;
        for (i=0,j=0;i<10;i++) {
            //得到出厂序列号
            s[j++]=pw[10+i]>>8;
            aaa = aaa + s[j-1]  * 'w' * 'y' * 'b' * 'w' * 'd' ;
            s[j++]=pw[10+i]&0xFF;
            aaa = aaa + s[j-1]  * 's' * 't' * 'a' * 'r';
        }
        s[j]='\0';
    /*
        int zzz;
        for(i=0;s[i]!='\0';i++)
           {
           int cs=i%9;
           if(cs==0)cs=1;
           if(s[i]%cs==0)
             s[i]='9'-cs%9;
           else
             s[i]='9'-s[i]%cs;
           }    return true;*/
    }
    AnsiString GetXLH(char *name,char *ID)
    {
         char Serials[15];
         Serials[0]='0'+ID[0]%9-name[0]%3;
         Serials[1]='1'+ID[1]%8-name[1]%2;
         Serials[2]='2'+ID[2]%7-name[2]%4;
         Serials[3]='3'+ID[3]%6-name[3]%5;
         Serials[4]='4'+ID[4]%5;
         Serials[5]='5'+ID[5]%4;
         Serials[6]='6'+ID[6]%3;
         Serials[7]='7'+ID[7]%2;
         Serials[8]='4'+ID[8]%5;
         Serials[9]='8'+name[0]%1;
         Serials[10]='7'+ID[0]%4-name[1]%5;
         Serials[11]='6'+ID[1]%2-name[2]%6;
         Serials[12]='5'+ID[2]%5-name[3]%7;
         Serials[13]='2'+ID[3]%9+name[4]%8;
         Serials[14]='3'+ID[10]-9-name[5]%5;
         Serials[15]='\0';
         return (AnsiString)Serials;
    }
    /*************************************************
         End Of File...........gethardid.cpp
         Last Update...........July 1,2001
         (C)Copyright by XXXXXXXXXXXXXXXXXXXXXX
    **************************************************/
      

  2.   

    [Error] Unit2.pas(74): Undeclared identifier: 'Port'
    出现了错误
      

  3.   

    上面的汇编代码只能在win98下用,winnt不能执行。