程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 64位系統下System32文件系統重定向,system32重定向

64位系統下System32文件系統重定向,system32重定向

編輯:C++入門知識

64位系統下System32文件系統重定向,system32重定向


前言

      因為一次偶然的機會,需要訪問系統目錄“C:/Windows/System32“文件夾下的內容,使用的測試機器上預裝了win7 64系統。在程序運行中竟然發生了該文件路徑不存在的問題!!通過查看網上相關的資料,了解到64位系統下,System32(同時也包括Program Files)這兩個文件夾被動態地重定向了。為了可以直觀的反映這個問題,這裡將編寫一個小的測試程序進行驗證。

 

實例驗證

      首先隨機選擇一個文件,並將其拷貝到系統目錄的System32文件夾下。本文選擇QQ啟動程序進行驗證(主要是QQ自帶企鵝圖標易於辨認,哈哈),如圖1所示

圖1 手動將QQ拷貝到系統System32文件夾下

    編寫實際測試程序,直接上代碼(調用了windows系統API PathFileExists來判斷文件是否存在)

/************************************************************************/
/* file   : 驗證在64位機器上system32以及Program Files的exe不能用API直接找到
 * author : Huagang Li
 * date   : 2014-8-23 01:22:55
 * tips   : 64位系統下system32 文件夾重定向機制
 *
 */
/************************************************************************/
#include <Windows.h>
#include <string>
#include <tchar.h>
#include <Shlwapi.h>

#pragma comment(lib,"Shlwapi.lib")  // PathFileExists鏈接時需要

int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
    std::wstring strFile = L"C:\\Windows\\System32\\QQProtect.exe";

    if (::PathFileExists(strFile.c_str()))
    {
        ::MessageBox(NULL, _T("文件存在"), _T("Good"), MB_OK);
    }
    else
    {
        ::MessageBox(NULL, _T("文件不存在"), _T("Opps"), MB_OK);
    }

    return EXIT_SUCCESS;
}

      運行的結果如圖2所示:

圖2 文件不存在??

      從上面的結果可以看出,在調用windows API檢測QQ文件是否存在時,系統給出了一個令人匪夷所思的結論:文件不存在!!但這個文件確實被拷貝進了該目錄下啊。要解釋這個奇怪的現象,就得從windows 64位系統中的文件系統重定向說起。當微軟開發了64位系統時,為了做到向前兼容,需要重新實現32為系統中需要的相關文件(system32文件夾下的dll以及exe)。然而,這些新的實現版本是基於64位系統開發的,因此如果繼續存放於System32文件夾下,顯得名不副實。可是為了做到向前兼容,又需要將這些依賴文件存放於這個目錄下,為了解決上述沖突,微軟采用了一種文件系統重定向機制:在64位系統下,System32文件夾下的文件實際重定向到SysNative這個文件夾(注意,這個文件夾不能直接找到)。這樣,就可以將64位系統下64位的庫和應用程序存放於System32文件夾下(因為已經重定向到SysNative了),而32位的庫和應用程序則被存放在另一個叫做SysWOW64的文件夾中。具體的對應關系為:

\Windows\SysWOW64  文件夾下存放32位的庫和應用程序 (WOW64 == Windows on Windows 64 bit )

\Windows\System32  文件夾下存放64位的庫和應用程序

      為了驗證文件系統重定向,將前文中的測試路徑改為:

std::wstring strFile = L"C:\\Windows\\SysNative\\QQProtect.exe";

     測試結果如圖3所示:

圖3 改為Sysnative結果

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved