【win备份还原工具开发日记】28:cmd 后台最大化根因修复、B 键端到端与全环节验收三补收(v2.6.21)

举报
任正非 发表于 2026/11/03 23:48:11 2026/11/03
【摘要】 【win备份还原工具开发日记】28:cmd 后台最大化根因修复、B 键端到端与全环节验收三补收(v2.6.21)对应文档(同日 6 篇):docs/20261020-0230-RE内cmd后台最大化修复与B键端到端验收-Step-5-Preview.md、docs/20261020-0915-全环节验收状态核查与P2弱信号补收-Step-5-Preview.md、docs/20261020...

【win备份还原工具开发日记】28:cmd 后台最大化根因修复、B 键端到端与全环节验收三补收(v2.6.21)

对应文档(同日 6 篇):docs/20261020-0230-RE内cmd后台最大化修复与B键端到端验收-Step-5-Preview.md、docs/20261020-0915-全环节验收状态核查与P2弱信号补收-Step-5-Preview.md、docs/20261020-0925-当前开发进度-Step-5-Preview.md、docs/20261020-0925-下一步待实现-Step-5-Preview.md、docs/20261020-1025-当前开发进度-Step-5-Preview.md、docs/20261020-1025-下一步待实现-Step-5-Preview.md

今天做了什么

RE 内「cmd 后台最大化」根因修复 + B 键端到端(02:30,Step-5-Preview):用户 2026-10-17 提的需求(进 RE 后自动开的 cmd 必须「最大化 + 在后台」、程序保持前台)此前三次实机失败(任务 2355190e / 6bf2ff22 / 7924c644):cmd 盖住进度窗,B/L/M/K/P 全打在控制台上。根因:STARTF_USESHOWWINDOW + SW_SHOWMAXIMIZED 创建 cmd 会激活窗口——cmd 一起手就抢走前台并压在随后创建的进度窗之上;MB_SETFOREGROUND 只保得住模态框。修复(三个文件):①创建改 SW_SHOWMINNOACTIVE(不激活);②新增 wait_for_toplevel_window 按 PID 轮询等顶层窗口就绪(进程起来≠窗口就绪);③ShowWindow(SW_SHOWMAXIMIZED) + SetWindowPos(HWND_BOTTOM, SWP_NOACTIVATE) 压底;进度窗侧新增 claim_foreground(AttachThreadInput 挂输入队列后 SetForegroundWindow——非前台进程直接 Set 会被系统静默拒绝)。验收(任务 771b3ee2):第一张截图即见 cmd 最大化在后台、进度窗前台五按钮可见;vmkey.sh b 命中,日志「用户按 B 键 BCD 回退:已按字节恢复准备期 BCD 快照」+ 模态框;BCD 终态干净(bootsequence/loader 条目消失、default 回原系统)。附带清零 3 个构建告警(EnumWindows 双声明签名对齐、两个仅测试用函数挂 #[cfg(test)])。回退后 STEP 4 失败框是用户主动回退 BCD 的合理后续(rearm 校验认已被删的条目),非新缺陷。

全环节验收状态核查 + P2/弱信号补收(09:15,Step-5-Preview):回答「所有环节都验收完了吗」——核心链路全部有过成功实机验收;严格按「当前二进制」口径有 3 项缺口,今天全部补掉:①部署一致性:VM 内 H:\brwork\BackupRestore.exe SHA256 = 构建产物 62f19b24… 逐字节一致;②崩溃弱信号:09-30 至今 20 天零 EventID 1000、WER 队列/归档空,覆盖 10-18/19/20 全部实机轮次;③P2 硬拒 CLI 端到端:create-secondary + F: 非活动 Windows 卷 + --skip-format → windows_prepare.rs:2510 正确硬拒,任务创建前触发、零写入零残留。验收矩阵:六项主流程(备份 / B 数据还原 / C 第二系统 / A 系统还原 / 安装 PE 双模式 / B 键 RE 内)+ 每轮针对性复验全部有过成功实机。新发现:prepare 真实参数解析在 windows_prepare.rs(--skip-format 默认 format_target=true);main.rs online_cli 是旧路径(--format-target/--index)两套并存;交互会话未提权读卷身份 error 5 → prepare/bcdedit 必须走 SYSTEM 通道。

DISM 挂载门禁参数缺陷实证 + #41 清理完成 + #39 预研落档(10:25):证实 DISM 门禁缺陷:windows_prepare.rs::wim_mount_markers 用 /ImageFile: 调 /Mount-Wim(正确是 /WimFile:——前者是 /Apply-Image 的选项)→ DISM 恒报 87 → 权威判据自 v2.4.2 引入起从未生效,一直静默降级为「镜像名里有没有 winpe」的弱启发式,且日志无痕;git -L 溯源 50ab69f(v2.4.2)出生即错;实证 /WimFile: 挂载 0 + 双标记 YES;10-13「VHD 致 87」归因被推翻。#41 完成:18→2(归档 8,533,196 B 验 18/18,两批 8+8 零失败)。#39 方案修正:只删 reagentc.exe(删 SYSTEM 会被 verify() 拦且系统不可启动;recovery_fault 无生产装配),副本暂存 32,452,239,435 B、Name=Windows Backup。环境清理 Cleanup-Wim 清 10-14 Invalid 挂载。机器状态:C: 48D5-196E / F: FE47-7768 / H: 8297-CCB6。

教训与经验

  • 创建即激活的窗口必然抢前台:SW_SHOWMAXIMIZED 会激活窗口;要「后台最大化」必须三步走——SW_SHOWMINNOACTIVE 创建 → 轮询等窗口就绪 → 最大化 + SetWindowPos(HWND_BOTTOM) 压底;进度窗靠 AttachThreadInput + SetForegroundWindow 显式抢回。
  • 权威判据要能自证生效:/Mount-Wim 参数写错让门禁自 v2.4.2 起静默失效,靠「日志无痕」掩盖了 4 个版本——凡「成功路径」必须有留痕,凡「探测路径」必须能对照失败证据。
  • git -L 溯源能证明缺陷"出生即错":归因要追到引入提交,而不是猜环境(10-13「VHD 致 87」因此被推翻)。
  • 验收补收三件套:部署 SHA 逐字节、崩溃弱信号(EventID/WerFault 区间统计)、硬拒 CLI 端到端(破坏前触发、零残留)。
  • 两套参数解析并存是坑:main.rs online_cli(旧)与 windows_prepare.rs(真)——排查 CLI 行为先确认走的是哪套解析。

下次接手的注意

  • 剩余 4 项:#38 A/B 入口+备份+PE 安装当前二进制全链复跑(需用户拍板,合并专场先拍快照);#39 P5 缺组件目标卷代码路径端到端(排期即可);#40 V4/V5/V6 BCD 默认启动项实机逐场景;#41 清理 H:\brwork\tasks 16 个历史残留。建议顺序 #41→#40→#38→#39。
  • 门禁缺陷修复(/ImageFile:→/WimFile:)与 #110 wimlib 集成已列入后续(10-22 落地)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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