如何在windows程式中讀取bios內容

2021-08-26 06:17:41 字數 3477 閱讀 9520

今天和夜月兄討論了一下在

windows nt/2000/xp下如何讀取bios資訊,現在把

結果向大家匯報一下。

大家都知道,

windows接管了對物理

記憶體的直接訪問,而bios資訊存在物理記憶體

的f000:0000處,關鍵就是如何讀取物理記憶體。

ntstatuszwopensection(out phandlesectionhandle, in

access_maskdesiredaccess,in pobject_attributesobjectattributes);

ntstatuszwmapviewofsection(in handlesectionhandle,

in handleprocesshandle,

in out pvoid*baseaddress,

in ulongzerobits,

in ulongcommitsize,

in out plarge_integersectionoffsetoptional,

in out psize_tviewsize,

in section_inheritinheritdisposition,

in ulongallocationtype,

in ulongprotect

); ntstatuszwunmapviewofsection(in handleprocesshandle,in pvoidbaseaddress);

用到的結構定義如下

typedef struct _unicode_string unicode_string,*punicode_string;

typedef struct _object_attributes object_attributes;

typedef object_attributes *pobject_attributes;

函式說明

第乙個函式zwopensection用來開啟section,第乙個引數是指向handle變數的指標,第二個是訪問引數,第三個是指向object_attributes的指標

第二個函式zwmapviewofsection用來建立物理記憶體和當前程序的一段物理記憶體的聯絡,引數很多,一會在例程裡再詳細解釋

第三個函式zwunmapviewofsection用來斷開物理記憶體和當前程序中的對映斷開聯絡,第乙個引數是程序控制代碼,必須掉用第二個函式時一樣,第二

個是當前程序中對映的基址,由zwmapviewofsection返回

這三個函式都在ntdll.dll中,msdn裡的幫助說這幾個函式用在

驅動編制上。

例程如下

//結構定義

typedef struct _unicode_string unicode_string,*punicode_string;

typedef struct _object_attributes object_attributes;

typedef object_attributes *pobject_attributes;

//函式指標變數型別生命

typedef dword(__stdcall *zwos)(phandle,access_mask,pobject_attributes);

typedef dword(__stdcall *zwmv)(handle,handle,pvoid,ulong,ulong,plarge_integer,psize_t,dword,ulong,ulong);

typedef dword(__stdcall *zwumv)(handle,pvoid);

//以上在程式開始定義全域性變數處定義

//以下在程式的主函式裡

//變數宣告

unicode_string struniph;

object_attributes obj_ar;

zwos zwopens;

zwmv zwmapv;

zwumv zwunmapv;

handle hsection;

dword ba;

large_integer so;

size_t ssize;

so.lowpart=0x000f0000;//物理記憶體的基址,就是f000:0000

so.highpart=0x00000000;

ssize=0xffff;

wchar_t strph[30]=l"\\device\\physicalmemory";

//變數初始化

ba=0;//聯絡後的基址將在這裡返回

struniph.buffer=strph;

struniph.length=0x2c;//注意大小是按位元組算

struniph.maximumlength =0x2e;//也是位元組

obj_ar.attributes =64;//屬性

obj_ar.length =24;//object_attributes型別的長度

obj_ar.objectname=&struniph;//指向物件的指標

obj_ar.rootdirectory=0;

obj_ar.securitydescriptor=0;

obj_ar.securityqualityofservice =0;

//讀入ntdll.dll,得到函式位址

hinstlib = loadlibrary("ntdll.dll");

zwopens=(zwos)getprocaddress(hinstlib,"zwopensection");

zwmapv=(zwmv)getprocaddress(hinstlib,"zwmapviewofsection");

zwunmapv=(zwumv)getprocaddress(hinstlib,"zwunmapviewofsection");

//呼叫函式,對物理記憶體進行對映

zwopens(&hsection,4,&obj_ar);

zwmapv(

(handle)hsection,//開啟section時得到的控制代碼

(handle)0xffffffff, //將要對映程序的控制代碼,

&ba,//對映的基址

0, //沒怎麼看明白,設為0就好了

0xffff,//分配的大小

&so,//物理記憶體的位址

&ssize,//指向讀取記憶體塊大小的指標

1,//子程序的可繼承性設定

0,//分配型別

2//保護型別

); //執行後會在當前程序的空間開闢一段64k的空間,並把f000:0000到f000:ffff處的內容對映到這裡

//對映的基址由ba返回,如果對映不在有用,應該用zwunmapviewofsection斷開對映

btw:

思路主要是來之上次跟蹤的聯想的安裝驗證程式,真的要感謝聯想的技術人員了:-)。

如何在spring中讀取properti

恩,不錯,謝謝分享 如何在spring中讀取properties屬性檔案裡面的資訊 waiwai 一般來說。我們會將一些配置的資訊放在。properties檔案中。然後使用 將配置檔案中的資訊讀取至spring的配置檔案。那麼我們如何在spring讀取properties檔案呢。1.首先。我們要先在...

如何在Windows中安裝JDK

三 設定環境變數 在環境變數對話方塊中的系統變數中點選 新建 按鈕,在彈出的新建系統變數裡的變數名中輸入j a home,在變數值中輸入jdk的根目錄 d software j a jdk1.8.0 60 然後點選確定,返回環境變數對話方塊。在系統變數中檢視是否有 classpath 變數,如果沒有...

如何在程式中延時

方法一 使用sleep函式,如延時2秒,用sleep 2000 方法二 使用sleep函式的不利在於延時期間不能處理其他的訊息,如果時間太長,就好象宕機一樣,利用coledatetime類和coledatetimespan類實現延時就不會出現那樣的問題 coledatetime start time...