读bois的程序:
procedure TForm1.Button1Click(Sender: TObject);
var data:Smallint;temp:byte;
    decode,passwd:array [0..9] of char;count,I:integer;
begin
  count:=0;
  asm
     mov al,29
     out $70,al
     mov ah,al
     mov al,28
     out $70,al
     in al,$71
     mov data,ax
  end;
 while data>0 do
 begin
  if (data<$80) then
    begin
     passwd[count]:=char(data);
     break;
    end
  else
    begin
       temp:=data and $3f;
       if (temp <= $20) then
              temp:=temp or $30;
       passwd[count]:=char(temp);
       count:=count+1;
       data:=data-temp;
       data:=data shr 2;
   end;
 end;
 i:=0;
 while (count>=0) do
 begin
   decode[i]:=passwd[count];
   count:=count-1;
   i:=i+1;
 end;
 showmessage('the CMOS passwd= '+decode); 
end;

解决方案 »

  1.   

    aiirii的方法通过读取端口获得的结果是 CMOS 参数,这还是不足以作为加密依据。
    因为口令等数据是会变化的。同硬盘序列号一样。
    我会随后发一个控件给你,这个控件包含了在win98下读取BIOS、网卡信息的多个功能。********************************************
    另外关于读取BIOS信息,你还不妨试一下以下语句:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bn, bc, bd, bs: string;
    begin
      try
        bn := String(Pchar(Ptr($FE061)));
        bc := String(Pchar(Ptr($FE091)));
        bd := String(Pchar(Ptr($FFFF5)));
        bs := String(Pchar(Ptr($FEC71)));
      except
        bn := 'Unsupported';
        bc := 'Unsupported';
        bd := 'Unsupported';
        bs := 'Unsupported';
      end;
      showmessage(
        '[BiosName]      ' + bn + #13 +
        '[BiosCopyright] ' + bc + #13 +
        '[BiosDate]      ' + bd + #13 +
        '[BiosSerial]    ' + bs);
    end;这段程序在我的三台机器上都通过。另外在一台DOS622机器上,用C语言编写程序读取
    以上的四个地址都正确,还有直接用DEBUG也可以看到。
      

  2.   

    ''我会随后发一个控件给你,这个控件包含了在win98下读取BIOS、网卡信息的多个功能。''
    这个控件可以发给我吗?非常感谢!!!
    sls