【win备份还原工具开发日记】28:cmd 后台最大化根因修复、B 键端到端与全环节验收三补收
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\tasks16 个历史残留。建议顺序 #41→#40→#38→#39。 - 门禁缺陷修复(
/ImageFile:→/WimFile:)与 #110 wimlib 集成已列入后续(10-22 落地)。
- 点赞
- 收藏
- 关注作者
评论(0)