打开主菜单

Ballance Wiki β

更改

Windows虚拟化与重定向

添加8,863字节2020年2月4日 (二) 00:03
创建页面,内容为“Ballance在文件系统与注册表中会存有一部分数据,但这些数据有时可能并不会老老实实呆在原本位置,经常会莫名其妙地出现…”
Ballance在文件系统与注册表中会存有一部分数据,但这些数据有时可能并不会老老实实呆在原本位置,经常会莫名其妙地出现在其他位置,并且您也对修改何处的数值感到困惑,本页面将指导您如何根据您自身的情况找到真正的数据位置所在。

== 概念 ==

在您继续了解之前,您需要先了解几个新的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具有影响:<code>HKEY_LOCAL_MACHINE\SOFTWARE</code>下的任何键操作(读/写)都将被重定向到<code>HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node</code>下

另外,对于64位的Windows来说,通过运行<code>C:\Windows\system32\regedit.exe</code>可以浏览64位注册表,即注册表的实际存储状况。通过运行<code>C:\Windows\SysWOW64\regedit.exe</code>可以浏览32位注册表,即经过重定向的注册表,也是Ballance代码眼中的注册表。对于32位系统来说,不存在<code>C:\Windows\SysWOW64\regedit.exe</code>。运行<code>C:\Windows\system32\regedit.exe</code>即可展示注册表,也就是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核心文件的写入操作,一律重定向到<code>C:\Users\xxx\AppData\Local\VirtualStore</code>(xxx为你的用户名)。

举例,如果你在Windows 10 32位下将Ballance安装到Programs Files下,并且以用户态启动Ballance,玩过几关之后,或者调整一些设置之后。那么您将会在<code>C:\Users\xxx\AppData\Local\VirtualStore\Program Files\Ballance</code>发现[[Database.tdb/zh|Database.tdb]]文件,造成此现象的原因是程序在用户态下无权访问本属于自己的Program Files文件夹,在UAC重定向的“欺骗”下,弄假成真将更新数据后的Database.tdb写入被重定向的目录下。

=== 注册表的UAC重定向 ===

如同上文所述,此项同样只影响自Windows Vista以后的系统。与上节触发情况相似,任何运行在管理员态下的程序不受此影响,运行在用户态下的程序对于注册表<code>HKEY_LOCAL_MACHINE</code>的访问将会受到影响。具体为:任何针对<code>HKEY_LOCAL_MACHINE</code>下的{{来源请求|写操作}},将会被重定向到<code>HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE</code>下。

此外,UAC重定向与64位重定向为'''独立'''关系,倘若一个32位程序在用户态下欲访问<code>HKEY_LOCAL_MACHINE\SOFTWARE</code>,那么它的访问将会被重定向到<code>HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node</code>下。

=== HKEY_USERS与HKEY_CURRENT_USER ===

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

如果展开<code>HKEY_USERS</code>,子项的名字即为Windows为每一位用户分配的编码。其中没有任何结尾的,将会根据是否是当前用户被映射到<code>HKEY_CURRENT_USER</code>下,而以<code>_Classes</code>为结尾的,会根据是否是当前用户被映射到<code>HKEY_CURRENT_USER\Software\Classes</code>下(其事实上与对应的无<code>_Classes</code>结尾的子项中的<code>Software\Classes</code>一致)

=== 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安装在<code>C:\Program Files (x86)</code>下,之前设置Windows Vista SP2兼容性能正常游戏。但几次Windows更新过后发现只有设置Windows 95模式才能打开游戏,但是打开游戏发现自己所有的设置都已经丢失,打出来的高分榜也不翼而飞。

解决方案:从<code>HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node</code>下找回Ballance注册表设置并将其移动到<code>HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node</code>下。将<code>C:\Users\xxx\AppData\Local\VirtualStore\Program Files (x86)\Ballance</code>下的所有文件覆盖到<code>C:\Program Files (x86)\Ballance</code>下恢复高分榜。

=== 案例3 ===

一位Windows 7 64位用户,Ballance安装在系统盘,安装后根据吧友指导,没有设置兼容性,仅仅设置了“以管理员身份运行”,后来发现将此设置去除也能正常游戏。此时他想进行窗口化游戏,在注册表内搜索到了4个键,不知道该改哪个。

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

* <code>HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Ballance</code>
* <code>HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance</code>
* <code>HKEY_USERS\xxx\Software\Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance</code>
* <code>HKEY_USERS\xxx_Classes\VirtualStore\MACHINE\SOFTWARE\WOW6432Node\Ballance</code>

应该改的是后三个中的任意一个(因为具有映射性)。不能使用窗口化补丁,因为窗口化补丁为硬编码。不能使用工具箱,因为工具箱不能识别UAC虚拟化。

== 你知道吗 ==

* 有些32位程序在程序于64位系统上中硬编码访问<code>Wow6432Node</code>时会由于注册表重定向而导致出错。正确的做法是在代码调用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://docs.microsoft.com/zh-cn/windows/win32/winprog64/shared-registry-keys 32位程序于64位注册表中的键的受影响的列表]
* https://msdn.microsoft.com/en-us/library/aa965884.aspx
1,132
个编辑