2012-12-31 35 views
1

我有一個x64應用程序在x64操作系統上運行,我試圖從x86註冊表讀取數據。
這是我的代碼:KEY_WOW64_32KEY不從x64應用程序重定向

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | KEY_WOW64_32KEY, &hKey); 

我想嘗試打開HKCU \ SOFTWARE \ Wow6432Node \ Idontexist,而是它的開放HKCU \ SOFTWARE \ Idontexist

我看着在過程監控,如果我用KEY_WOW64_64KEY或KEY_WOW64_32KEY,都試圖讀取HKCU \ SOFTWARE \ Idontexist,而不是HKCU \ SOFTWARE \ Wow6432Node \ Idontexist

編輯:操作系統是Windows 7,如果這有什麼區別。

回答

2

this MSDN page中詳細顯示了在Windows 7上重定向和反映哪些密鑰。在這裏重新生成太大,但您可以清楚地看到除Classes子項之外的HKCU \ Software密鑰爲共享,未重定向。

0

Wow6432Node意味着WOW64虛擬化。 64位進程可以打開直接在32位的虛擬鍵:

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Wow6432Node\\Idontexist", 0, KEY_READ, &hKey); 

如果您需要在同一代碼在32位和64位和兩個訪問Wow6432Node鍵運行,然後在使用IsWow64Process() 32位代碼來檢測WOW64,然後相應adust的代碼,例如:

#ifdef _WIN64 
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Wow6432Node\\Idontexist", 0, KEY_READ, &hKey); 
#else 
BOOL bIsWow64 = FALSE; 
IsWow64Process(GetCurrentProcess(), &bIsWow64); 
DWORD Wow64Flags = (bIsWow64) ? KEY_WOW64_32KEY : 0; 
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | Wow64Flags, &hKey); 
#endif 

但是,你真的不應該直接訪問Wow6432NodeKEY_WOW64_32KEY應正常工作如果目標關鍵是正確地分爲32位和64位的觀點:

DWORD Wow64Flags; 
#ifdef _WIN64 
Wow64Flags = KEY_WOW64_32KEY; 
#else 
BOOL bIsWow64 = FALSE; 
IsWow64Process(GetCurrentProcess(), &bIsWow64); 
Wow64Flags = (bIsWow64) ? KEY_WOW64_32KEY : 0; 
#endif 
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | Wow64Flags, &hKey); 

如果不工作,比意味着Software\\Wow6432Node\\Idontexist不應該擺在首位存在,可能是由64位進程錯誤地創建的,該進程沒有正確使用KEY_WOW64_...標誌。