32位程序訪問64位注冊表
Ⅰ 如何將32位的文件轉換為64位的
摘要 把32位的注冊表文件轉換為64位的方法:
Ⅱ 32位操作系統怎麼打開64位的注冊表
這個貌似不可以的吧,我用硬碟安裝法安裝64位系統,32位PE就是無法運行任何64位的文件啊,還是放棄這樣的想法吧,估計有牛人知道哇
Ⅲ 有沒有哪位有C#或VB.NET的32位程序讀寫win7 64位注冊表的可用的例子
try
{
if (int.Parse(Distinguish64or32System()) == 0x40)
{
Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey("Wow6432Node", true).OpenSubKey("Microsoft", true).OpenSubKey("Internet Explorer", true).OpenSubKey("MAIN", true).CreateSubKey("FeatureControl").CreateSubKey("FEATURE_BROWSER_EMULATION").SetValue("BOCIES.exe", 0x1f40);
}
else
{
Registry.LocalMachine.OpenSubKey("SOFTWARE", true).OpenSubKey("Microsoft", true).OpenSubKey("Internet Explorer", true).OpenSubKey("MAIN", true).CreateSubKey("FeatureControl").CreateSubKey("FEATURE_BROWSER_EMULATION").SetValue("BOCIES.exe", 0x1f40);
}
}
catch (Exception exception)
{
GobleExceptionMsgLog.AddText(exception.Message);
}
Ⅳ 如何解決易語言編譯的32位程序在64位系統運行的注冊表寫入轉向問題
可能你所遇到的問題是編譯器鏈接出錯的問題吧,正常情況下,在64位運行正常,如果是編譯時出錯,請找到易語言安裝文件夾,我不清楚你用的什麼版本,安裝文件夾下有個靜態編譯修正器,如果這個位置沒有的話,請找到tools目錄下,會看到這工具!
(如果以上沒有解決你的問題,我可以把我的版本發給你用!)
【我用心解答,如果解決了您的問題,一定記得採納額!】
Ⅳ 64位系統與32位的問題 200高分!
推薦windows7旗艦版64位,在兼容上已經做得很好!
64 位與 32 位電腦相比,64 位電腦能處理更大數量的信息。由於 64 位計算機可以使用更多 RAM(4 GB 以上),因此當您同時運行多個程序時,它具有更強的響應能力。
無論您選擇哪種系統,Windows 7 均適用。除家庭普通版外,其他所有零售版本的 Windows 7 包中都包含 32 位以及 64 位軟體。
----------------------------------------------------------------------
1、為什麼需要64位操作系統?
最簡單的原因,每個人的要求都是越來越高的,有更好的東西,當然是受歡迎的。其它的原因:隨著多媒體功能的滲入和硬體價格的日趨平民化,越來越多的人加入到PC應用的行列,造就了一大批進行家庭多媒體創作等應用的非專業人士,很多人不再滿足於用電腦打字、作表格、上網聊天等簡單應用。隨著人們對電腦要求越來越高,32位系統已力不從心。
2、64位與32位相比有啥特色?
32位Windows能支持最多4GB的系統內存,每個處理器可最多使用2GB專用內存。 x64 Edition當前支持多達128GB內存,隨著硬體功能的增強和內存大小的增加,有可能支持多達16TB(1TB=1000GB)的虛擬內存;使用 64 位的 Windows,應用程序可以將足夠多的數據預載入到虛擬內存中,以便 Itanium 處理器快速訪問這些數據。這種特性減少了將數據載入虛擬內存,以及查找讀取數據並將數據寫入數據存儲設備所花費的時間,因此可使應用程序運行地更快、更高效。
從個人桌面系統用戶的角度來看,內存容量的限制只是體現64位計算技術優勢的一個方面,大量數據處理才是64位計算真正發揮功效的地方。PC已經不僅僅是用戶計算的工具,它更是「多媒體」中心,很多這方面應用是32位計算根本無法滿足的。如在家用領域,32位無法實現高保真的聲像,甚至無法完成20分鍾視頻的播放和編輯;在建築、游戲設計領域,32位計算無法完成大量的數據計算和處理;在互聯網上,32位計算無法實現大量的各種類型的數據搜索——這些應用都需要64位計算來實現。
64位和32位體系結構的比較:
地址空間 64 位 Windows 32 位 Windows
物理內存 128 GB 4 GB
虛擬內存 16 TB 4 GB
頁面文件 512 TB 16 TB
頁面緩沖池 128 GB 470 MB
非頁面緩沖池 128 GB 256 MB
系統緩存 1 TB 1 GB
3、64位的劣勢和門檻,32位程序如何在64位上運行?
對目前而言,64位Windows最大的一個劣勢就是兼容性,而兼容性方面最突出的就是各種硬體設備的驅動程序。64位和32位Windows XP的硬體驅動程序完全不能混用。一般的軟體程序在64位上無問題,但是如果該軟體安裝時還會向系統中裝入驅動程序,則是不行的。所有目前大多的殺毒軟體在64位上都是跑不起來的,同理針對64位系統的強勢病毒也不多。
那麼32位程序如何在64位上運行的呢?
1)重定向技術
為了將32位和64位程序分開,在64位系統上運行的運行的32位程序,有一個被叫做 wow64的模擬器,幫助32位程序模擬運行在64位下。這樣的技術叫做重定向技術,設計文 件重定向和注冊表重定向
2)文件如何被重定向?
64位的文件系統,%systemroot%/system32 目錄和programfiles目錄被保留給64位文件使用,而32位文件會被重定向到%systemroot%/SysWOW64目錄和programfiles(x86)目錄。換句話說,所有的32位程序只會出現在%systemroot%/SysWOW64目錄和programfiles(x86)目錄。任何32位程序試圖訪問%systemroot%/system32 和programfiles目錄的企圖都會被重定向到%systemroot%/SysWOW64目錄和programfiles(x86)目錄。這個是一個默認的行為,除非程序的線程明確的指名需要關閉這種重定向機制。
3)注冊表如何重定向?
64位機器維護兩份注冊表,一份32位注冊表項,一份64位注冊表項。64位系統默認的64 位版本注冊表編輯器 (Regedit.exe) 可顯示 64 位和 32 位的 注冊表項。
在 64 位版本的注冊表編輯器中,32 位注冊表項顯示在以下注冊表項下:
HKEY_LOCAL_MACHINE"Software"WOW6432Node可以使用 %systemroot%"Syswow64 文件夾中的 32 位版本注冊表編輯器查看或編輯 32 位注冊表項和項值。
WOW64 使用了一個「注冊表反射器」來在 64 位注冊表視圖和 32 位注冊表視圖之間鏡像某些注冊表項和項值。
受反射的注冊表項
WOW64 注冊表反射器可能會在反射過程中修改注冊表項的內容和項值,目的是為了調整路徑名等。因此,32 位的內容與 64 位的內容可能會有所不同。下面的注冊表項會被反射:
· HKEY_LOCAL_MACHINE"Software"Classes
· HKEY_LOCAL_MACHINE"Software"COM3
· HKEY_LOCAL_MACHINE"Software"Ole
· HKEY_LOCAL_MACHINE"Software"EventSystem
· HKEY_LOCAL_MACHINE"Software"RPC
· HKEY_CLASSES_ROOT
· HKEY_CURRENT_USER"Software"Classes
· HKEY_USERS"*"Software"Classes
· HKEY_USERS"*_Classes
4、64位操作系統在安全性方面有哪些優越性呢?
EVP(Enhanced Virus Protection,增強型病毒防護)是AMD Althlon 64處理器中採用的一種全新的防毒技術,但它只提供硬體支持,這一功能與Windows XP SP2或64位Windows XP的DEP(Date Execution Prevention,數據執行保護)技術相結合。兩者結合後將生成一種全新的惡意代碼防禦機制:將所有內存位置均標記為不可執行——除非該位置已明確包含可執行代碼。當有攻擊程序企圖在不可執行的內存位置中插入代碼並執行代碼時,這一行為將會被阻止。不難想像,除非得到了用戶的允許,不明代碼是很難執行的,這能在很大程度上扼制病毒等惡意代碼的入侵。
Ⅵ 如何把32位的注冊表文件轉換為64位的
把32位的注冊表文件轉換為64位的方法:
1.為了防止注冊表鍵沖突,注冊表在某些鍵也分成了兩個部分。
2.一部分是專門給64位系統訪問的,另一部分是專門給32位系統訪問的,放在Wow6432Node下面。當32位程序去訪問某些鍵值的時候,和文件轉向類似,系統也會自動地把程序的訪問轉向到Wow6432Node下面。
3.Wow6432Node這個節點存在於HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面。和RegOpenKeyEx方法辦到。RegOpenEx方法在C#中調用聲明方法如下:
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint RegOpenKeyEx( UIntPtr hKey,string lpSubKey, uint ulOptions,int samDesired,out IntPtr phkResult);
其中需要注意的是samDesired這個參數。這個參數可以取 KEY_ALL_ACCESS, KEY_QUERY_VALUE, KEY_WOW64_64KEY等值(詳情可以查閱MSDN)。已經關閉了文件系統的轉向,那麼就可以利用:(KEY_QUERY_VALUE | KEY_WOW64_64KEY)來得到注冊表的完全訪問許可權。這個地方需要注意的是,在Vista下面,有一些注冊表項是只讀的,如果用了KEY_ALL_ACCESS這個參數,就會出現「Access is denied」 這個錯誤(ErrorCode = 5)。因此,如果不是要寫入注冊表的話,不要使用KEY_ALL_ACCESS。
Ⅶ 32位注冊表無法導入到64位系統中
64位的系統最好就只是裝64位的軟體好了,32位的的注冊表信息就算可以導入也只入一部份,有的軟體支持兩種,但總而言之,64位的注冊表為了兼容,也將注冊表 分為了兩個部份,一個部分供32位的使用,一個部份供64位的使用。
當前計算機系統已經逐漸地從32位轉到64位,XP,2003,VISTA都有64位的版本。從目前而言,32位應用程序還是佔了絕大多數,但是也有部分應用程序既有32位版本,又有64位版本。為了保證32位程序可以順利運行在64位系統上,微軟提供了一套叫WOW64的模擬機制。通常把這套系統稱為WOW64。從總體上來說,WOW64是一套基於用戶模式的動態鏈接庫,它可以把32位應用程序的發出的命令翻譯成64位系統可以接受的格式。從下圖中可以大概地看出32位應用程序運行在64位系統上的方式。
當32位應用程序運行的時候,首先會去啟動本地庫載入器(Native Library Loader)。載入器會識別出應用程序是32位的並且用特殊的方式來處理它。載入器會為32位應用程序建立起一個WOW64的模擬環境並把控制權交給32位的Ntdll.dll。運行在32位應用程序和64位Ntdll.dll之間的WOW64模擬環境會將32位應用程序的指令翻譯成64位Ntdll.dll可以接受的方式,並且它也可以把系統的指令翻譯成32位應用程序可以接受的方式。
2 如何判斷系統是64位
3 文件系統的轉向
32位進程不能載入64位Dll,64位進程也不可以載入32位Dll。Windows的系統目錄包含了所有安裝的應用程序和它們的Dll文件,根據我們所述的規則,它應該被分為給64位應用程序的目錄和給32位應用程序的目錄。如果不這樣,我們就無法區分32位和64位的Dll文件。對於64位應用程序,其文件通常被放在%windir%\system32和%programfiles%(比如:c:\program files)。對於32位應用程序,其文件通常在%windir%\syswow64和C:\program files (x86)下面。如果我們用32位程序去訪問%windir%\system32,不管我們用硬編碼還是其它的方式,系統都會自動地給我們轉向到%windir%\syswow64下面。這種轉向對於每個32位應用程序默認都是打開的。但是這種轉向對於我們來說並不總是需要的。那麼我們可以在C#裡面調用相關的API來關閉和打開這種轉向。常用的函數有3個,(關閉系統轉向),Wow64RevertWow64FsRedirection(打開系統轉向),Wow64EnableWow64FsRedirection(打開系統轉向)。但是Wow64EnableWow64FsRedirection在嵌套使用的時候不可靠,所以通常用上面的Wow64RevertWow64FsRedirection來打開文件系統轉向功能。在C#中,我們可以利用DllImport直接調用這兩個函數。但是要注意到的是,在32位的Kernel.dll中是沒有這兩個函數的。那麼在C++中應該使用LoadLibrary來動態載入這兩個函數。否則會因為找不到這兩個函數而無法通過編譯。而且在目前的使用中,發現這兩個函數有一個小小的問題。如果我們在調用了後去調用Comdlg32.dll的GetOpenFileName函數,是無法調用成功的。但是也得不到Error的值。在C#中可以用如下的代碼關閉和打開文件的轉向。
聲明調用規則
[DllImport( "Kernel32.dll", CharSet=CharSet.Auto, SetLastError = true)]
public static extern bool (ref IntPtr ptr);
[DllImport( "Kernel32.dll", CharSet=CharSet.Auto, SetLastError = true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
關閉轉向
(ref Ptr);
打開轉向
Wow64RevertWow64FsRedirection(Ptr);
要注意的是,關閉和打開要成對出現。以免出現混亂的行為。
4 注冊表的轉向
為了防止注冊表鍵沖突,注冊表在某些鍵也分成了兩個部分。一部分是專門給64位系統訪問的,另一部分是專門給32位系統訪問的,放在Wow6432Node下面。當32位程序去訪問某些鍵值的時候,和文件轉向類似,系統也會自動地把程序的訪問轉向到Wow6432Node下面。Wow6432Node這個節點存在於HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面。如果我們希望關閉這個轉向的話,可以通過上面的和RegOpenKeyEx方法辦到。RegOpenEx方法在C#中調用聲明方法如下:
[DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint RegOpenKeyEx( UIntPtr hKey,string lpSubKey, uint ulOptions,int samDesired,out IntPtr phkResult);
其中需要注意的是samDesired這個參數。這個參數可以取 KEY_ALL_ACCESS, KEY_QUERY_VALUE, KEY_WOW64_64KEY等值(詳情可以查閱MSDN)。當我們已經關閉了文件系統的轉向,那麼就可以利用:(KEY_QUERY_VALUE | KEY_WOW64_64KEY)來得到注冊表的完全訪問許可權。這個地方需要注意的是,在Vista下面,有一些注冊表項是只讀的,如果用了KEY_ALL_ACCESS這個參數,就會出現「Access is denied」 這個錯誤(ErrorCode = 5)。因此,如果不是要寫入注冊表的話,最好不要使用KEY_ALL_ACCESS。我們可以用如下代碼來完全訪問注冊表。
//use this function transfer the string key name to HKEY handle
private static UIntPtr TransferKeyName(string keyName)
{
UIntPtr HKEY_CLASSES_ROOT = (UIntPtr)0x80000000;
UIntPtr HKEY_CURRENT_USER = (UIntPtr)0x80000001;
UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
UIntPtr HKEY_USERS = (UIntPtr)0x80000003;
UIntPtr HKEY_CURRENT_CONFIG = (UIntPtr)0x80000005;
switch(keyName)
{
case "HKEY_CLASSES_ROOT":
return HKEY_CLASSES_ROOT;
case "HKEY_CURRENT_USER":
return HKEY_CURRENT_USER;
case "HKEY_LOCAL_MACHINE":
return HKEY_LOCAL_MACHINE;
case "HKEY_USERS":
return HKEY_USERS;
case "HKEY_CURRENT_CONFIG":
return HKEY_CURRENT_CONFIG;
}
return HKEY_CLASSES_ROOT;
}
public static bool OpenRegKey(string keyName, string subKeyName)
{
UIntPtr hKey = TransferKeyName(keyName);
UIntPtr phkResult = UIntPtr.Zero;
int KEY_QUERY_VALUE = (0x0001);
int KEY_WOW64_64KEY = (0x0100);
int KEY_ALL_WOW64 = (KEY_QUERY_VALUE | KEY_WOW64_64KEY);
if(Is64bitOS && !IsWow64RedirectionEnabled) //The os is 64 bit and the FileRedirection is closed
{
samDesired = KEY_ALL_WOW64;
}
if(RegOpenKeyEx(hKey, subKeyName,0,samDesired,out phkResult) == 0) //ERROR_SUCCESS=0
{
return true;
}
int errCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
return false;
}