今天和夜月兄討論了一下在
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...