# 原生双客户端自动化验证 入口是 `scripts/Test-NativeOnline.ps1`,实际编排脚本是 `scripts/capture/test_native_online.py`。它使用两份已由启动器创建的隐藏游戏进程及 OnlineIntegration 的独立工作区,不操作桌面、鼠标或键盘。两份游戏必须使用不同账号和持久化配置目录,保持无网络 AppContainer,通过启动器连接同一个 HTTPS 服务器。 ```powershell ./scripts/Test-NativeOnline.ps1 ` -RunDirectoryA ` -RunDirectoryB ` -FixtureDirectory ` -Python <安装了Frida的Python完整路径> ``` 脚本要求固定 E 盘 Odyssey 版本。它验证实际原生内容检查为 Odyssey、完整存档解析返回 0,再观察两端的 SideWinder 实体。仅有两个登录会话、相同 Island/Wake 或数据包转送,都不足以通过。 实体验证同时要求原生生命周期为 Live(8),以及本次观察中原始飞船物理更新路径实际访问过该实体。后者用于排除已释放内存中残留的旧实体记录。每端必须存在两艘编号不同、且能在另一端找到同编号副本的完整飞船。 驾驶测试按 A 前进、B 前进、A 转向、B 转向执行。输入限定到本次选定的单个实体,在原生物理输入求值期间短暂设置轴值并在返回时恢复。前进读取 IShipControl 的 `+0x10`,角轴使用原生求值器复制到角速度需求 X 分量的 `+0x50`。不写入坐标、速度、就绪标志或菜单资格。 位置与姿态来自原生双精度世界矩阵缓存,按固定 getter 的选择条件只读解析。测试要求本端和对端都有多个更新样本,前进位移超过 5 米、转向超过 3 度,最终位置误差小于 0.5 米、姿态误差小于 0.2 度。原始 JSONL 保留时间、实体编号、采样值和原生 RVA。 随后调用客户端配置中的原生保存返回主菜单动作,核对中央存档中的位置和旋转向量;再通过已满足资格的 Continue/Open Play 回调重进。同一组游戏 PID 必须保留,双方重载后的两艘飞船必须恢复到服务器保存的位置与姿态。 每个 PID 只允许一个诊断助手持有 `native-control.lock`。其他观察脚本也使用相同互斥约定,避免重复附加。报告 `native-online-validation.json` 保存每项检查、四段轨迹、原始证据文件及 SHA-256。失败报告保持 `passed: false`,不能用后续成功的单项检查覆盖失败结果。 服务器按最后一个已提交或待提交成员离开来回收空实例;新一轮进入会获得新的 Island/Wake 编号。原生路由查询会返回已授权的逻辑 IPv4 地址,自己的机器信息在加入实例前即可查询;跨实例路由仍被拒绝。 ## Win32 299 加载检查 启动器不再把远程线程退出或零填充的返回区视为调用成功。调用桩保存完整 64 位返回值,并在真正返回后写入完成标记;读取子进程内存前检查进程存活、线程退出码和标记。诊断包含阶段、线程/进程退出码、实际读取字节数及 Win32 错误。 发布后的启动器支持 `--loader-check`。它验证 64 位返回值、提前成功退出、提前失败退出,以及隐藏诊断子进程退出后不再读取其内存。此检查不会启动游戏或打开桌面。 清理隐藏测试时,先完成原生保存,再结束该启动回执拥有的游戏子进程,让启动器正常释放桥接、配置目录锁和临时 RX 权限;不要直接强制结束启动器。生产存档、私钥和抓包仍只保存在忽略的本机目录中。 本机双客户端验证不能替代跨电脑网络可达性测试,也不覆盖战斗、NPC、跃迁或空间站交易。