對Win8的WinRT環(huán)境的一些個人探索
開發(fā)者預(yù)覽版沒裝,就裝了消費者預(yù)覽版,折騰了很久,關(guān)于那個WinRT,有很多疑問:
1、Win32 API是R3和R0溝通的一層紙,所有用戶層下調(diào)用的函數(shù)最終都會通過int3進(jìn)入內(nèi)核(Win32——sysenter——Kernel),那WinRT是否也是這樣的呢?內(nèi)核驅(qū)動內(nèi),如ntoskrnl等會不會有WinRT函數(shù)的最終R0入口?還是說WinRT函數(shù)原始就是基于Win32寫的,接口是WinRT——Win32——Kernel這樣的呢?
2、我研究了一下WinRT的運行環(huán)境,Win8中有3個WinRT相關(guān)服務(wù),把其中那個WinRT后臺作業(yè)服務(wù)在Win32下停止掉后,Metro程序就無法正常工作了。還有更奇怪的一個現(xiàn)象,如果我們使用管理員權(quán)限運行explorer,進(jìn)入Metro界面點擊任何一個Metro程序,都會提示無法運行,需要以非管理員權(quán)限運行explorer。
從中可以看到:A、Metro是完全嵌入在explorer內(nèi)的。(結(jié)束explorer后,Metro界面怎樣都調(diào)不出來);B、WinRT宣稱的權(quán)限管理限制,其實就是以非Win32下管理員權(quán)限運行后,防止程序使用WinRT API時的操作對Win32構(gòu)成破壞,也就是說Win32依然是主要的!
3、從微軟公開的Windows 8 New API List中,可以發(fā)現(xiàn),以API形式添加到系統(tǒng)的大多數(shù)都是desktop only,僅有那么部分可以desktop + metro共用,Metro能用的接口基本上全是COM的。而我仔細(xì)觀察了一下,發(fā)現(xiàn)一個很有意思的事情,添加給desktop only的API權(quán)限依然還是那樣(恩,就如你熟悉的OpenProcess那樣),而添加給metro可以用的API,沒權(quán)限,僅是功能上的API罷了(如壓縮API)。也還是證實了微軟對WinRT的權(quán)限控制是在用戶層API上做手腳。(并且Metro安裝的時候,顯示如android那樣這個Metro應(yīng)用程序會使用到那些功能,其實也就是微軟掃描這個程序使用了哪些WinRT API,所以才把WinRT全做成COM的,而不是那個不可控制的Win32 API。)
4、在Win32下我們完全可以對WinRT進(jìn)行破壞甚至刪除WinRT,而Metro程序和Metro程序的配置文件也僅是在Program Files和AppData下的一個目錄罷了(AppData下有一個完整的Metro程序環(huán)境變量,就如同你在Win32下的Roaming、LocalLow、Local這些目錄一樣),Win32下完全可以任意操作那些文件。所以所謂的WinRT安全性,在Win32下毫無任何意義可言。