【win备份还原工具开发日记】25:UIPI 卡点突破、日志卡死修复收口、配置静默失效与 RE 命令控制台(v2.6.9→v2.
【win备份还原工具开发日记】25:UIPI 卡点突破、日志卡死修复收口、配置静默失效与 RE 命令控制台(v2.6.9→v2.6.13)
对应文档(同日 9 篇):docs/20261017-0033-v2.6.9收口待办与UIPI卡点交接.md、docs/20261017-0100-v2.6.9-日志与卡死修复收口与GUI冒烟验收-Hy4.md、docs/20261017-0116-v2.6.10-两处配置静默失效修复与实机三组对照验证-Hy4.md、docs/20261017-0125-第二轮核查-日志缺口与无限重启逃生通道-Hy4.md、docs/20261017-0935-当前开发进度-Step-5-Preview.md、docs/20261017-0935-下一步待实现-Step-5-Preview.md、docs/20261017-0935-v2.6.11第二轮核查11项全落地与RE命令控制台-Step-5-Preview.md、docs/20261017-2210-C页格式化目标分区复选框漏排版根因与修复-Step-5-Preview.md、docs/20261017-2255-C入口移除源卷栏与目标卷排除系统盘-Step-5-Preview.md
今天做了什么
v2.6.9 收口(00:33/01:00,Hy4):接手「只写文档让其它 AI 接手」的交接(0033),撞上 UIPI 卡点:GUI 提权态(High IL)而 prlctl exec --current-user 是 Medium IL,SendMessage/PostMessageW 的 BM_CLICK 被 UIPI 静默丢弃(settings-window=0),设置窗口打不开。解法 A 实测可用:tools/launch-as-gui-token.ps1 以 SYSTEM 通道 OpenProcess→OpenProcessToken→DuplicateTokenEx→CreateProcessAsUser(lpDesktop="winsta0\default") 借 GUI 自己的提权令牌起同 IL 同会话子进程,UIPI 不再拦。任务 #26 全部 8 项收口:设置窗口四输入项端到端全绿(种子 ini 回显 → WM_SETTEXT 改值 → 点单选 → 保存 → ini 重写带中文注释头 + GUI 日志确认),版本 2.6.8→2.6.9 部署,GUI 标题 v2.6.9,复跑两轮冒烟全绿。
v2.6.10 两处配置静默失效(01:16,Hy4,独立复核):用户一句「你来核查并修复错误」→ 查出两个真缺陷,同形状:配置写进了磁盘,消费它的路径却读不到,且失效完全静默。①dism_timeout_secs 的进程环境变量只在 recover_env 赋值 → 在线还原与 GUI 安装 PE 恒为 INFINITE(正是卡死 6 与卡死 3);修法:main() 最早处 init_process_env_from_settings() + 规则抽纯函数 plan_env_value(显式设置绝不覆盖、ini=0 不写)。②failure_pause_max_wait_secs 只驱动失败弹框,而恢复链 wait_if_paused 读的 BACKUPRESTORE_PAUSE_TIMEOUT_SECS 只有读取方没有写入方 → 恒 0、「暂停后无人值守」永远不退出;修法:键名提单一来源常量 + recover_env 灌值(0 也显式写)。实机三组对照(无 ini / ini=300 / ini=300+env=77)验证「显式优先未被覆盖」。单测 189+43 全绿。
第二轮核查:日志缺口与逃生通道(01:25,Hy4,纯静态):复核上一轮 13 项大多已修;新视角最有价值:日志落点重启后还在不在——RE 逃生日志写 X:\BackupRestore-escape.log、早期日志写 X:\...,而 WinRE/PE 的 X: 是内存盘,重启即丢,连败 3 次自动逃出后无法复盘;对照组 PE 退出路径 write_pe_exit_log 按「卷 GUID → 同卷子目录 → X:」三级落盘,全仓唯一做对可照抄。无逃生通道 5 项:GUI 启动即 shutdown /r 自动续跑无叫停、自动重启无全局上限(per-stage 计数阶段推进即归零)、PE 无限进黑屏无出口、--pe-reboot 无反向清除入口、close_and_wait 裸 join。结论:“写了日志"不等于"日志还在”,判据要加"落点是否跨重启存活";最重的动作日志最薄。
v2.6.11 第二轮核查 11 项处置全落地(09:35,Step-5-Preview):新模块 session_log.rs(RAM 盘会话按「卷 GUID → 同卷子目录 → X:」三级选镜像根,mirror_append_log 双写,PE/RE 现场日志随镜像落持久卷);resume_pending_boot_task 拆三函数(find_pending_boot_task 只发现不重启 → ask_pending_resume 是/否 → resume_pending_now 执行,「否」与直接关窗都按不重启);新增 MAX_TOTAL_RESUME_ATTEMPTS=3 跨阶段总闸;close_and_wait 先 recv_timeout(30s) 再 join 超时 detach;顶栏新增「取消待重启任务」(复用 abandon-task 收口路径);三处 bootsequence 入口输出统一落 boot-sequence.log;CreateWindowExW 失败先开最大化 cmd 再弹「是=重启/否=留在 PE」;wpeutil reboot 失败回退 shutdown.exe;删 C:\brgui-trace.txt 探针;log_fs 让 PE 安装静默 copy 失败落日志。新需求:RE 内最大化后台命令控制台——launch_background_console() 用 CreateProcessW + SW_SHOWMAXIMIZED 起 cmd.exe(刻意不用 Command),wpeinit 之后、任务加载之前执行,本程序弹框统一 MB_SETFOREGROUND。Windows 侧 5 入口实机验证完毕(含 RE 内截图)。
v2.6.12 C 页复选框漏排版(22:10,Step-5-Preview):用户报 C 页「格式化目标分区」复选框被遮挡/错位。根因 = 典型改名型遗漏:可见性与排版各写一份入口集合——ca9f0cd(v2.5.3)排除旧「第二系统」tab 时正确;e2c57b0(v2.6.4)合并入口时可见性列表把 restore-system-other 改名 create-secondary,layout 的排除条件原样没动 → 复选框「显示了但永不被排版」,且创建于 WM_CREATE 早期 Z 序最底被整块盖住。修复:新增 is_format_target_entry() 单一来源供两处共用。实机四态 dump 全归位,A/B/备份/PE 页逐像素一致。
v2.6.13 C 入口三连(22:55,Step-5-Preview):①源卷栏移除(C 的源恒为 active_system_letter(),死控件);②目标卷排除当前系统——索引换算是重点:combo 索引 ≡ drives 索引是隐性契约,直接删 combo 项会让索引错位(「选了 E: 实际写到 F:」比不过滤更危险),所以保留全量填充 + 过滤时重排索引;③PE 硬盘启动会格式化分区(早有 MB_YESNO 确认框),缺 tab 内先验提示——补 hint/tooltip 双语警示,未动确认框。「读取镜像」按钮功能上多余,按用户只问未删,留待裁定。
教训与经验
- UIPI 突破的唯一通道 = 借目标进程令牌:
DuplicateTokenEx+CreateProcessAsUser起同 IL 子进程;旧路TokenLinkedTokenerr=6 已证失败。 SendMessage不带CharSet=Unicode会走SendMessageA按 ANSI 编组 UTF-16:WM_SETTEXT只传首字符(1200→1、600→6),单字符测试值会漏掉。- 同步
SendMessage(BM_CLICK)点模态窗口会卡到窗口关闭:改PostMessage。 - 借令牌子进程看不到
X:(每用户驱动器映射不随令牌走);GetWindowText跨进程读 EDIT 返回空(改WM_GETTEXT);SYSTEM 会话枚举不到会话 1 窗口(须借令牌)。 - 设置文件写在「运行中 exe 所在目录」:
H:\brwork与包目录各有一份 exe,硬编码包目录会误报「ini 未生成」——判据写错,产品无误。 - 集合判定被复制成两份,改一处漏一处(v2.6.12 复选框):凡「可见性/布局」等并列判定,收敛到单一来源函数。
- combo 索引 ≡ 数据索引的契约:过滤列表必须重排索引,宁可不滤也别错位。
下次接手的注意
- v2.6.11 的暂停上限 env 与
MessageBoxTimeoutW到期分支未在 RE 内实机触发;顶栏「是」(真 abandon)未跑;B2 非终态自动收口仍未做。 - 下一轮(10-18)方向:代码审查 v2.5.5→v2.6.14(2 高危:A 入口目标空转可写错盘 + RecoveryComplete 无法标终态)。
- 点赞
- 收藏
- 关注作者
评论(0)