Windows虚拟化与重定向
Ballance在文件系统与注册表中会存有一部分数据,但这些数据有时可能并不会老老实实呆在原本位置,经常会莫名其妙地出现在其他位置,并且您也对修改何处的数值感到困惑,本页面将指导您如何根据您自身的情况找到真正的数据位置所在。
目录
默认位置
Ballance的注册表默认存储位置为:HKEY_LOCAL_MACHINE\SOFTWARE\Ballance
(Ballance的B有时为大写,有时为小写,但无影响[1])。Ballance的文件系统默认存储位置即为安装Ballance的位置。这些位置本应当不会变动,但是由于下述的一些Windows特性,可能会导致一些意想不到的情况发生,例如文件或注册表项不在原本位置。
概念
在您继续了解之前,您需要先了解几个新的Windows概念。
注册表的64位重定向
Windows有32位版本(x86)和64位版本(x64)之分。通常来说,您运行的Windows XP SP3均为32位版本(Windows XP虽然存在一个名为Windows XP x64的发行版,但是应用极少,可以忽略其在玩家中的存在性),而对于Windows Vista,Windows 7,Windows 8/8.1和Windows 10来说,您需要通过右键计算机(此电脑),选择属性来查看您的计算机位数版本。
程序也有32位版本和64位版本之分。Ballance总是一个32位程序。
32位程序需要借由一个兼容层面才能在64位的Windows上进行运行,而这个兼容层只有一条规则对于Ballance具有影响:HKEY_LOCAL_MACHINE\SOFTWARE
下的任何键操作(读/写)都将被重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
下
另外,对于64位的Windows来说,通过运行C:\Windows\system32\regedit.exe
可以浏览64位注册表,即注册表的实际存储状况。通过运行C:\Windows\SysWOW64\regedit.exe
可以浏览32位注册表,即经过重定向的注册表,也是Ballance代码眼中的注册表。对于32位系统来说,不存在C:\Windows\SysWOW64\regedit.exe
。运行C:\Windows\system32\regedit.exe
即可展示注册表,也就是Ballance代码眼中的注册表。
文件系统的UAC重定向
UAC,全称User Account Control,译名用户账户控制,该功能自Windows Vista引入,旨在防止病毒或恶意软件入侵系统核心数据并攫取过高权限。显而易见,UAC不存在于Windows XP上,因此Windows XP下的Ballance不受此概念的影响。你可以通过控制面板,系统和安全,更改用户账户控制设置来查看您的UAC设置状态,默认情况下为第三档。
如果您打开一个软件,在UAC设置为第三档的情况下,屏幕变暗然后出现弹窗询问是否启动程序,点击是后,程序将运行在管理员态。运行程序直接打开,没有任何变暗提示时,程序运行在用户态。运行在管理员态的程序将不存在UAC重定向,与Windows XP类似。运行在用户态的程序,将受到UAC重定向限制,UAC重定向在文件系统中的表现为:任何针对Windows核心文件(Windows,Program Files下的文件等)的读取操作,允许,不干预[来源请求]。任何对于Windows核心文件的写入操作,一律重定向到C:\Users\xxx\AppData\Local\VirtualStore
(xxx为你的用户名)。
举例,如果你在Windows 10 32位下将Ballance安装到Programs Files下,并且以用户态启动Ballance,玩过几关之后,或者调整一些设置之后。那么您将会在C:\Users\xxx\AppData\Local\VirtualStore\Program Files\Ballance
发现Database.tdb文件,造成此现象的原因是程序在用户态下无权访问本属于自己的Program Files文件夹,在UAC重定向的“欺骗”下,弄假成真将更新数据后的Database.tdb写入被重定向的目录下。
注册表的UAC重定向
如同上文所述,此项同样只影响自Windows Vista以后的系统。与上节触发情况相似,任何运行在管理员态下的程序不受此影响,运行在用户态下的程序对于注册表HKEY_LOCAL_MACHINE
的访问将会受到影响。具体为:任何针对HKEY_LOCAL_MACHINE
下的写操作[来源请求],将会被重定向到HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE
下。
此外,UAC重定向与64位重定向为独立关系,倘若一个32位程序在用户态下欲访问HKEY_LOCAL_MACHINE\SOFTWARE
,那么它的访问将会被重定向到HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node
下。
HKEY_USERS与HKEY_CURRENT_USER
HKEY_USERS
和HKEY_CURRENT_USER
同为注册表的两大主键。HKEY_CURRENT_USER
是指向HKEY_USERS\*
的符号链接,其中*
为当前登录用户的SID。HKEY_USERS\*\SOFTWARE\Classes
是指向HKEY_USERS\*_Classes
的符号链接
HKEY_LOCAL_MACHINE与HKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT
和HKEY_LOCAL_MACHINE
同为注册表的两大主键。HKEY_CLASSES_ROOT
是HKEY_LOCAL_MACHINE\SOFTWARE\Classes
和HKEY_CURRENT_USER\SOFTWARE\Classes
的混合视图。
Windows兼容性设置
Windows允许你为程序设置兼容性。但是设置兼容性会影响程序是否以管理员模式启动,进而影响UAC重定向。通常来说,在Windows 10中的兼容性选项中(其它系统可以类比),选择Windows Vista SP2(不包括)以下的版本,会在启动时要求以管理员身份启动。而选择其及其之上的兼容性则不会执行这项附加设定。因为Windows默认Windows Vista以上的程序已为UAC特别编制。
如果您不想选择更低版本的兼容性但是仍然希望管理员启动以解决UAC虚拟化的问题,可以勾选“以管理员运行此程序”选项。
案例分析
通过上述的了解,您已对Windows处理Ballance文件的方式了如指掌,但是如果将各种情况综合起来,一切都将变得让人头晕目眩。后文将会通过几个案例来进行分析。
PS:案例具有特殊性,且某些案例是虚构的,仅供分析之用。请根据自身实际情况进行操作,操作之前务必备份。
案例1
Windows XP SP3用户,Ballance安装在系统盘,我能否使用工具箱?
解决方案:Windows XP下是最简单的情况,Ballance的文件都在原位置,可以放心使用任何工具箱。
案例2
一位Windows 10早期版本用户,64位系统,Ballance安装在C:\Program Files (x86)
下,之前设置Windows Vista SP2兼容性能正常游戏。但几次Windows更新过后发现只有设置Windows 95模式才能打开游戏,但是打开游戏发现自己所有的设置都已经丢失,打出来的高分榜也不翼而飞。
解决方案:从HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node
下找回Ballance注册表设置并将其移动到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
下。将C:\Users\xxx\AppData\Local\VirtualStore\Program Files (x86)\Ballance
下的所有文件覆盖到C:\Program Files (x86)\Ballance
下恢复高分榜。
案例3
一位Windows 7 64位用户,Ballance安装在系统盘,安装后根据吧友指导,没有设置兼容性,仅仅设置了“以管理员身份运行”,后来发现将此设置去除也能正常游戏。此时他想进行窗口化游戏,在注册表内搜索到了5个键,不知道该改哪个。
解决方案:注册表中搜索到的5个键应当分别位于:
HKEY_CLASSES_ROOT\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Ballance
HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance
HKEY_USERS\xxx\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance
HKEY_USERS\xxx_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance
应该改的是后三个或者第一个中的任意一个(因为具有映射性)。不能使用窗口化补丁,因为窗口化补丁为硬编码。不能使用工具箱,因为工具箱不能识别UAC虚拟化。
你知道吗
- 有些32位程序在程序于64位系统上中硬编码访问
Wow6432Node
时会由于注册表重定向而导致出错。正确的做法是在代码调用WINAPI的注册表打开函数中给予是否需要注册表重定向的参数。 - 目前没有任何一款Ballance工具箱可以自动完全识别上述所有情况并加以判断。
参考文档
- https://blog.csdn.net/jiht594/article/details/7089791
- https://blog.csdn.net/xiaohua_de/article/details/84293958
- https://www.cnblogs.com/xenophon/p/4956218.html
- 注册表重定向与反射列表
- https://msdn.microsoft.com/en-us/library/aa965884.aspx
注释
- ↑ 由实践得出的结论。使用Ballance.iso安装的原版1.0版本的Ballance,Ballance的B为大写,其余的二次封装安装器生成的均为小写。