1. 程式人生 > >64位系統下檔案重定向和登錄檔重定向

64位系統下檔案重定向和登錄檔重定向

x64下檔案重定向預設是開啟的,檔案的重定向,需要了解三個API:
        Wow64EnableWow64FsRedirection
        Wow64DisableWow64FsRedirection
        Wow64RevertWow64FsRedirection


    不過MSDN說了Wow64EnableWow64FsRedirection不好云云,自己看:
    The Wow64EnableWow64FsRedirection function enables or disables file system redirection for the calling thread. 
This function may not work reliably when there are nested calls. Therefore, this function has been replaced by the Wow64DisableWow64FsRedirection and Wow64RevertWow64FsRedirection functions.
BOOLEAN Wow64EnableWow64FsRedirection( BOOLEAN Wow64FsEnableRedirection);

    所以我們就使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection,這兩個函式在Kernel32.dll裡面,當然32位的這個DLL是沒有這兩個函式的,因此需要從dll中匯出來使用。

另外%ProgramFiles%這個環境變數並不受這兩個API的影響,而只跟應用程式本身是否是32還是64位有關,當你使用ExpandEnvironmentStrings來展開%ProgramFiles%時,如果是32位程式,則返回的路徑是C:/Program Files (x86),假設你的系統安裝在c盤。而如果是64位程式,則返回C:/Program Files。


關於檔案和登錄檔的重定向:


      需要這個技術的原因是需要在x64系統上面把32位程式和64位程式分離開。這種技術有個強大的名字叫WOW64,注意不是魔獸世界64級哦,哈哈。


      出於一些特殊的目的,一些登錄檔鍵被分成了兩個部分,主要有以下一些:


      HKEY_CLASSES_ROOT 
      HKEY_CURRENT_USER/Software/Classes
      HKEY_LOCAL_MACHINE/Software 

      HKEY_USERS/*/Software/Classes 

      HKEY_USERS/*_Classes

      注:*號表示匹配所有 


      簡單來說32位程式在訪問這些鍵的時候,會訪問到下一級的Wow6432Node子鍵上去(自動定位,由WOW64機制來完成),譬如訪問HKEY_LOCAL_MACHINE/Software/safe的時候,會重定向後訪問到HKEY_LOCAL_MACHINE/Software/Wow6432Node/safe,當然64位程式的訪問不受影響,此過程對使用者透明。

      程式碼編寫:其實登錄檔的重定向控制比檔案的重定向控制簡單很多,認識下面兩個巨集就可以了。

            #define KEY_WOW64_32KEY         (0x0200)
            #define KEY_WOW64_64KEY         (0x0100)
         (來之winnt.h) 


      對於登錄檔建立和開啟的兩個API(RegCreateKeyEx和RegOpenKeyEx)都有一個引數是關於開啟的登錄檔控制代碼的許可權的,使用分32程式和64位程式,假設原有訪問許可權為KEY_ALL_ACCESS:


      1、32位程式,如果不修改許可權組值,則訪問的是重定向後的登錄檔鍵值,而如果把許可權設定為KEY_ALL_ACCESS | KEY_WOW64_64KEY,則明確指定了可以訪問64位的登錄檔。
      2、64位程式,如果不修改許可權值,則訪問的是64位的登錄檔的原登錄檔值,如果把許可權值設定為KEY_ALL_ACCESS | KEY_WOW64_32KEY,則明確指定了去訪問32位的登錄檔鍵值。 


      P.S.總之上面提到的一些鍵值,不同的系統也許有區別,建議寫程式碼的時候多測試。而且HKEY_LOCAL_MACHINE/Software/下有些項是32位和64位共享的也就是隻有一份拷貝,詳情可以見http://support.microsoft.com/kb/896459/en-us 另外就是關於在x64下注冊表的反射,這個對於相容32位程式是非常重要的,也是可以通過API來控制指定鍵的反射的開啟和關閉的,不過這不是這裡討論的重點。

轉自:http://blog.csdn.net/magictong/article/details/5892209