怎样取得BIOS序列号
解决方案 »
- 抢分倒计时10分钟~
- ACCESS里的ole字段如何用程序控制导入另一个ACCESS库
- 如何把 Visual Foxpro 的表导入至 Access中 ???
- rbulid报表控间使用小问题请教
- 能解决问题者有分: 如何解决给字段付值或将字段值导出的繁琐性!!!!!!!
- 为何不能打开项目文件或不能运行程序?(非常奇怪的一个问题)
- <<<<<50分求解这个问题:为什么给不了分???
- TstringGrid如何删除中间某一行?
- 如何在98下制作半透明窗口?
- 下面的程序语句在Delphi5中编译通过,为什么在Delphi6中编译通不过?请各位解答!
- 调用EnumChildWindows(hnd,@enumChild,0),为什么不能编译通过?
- data-aware和referred是什么意思?
BIOS信息
在计算机的CMOS(Complementary Metal-Oxide Semiconductor)中存有计算机的配置信息,如时间、驱动器、内存等。由于不同的厂家出的BIOS,其中还有一些厂家自己的东西。但在一些基本信息上是一致的,除了提供一些通常的应用,如为操作系统、系统诊断软件等提供信息,现在也用在如共享软件的密码保护等地方。
存取控制CMOS的数据存取的可以分两步,先向端口70H(H表示十六进制,下同)写入要操作数据的偏移量,然后在71H上读取数值或者向71H写入数值进行赋值。如读取当前时间的小时的值:1. Out 70H <--- 4 , 小时的地址偏移量为4;2. In 71H ----> 变量为保证操作的地址正确,应在修改之前暂停中断,防止一些针对CMOS的中断修改70H中的地址值。各存储量的地址时间和日期偏移量 对应内容00H 当前时间的秒01H 定时器秒02H 当前时间的分钟03H 定时器分钟04H 当前时间的小时05H 定时器小时06H 星期几07H 一个月的第几天08H 一年的第几个月09H 当前年份系统参数偏移量 对应内容10H 软盘驱动器类型第7-4位(bit)对应A驱,第3-0位(bit)对应B驱相应位上的值:000 ----- 无 001 ----- 360K 010 ----- 1.2M 011 ----- 720K 100 ----- 1.44M101 ----- 2.88M14H 设备类型第7-6位表明了软磁盘驱动器的数量:00 ----- 一个磁盘驱动器 01 ----- 两个磁盘驱动器第5-4位表明显示器类型00 ----- 未定义 01 ----- 彩色,40列 10 ----- 彩色,80列 11 ----- 单显第3-2位,保留第1位为1表示有协处理器第0位为0表示安装了软磁盘驱动器15H 基本内存(Base Memory)大小的低字节,单位为K16H 基本内存(Base Memory)大小的高字节,单位为K17H 扩展内存(Expanded Memory)大小的低字节,单位为K18H 扩展内存(Expanded Memory)大小的高字节,单位为K19H 第一个物理硬盘的扩展驱动器类型1AH 第二个物理硬盘的扩展驱动器类型
var
SHA1Context: TSHA1Context;
SHA1Digest: TSHA1Digest;
begin
// Get the BIOS data
SetString(Result, PChar(Ptr($F0000)), $10000);
// Hash the string
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, PChar(Result), Length(Result));
SHA1Final(SHA1Context, SHA1Digest);
SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest));
// Return the hash string encoded in printable characters
Result := B64Encode(Result);
end;
function GetBiosInfoAsText: string;
var
p, q: pchar;
begin
q := nil;
p := PChar(Ptr($FE000));
repeat
if q <> nil then begin
if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin
if (p^ = #0) and (p - q >= 8) then begin
Result := Result + TrimRight(String(q)) + #13#10;
end;
q := nil;
end;
end else
if p^ in [#33..#126, #169, #184] then
q := p;
inc(p);
until p > PChar(Ptr($FFFFF));
Result := TrimRight(Result);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.Text := GetBiosInfoAsText;
end;
begin
Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061))));
Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091))));
Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5))));
Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71))));
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses bioshelp;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
RBD: TRomBiosDump;
begin
if ReadRomBios(RBD, rrbmAutomatic) then
begin
edit1.Text := GetRomBiosString(RBD, Ptr($ffff5)); // bios date
edit2.Text := GetRomBiosString(RBD, Ptr($ffa68)); // bios name
edit3.Text := GetRomBiosString(RBD, Ptr($fe061)); // bios version
edit4.Text := GetRomBiosString(RBD, Ptr($FEC71)); // bios serial number
edit5.Text := GetRomBiosString(RBD, Ptr($fe091)); // bios copyringht
end
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;end.