(******************************************************************************
* CopyRight (c) By 姚佩云 2004
* All Right Reserved
* Email : i_rock_1001@163.com www.jynx.com.cn
* Date :
* New Develop : 2004-x-x
* Modified :
* Description :
* 这是一个从ring3层不用驱动直接进入ring0层的例子,参考网上资料
******************************************************************************)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ring0;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//ring0 function define
type
TRing0Data = record
mrc0, mrc2, mrc3: DWORD;
BaseMemory: Word;
ExtendedMemory: Word;
end;
var
R0Data: TRing0Data;
implementation
{$R *.dfm}
//附加功能:读Bios内容
procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: PChar;
Length: Integer;
i: Integer;
begin
with Memo1 do
begin
Clear;
Length:=$30;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($FE061,Length,Buffer) then
Lines.Add('BIOS 版本: '+StrPas(Buffer));
finally
FreeMem(Buffer);
end;
Length:=$FF;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($FE091,Length,Buffer) then
Lines.Add('BIOS 版权信息: '+StrPas(Buffer));
finally
FreeMem(Buffer);
end;
Length:=$B;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($FFFF5,Length,Buffer) then
Lines.Add('BIOS 日期: '+StrPas(Buffer));
finally
FreeMem(Buffer);
end;
Length:=$FF;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($FE0C1,Length,Buffer) then
Lines.Add('名称: '+StrPas(Buffer));
finally
FreeMem(Buffer);
end;
Length:=$FF;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($FEC71,Length,Buffer) then
Lines.Add('主板序列号: '+StrPas(Buffer));
finally
FreeMem(Buffer);
end;
Lines.Add('');
Length:=$E;
GetMem(Buffer,Length);
try
if ReadWritePhyMem($400,Length,Buffer) then
begin
for i:=0 to 3 do
Lines.Add(Format('串口 %d 输入/输出范围: %x',[i+1,PWORD(@Buffer[i*2])^]));
Lines.Add('');
for i:=0 to 2 do
Lines.Add(Format('并口 %d 输入/输出范围: %x',[i+1,PWORD(@Buffer[8+i*2])^]));
end;
finally
FreeMem(Buffer);
end;
end;
end;
procedure Ring0Func; register;assembler;
asm
pushad
pushf
cli
//add ring0 code here
mov eax, cr0
mov R0Data.TRing0Data.mrc0, eax
mov eax, cr2
mov R0Data.TRing0Data.mrc2, eax
mov eax, cr3
mov R0Data.TRing0Data.mrc3, eax
popf
popad
retf
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s:string;
begin
ZeroMemory(@R0Data, SizeOf(R0Data));
VirtualLock(@R0Data, SizeOf(R0Data));
ExecRing0Proc(ULONG(@Ring0Func),$100);
VirtualUnlock(@R0Data, SizeOf(R0Data));
//可能是堆栈被破坏了,这里调用就出错,高手帮看看
//s:=IntToHex(R0Data.mrc0, 8);
//caption := s;
//self.Memo1.Lines.Add ( 'aa');
//Memo1.Lines.Add ('CR2 = $'+ IntToHex(R0Data.mrc2, 8));
//Memo1.Lines.Add ('CR3 = $'+ IntToHex(R0Data.mrc3, 8));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Lines.Add ('CR0 = $'+ IntToHex(R0Data.mrc0, 8));
Memo1.Lines.Add ('CR2 = $'+ IntToHex(R0Data.mrc2, 8));
Memo1.Lines.Add ('CR3 = $'+ IntToHex(R0Data.mrc3, 8));
end;
end.