关于windows注册表重定向和虚拟化分析
轉(zhuǎn)載源地址?https://www.cnblogs.com/xenophon/p/4956218.html
在 64 位系統(tǒng)上,32 位程序讀寫部分注冊(cè)表路徑時(shí)會(huì)被系統(tǒng)重定向,這有些類似于讀寫 System32 文件夾的處理方式。比如,寫入 HKLM\Software\KeyName,卻發(fā)現(xiàn)實(shí)際寫入到 HKLM\Software\Wow6432Node\KeyName,讀取亦是如此。現(xiàn)實(shí)中發(fā)現(xiàn),很多的程序員在檢測(cè)一個(gè)程序在 HKLM 鍵下面的注冊(cè)表信息,通常會(huì)針對(duì) HKLM\Software 和 HKLM\Software\Wow6432Node 分別檢查,實(shí)際上這樣檢查毫無(wú)效果。對(duì)于 32 位程序而言,訪問(wèn) HKLM\Software 時(shí),系統(tǒng)底層會(huì)重定向到 HKLM\Software\Wow6432Node,并不能得到真正的 HKLM\Software 下面的信息,即便再訪問(wèn)一次 HKLM\Software\Wow6432Node,經(jīng)測(cè)試也是訪問(wèn) Wow6432Node 下面的值,和直接訪問(wèn) HKLM\Software 并沒有任何區(qū)別。如果你仔細(xì)閱讀 MSDN 上關(guān)于注冊(cè)表重定向和訪問(wèn)權(quán)限等資料,會(huì)發(fā)現(xiàn)微軟提供了兩個(gè)特殊的注冊(cè)表權(quán)限位:KEY_WOW64_32KEY、KEY_WOW64_64KEY,來(lái)控制訪問(wèn)權(quán)限。所以,當(dāng)使用 RegOpenKeyEx 或 RegCreateKeyEx 訪問(wèn)注冊(cè)表的 HKCR 或 HKLM\Software 下的路徑,不需要顯式指定 Wow6432Node,而是應(yīng)當(dāng)通過(guò)其權(quán)限位,如 KEY_READ,和上述二者之一進(jìn)行組合來(lái)控制具體的訪問(wèn)位置。如果開發(fā)者顯示指定 HKLM\Software\Wow6432Node,則程序在任何情況下都是訪問(wèn)這個(gè)路徑。但是在 32 位系統(tǒng)中,這個(gè)路徑默認(rèn)并不存在,如果強(qiáng)行創(chuàng)建,依然沒有任何意義。為了保持統(tǒng)一以及遵循 API 的規(guī)范,我們應(yīng)該做到不顯式指定 Wow6432Node 子鍵。如果不通過(guò)權(quán)限位進(jìn)行訪問(wèn)視圖控制,可能會(huì)造成代碼邏輯混亂,如訪問(wèn)不同的注冊(cè)表路徑實(shí)際上底層邏輯相同,或者同樣的代碼編譯為 32 位或 64 位后邏輯不一致等等。所以,如果要檢測(cè) 32 位和 64 位注冊(cè)表 HKLM\SOFTWARE\KeyName 下是否存在 ValueName,規(guī)范的代碼如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | BOOL?WINAPI RegCheckValueTest(void) { ????DWORD?dwWowFlags[] = { KEY_WOW64_32KEY, KEY_WOW64_64KEY }; ????DWORD?dwWowCount = ARRAYSIZE(dwWowFlags); ????for?(size_t?i = 0; i < dwWowCount; i++) ????{ ????????HKEY?hKey = NULL; ????????DWORD?dwAccess = KEY_READ | dwWowFlags[i]; ????????DWORD?dwError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\KeyName"), dwAccess, &hKey); ????????if?(dwError == NO_ERROR) ????????{ ????????????dwError = RegQueryValueEx(hkeySub, _T("ValueName"), NULL, NULL, NULL, NULL); ????????????RegCloseKey(hKey); ????????????if?(dwError == NO_ERROR) ????????????{ ????????????????return?TRUE; ????????????} ????????} ????} ????return?FALSE; } |
在不同 CPU 位數(shù)的系統(tǒng)上,32 位和 64 位程序分別使用不同的權(quán)限位組合訪問(wèn) HKLM\Software 時(shí),系統(tǒng)底層實(shí)際訪問(wèn)的注冊(cè)表位置如下表所示:
| 系統(tǒng)架構(gòu) | 程序架構(gòu) | 顯式訪問(wèn)路徑 | 實(shí)際訪問(wèn)路徑 | 備注 | ||
| 權(quán)限位不含 KEY_WOW64_* | 權(quán)限位包含 KEY_WOW64_32KEY | 權(quán)限位包含 KEY_WOW64_64KEY | ||||
| 32 位系統(tǒng) | 32 位程序 | HKLM\Software | HKLM\Software | 原因:在 32 位系統(tǒng)上不存在不同訪問(wèn)視圖 影響:參數(shù) KEY_WOW64_* 被系統(tǒng)忽略 | ||
| 64 位系統(tǒng) | 32 位程序 | HKLM\Software | HKLM\Software\Wow6432Node | HKLM\Software\Wow6432Node | HKLM\Software | ? |
| 64 位程序 | HKLM\Software | HKLM\Software | ||||
| 32 位程序 | HKLM\Software\Wow6432Node | HKLM\Software\Wow6432Node | 原因:在路徑中顯式指定了 Wow6432Node 節(jié)點(diǎn) 影響:參數(shù) KEY_WOW64_* 被系統(tǒng)忽略 | |||
| 64 位程序 | ||||||
備注:注意RegOpenKeyEx第四個(gè)形參,KEY_QUERY_VALUE或者KEY_READ、KEY_ALL_ACCESS等,權(quán)限是有區(qū)別的,不要越權(quán)操作,否側(cè)會(huì)被返回為空。
KEY_QUERY_VALUE顯然權(quán)限低于KEY_ALL_ACCESS。
可見,32 位程序訪問(wèn)注冊(cè)表 HKLM\Software 路徑時(shí),默認(rèn)會(huì)被重定向到 HKLM\Software\Wow6432Node,如果權(quán)限位指定 KEY_WOW64_64KEY 時(shí)則訪問(wèn) HKLM\Software。64 位程序訪問(wèn)注冊(cè)表 HKLM\Software 路徑時(shí),默認(rèn)會(huì)訪問(wèn) HKLM\Software,如果權(quán)限位指定 KEY_WOW64_32KEY 時(shí)則訪問(wèn) HKLM\Software\Wow6432Node。當(dāng)然,前提是程序并沒有受到注冊(cè)表虛擬化影響,否則會(huì)被寫入到以下注冊(cè)表位置:
| 1 2 | HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node |
實(shí)際觀察發(fā)現(xiàn) HKCU\SOFTWARE\Wow6432Node 下面只有極少量的數(shù)據(jù),因此 HKCU\SOFTWARE\Wow6432Node 下面(包括其他從此處映射的鍵)的注冊(cè)表鍵通常可以忽略。這可以說(shuō)明,注冊(cè)表針對(duì) 32 和 64 位的重定向僅針對(duì) HKLM(包括其他從此處映射的鍵)有效,如果要訪問(wèn) HKCU 下面的節(jié)點(diǎn),通常無(wú)需考慮重定向的問(wèn)題。而在 32 位系統(tǒng)上,不存在注冊(cè)表重定向的問(wèn)題。
關(guān)于注冊(cè)表重定向的更多信息,請(qǐng)?jiān)L問(wèn):
https://msdn.microsoft.com/en-us/library/aa384253.aspx
https://msdn.microsoft.com/en-us/library/aa384129.aspx
總結(jié)
以上是生活随笔為你收集整理的关于windows注册表重定向和虚拟化分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10 远程桌面无法连接报错
- 下一篇: windows11图文安装流程