2010-04-22 83 views
2

是否可以確定給定的註冊表項是否被重定向?如何確定註冊表項是否被WOW64重定向?

我的問題是,我想從32位應用程序以通用方式枚舉32位和64位註冊表視圖中的註冊表項。我可以簡單地打開每個鍵兩次,首先使用KEY_WOW64_64KEY,然後使用KEY_WOW64_32KEY。但是,如果密鑰沒有重定向,則會給出完全相同的密鑰,並最終枚舉兩次完全相同的內容;這是我想要避免的。

我的確發現了一些documentation,但它看起來像唯一的方法是檢查配置單元並對密鑰進行一堆字符串比較。我想到的另一種可能性是嘗試在每個子項上打開Wow6432Node;如果它存在,則密鑰必須重定向。即如果我試圖打開HKCU \ Software \ Microsoft \ Windows,我會嘗試打開以下鍵: HKCU \ Wow6432Node,HKCU \ Software \ Wow6432Node,HKCU \ Software \ Microsoft \ Wow6432Node和HKCU \ Software \ Microsoft \ Windows \ Wow6432Node。不幸的是,文檔似乎暗示重定向的關鍵字的孩子不一定被重定向,因此路由也有問題。

那麼,我在這裏有什麼選擇?

回答

2

你的目標不明確。爲什麼需要以32位應用程序的通用方式枚舉32位和64位註冊表視圖中的註冊表項?你想在你的應用程序中使用64位值做什麼?如果x64和x86密鑰有一些不同的值,你會怎麼做?這感覺像是奇怪或錯誤的想法。

鍵重定向的重要原因是:不打破x86應用程序的行爲。例如:COM使用CLSID來查找給定接口的正確實現。除此之外,「正確」意味着它可以由調用者代碼運行,即應該是相同的平臺。這就是爲什麼x64和x86應該有不同的條目集合。其他重定向鍵的原因是相似的。一般來說,對於x86和x64應用程序,重定向鍵必須是不同的

正如雷蒙德陳寫的,「On 64-bit Windows, 32-bit programs run in an emulation layer, and if you don't like that, then don't use the emulator」,我完全同意他的建議。所以我最好的建議,如果你需要這樣的東西,是從64位應用程序。但首先重新考慮你是否真的需要它。

編輯:有samDesired參數的RegOpenKeyEx,你可能會發現有用的。另請看看"Accessing an Alternate Registry View" MSDN文章。

+0

理想情況下,我們希望將整件事重建爲x64,但這仍然是我們前進的道路。與此同時,這是一種權宜之計。該應用程序基本上是一個系統信息/掃描儀組件。例如,檢查註冊表以查看各種運行鍵中的內容。我知道這些特定的鍵恰好被重定向,但我想要一個通用的方法來確定這個,所以我不必事先知道。 – Luke 2010-04-22 17:57:44

+0

正如我所說,我相信正確的方法是使應用程序x64,但你可以用其他方式。查看我的編輯 – SergGr 2010-04-23 15:14:47

+0

我已經知道如何訪問不同的視圖;問題在於無法確定給定密鑰是否具有備用視圖。嘗試在沒有密鑰的密鑰上打開備用視圖會爲您提供共享視圖。 – Luke 2010-04-23 18:16:21

1

你需要付出相當大的痛苦,這取決於操作系統版本。完整列表是available here