打开主菜单

Ballance Wiki β

Windows虚拟化与重定向

Yyc12345讨论 | 贡献2020年2月4日 (二) 11:23的版本
AmboxProfessor.jpeg 专业性词条
此词条含有较多的专业术语,请您确认您是否具有相关的知识储备。如果有任何理解上的困难,可以翻阅相关资料进行理解或咨询相关人士。

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

在Windows注册表中,有几大主键,其中两者为:HKEY_USERSHKEY_CURRENT_USER。两者之间存在一个映射关系。HKEY_USERS存储了全部用户的设置,而HKEY_CURRENT_USER则从HKEY_USERS中拾取当前用户对应的字段并映射于自身中。

如果展开HKEY_USERS,子项的名字即为Windows为每一位用户分配的编码。其中没有任何结尾的,将会根据是否是当前用户被映射到HKEY_CURRENT_USER下,而以_Classes为结尾的,会根据是否是当前用户被映射到HKEY_CURRENT_USER\Software\Classes下(其事实上与对应的无_Classes结尾的子项中的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安装在系统盘,安装后根据吧友指导,没有设置兼容性,仅仅设置了“以管理员身份运行”,后来发现将此设置去除也能正常游戏。此时他想进行窗口化游戏,在注册表内搜索到了4个键,不知道该改哪个。

解决方案:注册表中搜索到的4个键应当分别位于:

  • 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工具箱可以自动完全识别上述所有情况并加以判断。

参考文档

注释

  1. 由实践得出的结论。使用Ballance.iso安装的原版1.0版本的Ballance,Ballance的B为大写,其余的二次封装安装器生成的均为小写。