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

2022-02-10 07:44:21 字數 3033 閱讀 8571

我們已經知道:

①:本機模式 64 位程式執行在純模式下,並且訪問鍵和儲存在以下登錄檔子鍵中的值:hkey_local_machine\software

②:32 位程式執行在 wow64 模式下,並且訪問鍵和值儲存在以下登錄檔子項中:hkey_local_machine\software\wow6432nod

那麼要實現32為程式訪問64位登錄檔資訊,還要知道如下概念:1:檔案系統轉向。2:登錄檔重定向**向)。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位應用程式預設都是開啟的。但是這種轉向對於我們來說並不總是需要的。那麼我們可以在

wow64disablewow64fsredirection(關閉系統轉

向),wow64revertwow64fsredirection(開啟系統轉向),

wow64enablewow64fsredirection(打

開系統轉向)。

但是wow64enablewow64fsredirection在巢狀使用的時候不可靠,所以通常用上面的

wow64revertwow64fsredirection來開啟檔案系統轉向

功能。在c#中,我們可以利用dllimport直接呼叫這兩個函式。

②:登錄檔重定向**向)

若要支援的 32 位和 64 位 com 註冊和程式共存狀態,wow64 子系統提供 32 位程式使用的登錄檔的另乙個檢視。在 wow64 子系統使用登錄檔

重定向截獲位級別的登錄檔呼叫。登錄檔重定向還可以確保登錄檔呼叫被定向到在登錄檔中正確的分支。

當我們安裝新程式或 windows x64 版的計算機上執行程式時,所做的 64 位程式的登錄檔呼叫訪問

hkey_local_machine\software 登錄檔子鍵

不重定向。wow64 截獲由 32 位程式的登錄檔呼叫到

hkey_local_machine\software,然後將它們重定向到

hkey_local_machine\software\wow6432node 子鍵。 通過重定向僅 32 位程式呼叫,wow64

可確保程式始終寫入相應的登錄檔子鍵。

登錄檔重定向不要求程式**修改,和此過程是對使用者透明。

③:登錄檔反射

反射使兩個相同的登錄檔,以支援同時進行的本機和 wow64 操作的物理副本的存在,

開啟登錄檔的 64 位節在所有時間和登錄檔反射提供了一種容納 32 位的實時方法。

簡單的了解了這些,下面說一下具體的實現步驟:

關閉64位(檔案系統)的操作轉向

獲得操作key值的控制代碼

關閉登錄檔轉向(禁止特定項的登錄檔反射)

獲取訪問的key值

開啟登錄檔轉向(開啟特定項的登錄檔反射)

開啟64位(檔案系統)的操作轉向

【注:由於我們在程式中用了dllimport,所以要引入命名空間:system.runtime.interopservices】

下面請看**示例

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

microsoft.win32;

6using

system.runtime.interopservices;78

namespace

operateregistrationtable9"

, value);21}

22}2324

public

class

utility

2571

72return

hkey_classes_root;73}

7475

public

static

string

get64bitregistrykey(

string

parentkeyname,

string

subkeyname,

string

keyname)

76110

111//

開啟檔案系統轉向

112wow64revertwow64fsredirection(oldwow64state);

113114

//返回key值

115return

result.tostring().trim();

116}

117catch

(exception ex)

118121

}122

123#endregion

124}

125}

get64bitregistrykey函式的三個引數分別代表:主鍵名(如:hkey_local_machine等),子鍵名,key名,返回的是key的value(64位系統登錄檔的鍵值),通過上面的方法就完全可以實現用32程式訪問64位系統登錄檔(即:64位程式所訪問的登錄檔位置)。

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

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

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

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

C 32位系統與64位系統基本資料型別

說明32位位元組數 64位位元組數 取值範圍 bool 布林型1 1true,false char 字元型1 1 128 127 unsigned char 無符號字元型11 0 255 short 短整型2 2 32768 32767 unsigned short 無符號短整型22 0 65535...