Windows 2K不用驅動進入ring0(demo)

(******************************************************************************
*   CopyRight (c) By 姚佩雲 2004
*   All Right Reserved
*   Email : [email protected] 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.

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章