C 32位程式與64位程式讀 寫登錄檔的區別

2021-09-07 21:32:59 字數 2195 閱讀 6775

用c#實現登錄檔的讀\寫是一件很容易的事情,在此不做詳細的講解。

用c#操作登錄檔主要用到的兩個函式為(已經滲透到下面的例項程式中,注:要引入microsoft.win32命名空間):

1:讀取鍵值-->registry.localmachine.opensubkey(「..key的路徑...」, true),這裡的第2個bool型別的引數含義為:標誌開啟的鍵值是否可以更改(即:是否可以用setvalue()給鍵賦值),然後呼叫getvalue()方法就能把鍵值讀取出來。

2:寫入鍵值-->registry.localmachine.createsubkey("..key的路徑..."),然後呼叫setvalue()寫入鍵值。

這裡主要講解一下32位程式和64位程式在64位平台上讀\寫登錄檔的區別【注:32位程式是-->build的platform target為x86;64位程式-->build的platform target為x64;並且vs2010在預設的狀態下為x86編譯環境(即:32位)】

簡要複述一下理論基礎:微軟為了讓32位程式不做任何修改就能執行在64的作業系統上,新增了乙個十分重要的wow64子系統來實現這個功能,wow64是windows-32-on-windows-64的簡稱,從總體上來說,wow64是一套基於使用者模式的動態鏈結庫,它可以把32位應用程式的發出的命令翻譯成64位系統可以接受的格式,即:wow 層處理諸如在 32 位和 64 位模式之間切換處理器以及模擬 32 位系統的事務。

32位與64位特點的兩個重要表現方面為:檔案系統與登錄檔

檔案系統:32位程序不能載入64位dll,64位程序也不可以載入32位dll。

登錄檔:為了防止登錄檔鍵衝突,64位機器登錄檔資訊分成了兩個部分。一部分是專門給64位系統(即:64位程式)訪問的,另一部分是專門給32位系統(即:32位程式)訪問的,放在wow6432node下面。(wow6432node這個節 點存在於hkey_local_machine和hkey_current_user下面)

既然知道了登錄檔資訊分成了兩部分,那麼就可以想到:用32位程式和64位程式去操作登錄檔的時候會操作不同位置的登錄檔資訊。下面例子可以充分證明這種說法。

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

microsoft.win32;67

namespace

operateregistrationtable815

16public

static

void

operatingregistrykey()

1730}31

else

3235}36

37//

讀取登錄檔資訊

38using

(registrykey currentkey

=registry.localmachine.opensubkey(

@"software\ericsun\mytestkey",

false

))39

44else45"

, keyvalue);48}

49}50}

51catch

(exception ex)

5253}54

}55}56

將此段程式在x86(32位)平台下編譯、執行,會發現在登錄檔的wow6432node節點下建立了子鍵:ericsun\mytestkey,並且填充了鍵mykeyname的值(用時間加以區分其值),而在software的第一層子節點中並沒有發現此ericsun。可以確定32位程式是操作登錄檔資訊是放在wow6432node節點下的

若我們對這段程式不做任何修改,在x64(或any cpu)的平台下編譯、執行的話,會發現在登錄檔的software節點的第一層子節點中建立出了ericsun節點(並在此節點下建立相應的登錄檔資訊),然後我們用同樣的程式去讀登錄檔的時候也會發現他們讀取的地方不同(以程式中的時間資訊加以區分)

總結:x64,(或者any cpu) platform下的程式會操作64位機器存放登錄檔位置的登錄檔資訊,x86 platform下的程式會操作32位機器存放登錄檔位置的登錄檔資訊(即:wow6432node節點下的登錄檔資訊)

C 32位程式與64位程式讀 寫登錄檔的區別

用c 實現登錄檔的讀 寫是一件很容易的事情,在此不做詳細的講解。用c 操作登錄檔主要用到的兩個函式為 已經滲透到下面的例項程式中,注 要引入microsoft.win32命名空間 1 讀取鍵值 registry.localmachine.opensubkey key的路徑.true 這裡的第2個bo...

C 32位程式訪問64位系統登錄檔

我們已經知道 本機模式 64 位程式執行在純模式下,並且訪問鍵和儲存在以下登錄檔子鍵中的值 hkey local machine software 32 位程式執行在 wow64 模式下,並且訪問鍵和值儲存在以下登錄檔子項中 hkey local machine software wow6432no...

64位系統編譯32位程式

如上使用c4這個小工具時遇到來需要 32位系統的需求,發現使用 m32引數後,編譯提示錯誤,如下 usr bin ld 未知的 模式 32 支援的 elf x86 64 elf32 x86 64 elf i386 i386linux elf l1om elf k1om i386pep i386pe ...