Windows 2K不用驱动进入ring0(demo)

(******************************************************************************
*   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.

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值