接上一篇 windows 核心程式設計研究系列之一(改變程序 pte) 内容
上一篇觀賞位址 :
<a href="http://community.csdn.net/expert/topic/5124/5124747.xml?temp=.2832453">http://community.csdn.net/expert/topic/5124/5124747.xml?temp=.2832453</a>
當然系統保證不讓通路位址0出于一種保護的目的,是防止未初始化的指針讀取資料。我說的通路位址0隻是出于一種純實作的目的,也不提倡大家這樣做。說白了
隻是好玩罷了。
大家都知道在 windows 中讀取/寫入位址0的指令肯定會出錯:
// 寫 0 位址的内容
xor edx,edx
mov [edx],eax
這是為什麼呢?是不是windows在核心做了什麼判斷?其實這是愚蠢和低效的。
windows隻是借助于pm的一個自然屬性---頁表屬性,通過将0xc000_0000置null
來完成。
知道原了解決也就很簡單了,就是将0xc000_0000 賦予一個有效的頁表屬性,
通過觀察發現 0xc000_0040 是一個有效的值,我們隻需:
mov edx,0c0000040h
mov eax,[edx]
mov edx,0c0000000h
然後執行通路0位址的任何指令,就不會發生所謂的無效位址通路的問題了,
呵呵......希望有相同興趣的朋友來聊聊吧。