【win备份还原工具开发日记】26:两轮代码审查、全流程实机验收总报告、日志根统一与 BCD /import 毒化修复(v2.6
【win备份还原工具开发日记】26:两轮代码审查、全流程实机验收总报告、日志根统一与 BCD /import 毒化修复(v2.6.14→v2.6.18)
对应文档(同日 6 篇):docs/20261018-0247-代码审查-v255至v614跨天深度审查-Sonnet5.md、docs/20261018-0345-日志根目录统一至专用工作卷-Step-5-Preview.md、docs/20261018-0625-sidecar占位名缺陷修复与BCD写入竞态教训-Step-5-Preview.md、docs/20261018-1000-全流程实机验收总报告-Step-5-Preview.md、docs/20261018-2056-全项目代码审查-DeepSeek-V4.1-Flash.md、docs/20261018-2252-B键BCD回退import毒化缺陷修复与run3run4双路径实机验收-Step-5-Preview.md
今天做了什么
代码审查 v2.5.5→v2.6.14(02:47→03:10,Sonnet5 终版):只读静态审查 git diff e04fa92 至工作区,47 提交 / 16 文件 / +6704 行。总结论:2 高危 + 5 中危 + 9 低危。H1 = select_drive 漏「无过滤视图」分支 → A 入口目标 combo 空转 + 系统盘闸门只覆盖 B/C → 可把系统镜像写到任意非系统盘(界面写「当前系统盘 C:」实际可能是 D:/F:,唯一拦截是确认框那行「目标卷:D:」);H2 = can_transition_to 缺 (RecoveryComplete, Failed) 边 → v2.6.11 新加的「自动逃出」在该阶段必然失效、任务永久悬置。根因建议:索引换算纯逻辑缺单测,补一组「界面选中 X→实际取到 X」的假 drives 单测可一次锁住 H1/M2 这类回归。本机单测 196+43 全绿、Windows ARM64 check 通过、clippy 净增 2 均为无操作强转。
日志根目录统一至专用工作卷(v2.6.15,03:45):用户原话「日志应该放到一个不是 PE、不是目标分区的一个地方」。触发点:v2.6.14 验收发现 GUI 日志实际写在 C:\Users\Public\backupRestore-package\logs\gui.log,而此前几轮读的是 H:\brwork\logs\gui.log——同一功能两个落点。旧行为(一律 <exe>\logs)三个问题:C: 可能是还原目标分区(还原成功之时正是日志消失之刻)、PE/WinRE 里 <exe> 是内存盘 X: 重启即失、随程序目录搬迁漂移。新策略 log_root.rs(新建):进程内 OnceLock 解析一次、写方读方永远同源,按优先级取第一个可用:H:\brwork\logs(事务工作卷,既非 PE 也非目标分区)→ 卷探测 → <exe>\logs 兜底。
sidecar 占位名流入 BCD 描述(v2.6.16,06:25):C 入口实机抓出 BCD 菜单描述是 Windows Backup (index 1) 占位名,而 DISM 真实索引名是 Windows 11 26200.9550 20261018。根因链:wim_info 有 sidecar 快速路径(存在 <wim>.index-N.metadata.json 跳过 DISM,性能优化正确)→ 但 BackupMetadata 原本不记录 image_name → 快速路径只能合成占位名 → 流入 BCD description 与 boot-menu-plan.json。修复:core image_name: Option<String> + 备份两侧写 DISM /Name 有效名 + 读取侧三级回退(副档 → /Get-WimInfo 只读 TOC → 占位兜底)。同轮结清一个「BCD default 回写」谜案:实为 bcdedit 落盘与 prlctl reset 的竞态幻影。
全流程实机验收总报告(10:00,Step-5-Preview):回答「所有流程都验证完了吗」——是,六项流程全部实机通过:阶段 1 备份两路(GUI)产出 BR-sys-20261018.wim、索引名 = 系统版本+日期,该 WIM 在 Tier-2 还原中通过 /CheckIntegrity /Verify;阶段 2 B 入口在线还原数据卷(序列号 + 哨兵法);阶段 3 C 入口还原系统到 F:(占位名修复后 Tier-2 全量重做,铁证链 10 项:序列号 9A09-923A→0A37-B545、哨兵消失、WIM 文件落靶时间戳保留、BCD description 真名、default 指新系统、菜单 4 条目零丢失、重启后新系统实际启动);阶段 4 安装 PE 双模式(RAM H:\BackupRestorePE + 硬盘 F:,截图);阶段 5 A 入口还原 C:(三道确认 + WinRE 执行)。验收口径定死:哨兵法 / 序列号变化 / 截图 / 无崩溃(EventID=1000 无新增、WerFault≤1)/ 菜单对账只增不减。破坏性操作前全程快照纪律(≤1 个、验证即删)。新发现:待续跑框文案-行为不一致(承诺放弃实为 Defer)、ef71fccc 三按钮死锁且卡 Capturing 的任务被 DISM 烘进备份镜像、镜像内无 wmic。
全项目代码审查(20:56,DeepSeek-V4.1-Flash):全量只读复审约 3.8 万行产品代码(core 4 + cli 27 文件),高危 3 / 中危 8 / 低危 11。高危①A 入口目标 combo 自动锁定失效且全链无硬闸(沿用 20261018-0247 未修);②(RecoveryComplete, Failed) 状态转移缺失致该阶段失败后任务永久悬置(沿用未修);③Esc 被转给编辑器专用的 handle_key 会销毁焦点控件/主进度窗并绕过「暂停中关窗」防卡死处理(本轮新增,需实机复现)。工程质量总评:卷身份一律走卷 GUID/分区号而非盘符、格式化后逐项回读校验、在线发布走「候选副本+回读+失败回滚」、失败多为 fail-closed。引用它之前先读经验库 经验/07-墓碑与争议清单.md。
B 键 BCD 回退 /import 毒化缺陷(v2.6.18,22:52):run 2 抓出:进度窗按 B(BCD 回退)时 raw 快照拷贝被锁(错误 32)→ 旧代码兜底 bcdedit /import <快照> → 该命令替换 BFSVC 已打开的存储文件 → 整个会话引导服务缓存失效 → 此后 bcdboot/bcdedit 全部 BcdOpenStore failed c0000043 直到重启(毒化仅会话级)。修复:①rollback_boot_request 删 /import 兜底,锁定时明确失败 + 可操作文案(保留 raw 主路径);②trigger_bcd_rollback 失败弹 MessageBoxW 模态错误框。验收 run 3(未锁)B → 字节级回退 6ms → 任务完成;run 4(强制持锁)B → 干净失败 + 模态框、全程无 /import → 11 分钟后 bcdboot 成功(毒化消失铁证)。锁机制新认知:list-boot-entries 的无 /store 枚举使 BFSVC 持锁(≥6min 且时长可变),bcdedit/bcdboot 走 BFSVC 持锁照常,仅 raw 文件访问失败。v2.6.17 还落地了 BCD 回退闭包接线 + B/M 快捷键 + 进度窗按钮排版。
教训与经验
bcdedit /import会毒化会话:替换 BFSVC 已打开的存储后,同会话所有 bcdboot/bcdedit 全挂直到重启——回滚必须走 raw 字节恢复,import 只在极端兜底且明确告知重启需求。- sidecar 快速路径的正确性依赖备份侧写全元数据:性能优化跳过 DISM 后,占位名会一路流进用户可见面(BCD 菜单)——凡有快速路径,必须保证源数据齐备或显式降级。
- 日志落点三大忌:还原目标分区(还原即失)、PE/WinRE 内存盘(重启即失)、随 exe 目录漂移;要「固定 + 跨重启 + 非目标」三合一。
- 验收弱信号不算数:截图/序列号/哨兵/EventID/菜单对账是硬判据;「启动成功」不等于「备份还原成功」。
- 审查结论要对照经验库墓碑:跨文档引用先查
经验/07-墓碑与争议清单.md,多篇过程结论已被实机推翻。
下次接手的注意
- 高危 3 项(A 入口目标闸门 / RecoveryComplete 终态 / Esc 误转 handle_key)+ 中危 10 + 低危 11 + 两个新缺陷(待续跑框文案、ef71fccc 死锁)待 v2.6.19「全部修复并验收」(次日 00:15 落地)。
- C 入口 Tier-2 全量重做已完成;「读取镜像」按钮去留待用户裁定。
- 点赞
- 收藏
- 关注作者
评论(0)