Starward项目绝区零账号信息编辑功能异常分析
【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward
引言
绝区零(Zenless Zone Zero,简称ZZZ)作为米哈游最新推出的游戏作品,其账号管理功能在Starward启动器中扮演着重要角色。然而,部分用户反映在使用绝区零账号信息编辑功能时遇到异常问题。本文将从技术角度深入分析Starward项目中绝区零账号信息编辑功能的实现机制,识别潜在问题,并提供解决方案。
项目架构概述
Starward是一个专为米哈游游戏设计的启动器,采用C#语言开发,基于.NET框架构建。项目采用模块化设计,主要包含以下核心组件:
绝区零账号管理实现机制
注册表操作分析
绝区零账号信息存储在Windows注册表中,具体路径如下:
| 游戏版本 | 注册表路径 | 账号数据键名 |
|---|---|---|
| 国服 | HKEY_CURRENT_USER\Software\miHoYo\绝区零 | MIHOYOSDK_ADL_PROD_CN_h3123967166 |
| 国际服 | HKEY_CURRENT_USER\Software\miHoYo\ZenlessZoneZero | MIHOYOSDK_ADL_PROD_OVERSEA_h1158948810 |
账号信息读取流程
public GameAccount? GetGameAccountFromRegistry(GameBiz biz)
{
string key = biz.GetGameRegistryKey();
string keyName = biz.Server switch
{
"cn" => GameRegistry.MIHOYOSDK_ADL_PROD_CN_h3123967166,
"global" => GameRegistry.MIHOYOSDK_ADL_PROD_OVERSEA_h1158948810,
_ => throw new ArgumentOutOfRangeException($"Unknown region {biz}"),
};
byte[]? adl = Registry.GetValue(key, keyName, null) as byte[];
// ... 后续处理逻辑
}
异常问题分析
1. UID提取逻辑缺失
通过代码分析发现,绝区零账号的UID提取逻辑存在缺失:
// 当前实现中缺少绝区零的UID提取逻辑
if (biz.Game is GameBiz.bh3)
{
account.Uid = (int)(Registry.GetValue(key, GameRegistry.GENERAL_DATA_V2_LastLoginUserId_h47158221, 0) ?? 0);
}
if (biz.Game is GameBiz.hk4e)
{
// 原神UID提取逻辑
}
if (biz.Game is GameBiz.hkrpg)
{
account.Uid = (int)(Registry.GetValue(key, GameRegistry.App_LastUserID_h2841727341, 0) ?? 0);
}
// 缺少绝区零的UID提取逻辑
2. 账号切换功能不完整
在ChangeGameAccount方法中,同样缺少绝区零的UID设置逻辑:
public void ChangeGameAccount(GameAccount account)
{
// ... 注册表设置逻辑
// 缺少绝区零的UID设置逻辑
if (account.GameBiz.Game is GameBiz.hkrpg && account.Uid > 0)
{
Registry.SetValue(key, GameRegistry.App_LastUserID_h2841727341, (int)account.Uid);
}
if (account.GameBiz.Game is GameBiz.bh3 && account.Uid > 0)
{
Registry.SetValue(key, GameRegistry.GENERAL_DATA_V2_LastLoginUserId_h47158221, (int)account.Uid);
}
if (account.GameBiz.Game is GameBiz.hk4e && account.Uid > 0)
{
Registry.SetValue(key, GameRegistry.__LastUid___h2153286551, Encoding.UTF8.GetBytes($"{account.Uid}\0"));
}
// 缺少绝区零的UID设置逻辑
}
3. 注册表键名识别问题
绝区零可能使用不同的注册表键名存储UID信息,当前代码未能正确处理:
| 游戏 | UID存储键名 | 数据类型 |
|---|---|---|
| 崩坏3 | GENERAL_DATA_V2_LastLoginUserId_h47158221 | DWORD |
| 原神 | __LastUid___h2153286551 | 字节数组 |
| 星穹铁道 | App_LastUserID_h2841727341 | DWORD |
| 绝区零 | 未知 | 未知 |
解决方案
1. 补充绝区零UID提取逻辑
需要在GetGameAccountFromRegistry方法中添加绝区零的UID提取逻辑:
if (biz.Game is GameBiz.nap)
{
// 绝区零UID提取逻辑需要进一步研究确定
// 可能需要尝试多个可能的键名
object? uidValue = Registry.GetValue(key, "可能的绝区零UID键名", null);
if (uidValue != null)
{
// 根据实际数据类型进行转换
}
}
2. 完善账号切换功能
在ChangeGameAccount方法中补充绝区零的UID设置逻辑:
if (account.GameBiz.Game is GameBiz.nap && account.Uid > 0)
{
// 根据绝区零实际的UID存储方式设置注册表值
Registry.SetValue(key, "绝区零UID键名", account.Uid, RegistryValueKind.DWord);
}
3. 注册表键名研究
需要进行逆向工程分析,确定绝区零实际使用的注册表键名:
// 可以添加调试代码来探索绝区零的注册表结构
var regKey = Registry.CurrentUser.OpenSubKey(@"Software\miHoYo\绝区零");
if (regKey != null)
{
var valueNames = regKey.GetValueNames();
// 记录和分析所有值名称,寻找UID相关的键名
}
测试验证方案
手动测试步骤
- 注册表监控:使用RegEdit或Process Monitor监控绝区零游戏启动时的注册表操作
- 键名识别:识别绝区零存储UID的具体注册表键名和数据类型
- 功能验证:修改代码后验证账号切换功能是否正常工作
自动化测试建议
[TestMethod]
public void TestZZZAccountUIDExtraction()
{
// 模拟绝区零注册表环境
using var testKey = Registry.CurrentUser.CreateSubKey(@"Software\miHoYo\绝区零_test");
testKey.SetValue("MIHOYOSDK_ADL_PROD_CN_h3123967166", new byte[] { 1, 2, 3, 4 });
testKey.SetValue("绝区零UID键名", 123456789, RegistryValueKind.DWord);
// 测试UID提取功能
var service = new GameAccountService();
var account = service.GetGameAccountFromRegistry(GameBiz.nap_cn);
Assert.AreEqual(123456789, account.Uid);
}
总结与展望
绝区零账号信息编辑功能异常的根本原因在于项目代码未能及时适配新游戏的注册表结构。通过补充绝区零特定的UID处理逻辑,可以解决当前的异常问题。
未来建议:
- 建立游戏适配机制:为新增游戏建立统一的适配接口
- 加强测试覆盖:为新游戏功能添加完整的测试用例
- 文档完善:详细记录各游戏的注册表结构差异
- 用户反馈机制:建立快速响应新游戏兼容性问题的流程
通过系统性的架构改进和持续的兼容性维护,Starward项目能够更好地支持米哈游生态系统的持续发展。
【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



