64位系统下System32文件系统重定向

64位系统下System32文件系统重定向

  

因为一次偶然的机会,需要访问系统目录“C:/Windows/System32“文件夹下的内容,使用的测试机器上预装了win7 64系统。在程序运行中竟然发生了该文件路径不存在的问题!!通过查看网上相关的资料,了解到64位系统下,System32(同时也包括Program Files)这两个文件夹被动态地重定向了。为了可以直观的反映这个问题,这里将编写一个小的测试程序进行验证。

 

实例验证

      首先随机选择一个文件,并将其拷贝到系统目录的System32文件夹下。本文选择QQ启动程序进行验证(主要是QQ自带企鹅图标易于辨认,哈哈),如图1所示

QQ拷贝到System32下

图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所示:

Opps

图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所示:

Good

图3 改为Sysnative结果

      上述结果显示了,64位系统下如果需要访问System32目录下的文件,一个可行的方法是将访问路径改为SysNative。但是由于sysnative文件夹不能通过windows资源管理器访问到(如图4所示),因此对于一般人来讲,这样的改名其实很困惑。

sysnative不存在

图4 资源管理器访问不到Sysnative文件夹

      既然微软开发了文件系统重定向机制机制,那就可以通过一定的方式操作这种机制。通过查看msdn可以发现,http://msdn.microsoft.com/en-us/library/aa365743.aspx 提供的方式可以禁用文件系统重定向问题。因此,本文尝试调用这个API接口进行验证:

/************************************************************************//* 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";    // 64位系统下 system32 文件系统重定向    PVOID OldValue = NULL;    Wow64DisableWow64FsRedirection(&OldValue);    if (::PathFileExists(strFile.c_str()))    {        ::MessageBox(NULL, _T("文件存在"), _T("Good"), MB_OK);    }    else    {        ::MessageBox(NULL, _T("文件不存在"), _T("Opps"), MB_OK);    }    Wow64RevertWow64FsRedirection(OldValue);    return EXIT_SUCCESS;}

运行后得到的结果和上文中Sysnative一样,如图5所示:

Good

图5 禁用文件系统重定向机制后的结果

      注意,由于禁用文件系统重定向后可能引起其他一些问题(例如原本依赖于System32下的dll文件加载失败),因此在禁用并完成需要的操作后,要回复原来的禁用状态(如程序中Wow64RevertWow64FsRedirection(OldValue);)。这样,在调用PathFileExists后,恢复了文件系统重定向机制,不会影响后续操作。

     另外,64位系统下Program Files与Program Files(x86)的关系就与上面的System32和S也是WOW64一致,也存在文件系统重定向。

 

结论

      1. 64位系统下存在文件系统重定向机制(File System Redirector

      2. System32文件夹动态被定向到SysNative文件夹

      3. 可以通过windows API Wow64DisableWow64FsRedirection禁用这种定向机制

 

参考链接

[1] http://msdn.microsoft.com/en-us/library/aa384187.aspx

[2] http://msdn.microsoft.com/en-us/library/aa365743.aspx

[3] http://blog.sina.com.cn/s/blog_792da39c01013bzh.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Control System Builder是一个可编程的中控系统软件,它允许用户通过配置、编程和部署来创建定制化的控制系统。该软件提供了一个直观的界面,用户可以使用该界面进行系统设计、设备配置和功能设置。 Control System Builder的下载过程很简单。首先,你需要访问该软件的官方网站。在网站的首页上,你可以找到与下载相关的链接。点击该链接后,你将被重定向到下载页面。 下载页面会列出可用的版本及其相关信息。你可以根据你的操作系统选择适合你的版本(例如Windows、Mac OS或Linux)。一旦你选择了正确的版本,点击下载按钮就可以开始下载了。 下载过程可能需要一些时间,取决于你的网络连接和文件大小。你可以选择将软件保存到你电脑的特定文件夹中,或者直接保存到默认的下载文件夹中。一旦下载完成,你可以在文件管理器中找到下载好的软件文件。 另外,安装该软件之前,你需要确保你的操作系统满足最低的系统要求。一旦你确认了系统要求,你可以双击安装文件,按照提示进行安装。 安装完成后,你可以打开Control System Builder软件并开始使用它。通过该软件,你可以按照自己的需求进行中控系统的编程、配置和部署。你可以连接各种设备、设置各种功能,并创建一个完全定制化的控制系统。 总的来说,下载Control System Builder是一个简单的过程。只需访问官方网站、选择合适的版本、下载并安装软件,你就可以开始使用这个强大而灵活的中控系统软件了。 ### 回答2: 可编程中控系统(Control System Builder)是一款用于设计和编程控制系统的软件工具。它提供了一个直观和用户友好的界面,使用户能够轻松地创建和定制各种控制系统,包括工业自动化系统、家庭自动化系统和建筑自动化系统等。 Control System Builder具有丰富的功能和工具,包括图形化编程界面、预定义的控制组件和库、实时仿真器等。用户可以通过简单拖拽和连接的方式,将各个控制组件连接起来,形成自己所需的控制逻辑。在连接过程中,系统会自动检测并解决潜在的冲突和错误,确保系统的稳定性和可靠性。 该软件还提供了强大的运行时功能,支持实时监测和调试控制系统的运行状态。用户可以在系统运行过程中进行参数调整、观察各个组件的输入输出等,以便对系统进行优化和改进。 Control System Builder还具有灵活的通信和数据交换功能,可以与各种外部设备和传感器进行数据交互。用户可以通过配置简单的通信接口,实现与外部设备的连接和数据传输,实现更复杂的控制功能。 总之,Control System Builder是一款功能强大、易于使用的可编程中控系统的设计和编程工具。它通过提供直观的操作界面、丰富的功能和工具,使用户能够快速、灵活地创建、定制和优化各种控制系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值