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