【win备份还原工具开发日记】25:UIPI 卡点突破、日志卡死修复收口、配置静默失效与 RE 命令控制台(v2.6.9→v2.

举报
任正非 发表于 2026/10/28 23:08:54 2026/10/28
【摘要】 【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...

【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 子进程;旧路 TokenLinkedToken err=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 无法标终态)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。