【win备份还原工具开发日记】V1 实现说明:开发过程中踩过的坑

举报
任正非 发表于 2026/09/30 23:23:01 2026/09/30
【摘要】 这份文档就是一本"坑账",把开发到 v1.7.5 踩到的坑基本都记了。挑主要的说:1. 原子写是假的 :状态文件原来是"先删旧、再改名",掉电卡在中间就丢任务记录。改成`MoveFileExW` 一步替换才对。2. BCD 快照和 task.json 不同步 :快照哈希更新了,任务文件还没落盘,Recovery 直接拒收。写入顺序必须闭环。3. 验证动作会改被验证的东西 :`bcdedit ...

这份文档就是一本"坑账",把开发到 v1.7.5 踩到的坑基本都记了。挑主要的说:

1. 原子写是假的 :状态文件原来是"先删旧、再改名",掉电卡在中间就丢任务记录。改成`MoveFileExW` 一步替换才对。
2. BCD 快照和 task.json 不同步 :快照哈希更新了,任务文件还没落盘,Recovery 直接拒收。写入顺序必须闭环。
3. 验证动作会改被验证的东西 :`bcdedit /enum` 会把刚校验过的 BCD 哈希改掉——所以现在不用枚举当证据,只认"复制后立刻算的哈希"。
4. 断电卡在启动交接处 :`reagentc /boottore` 和真正重启之间断电,任务卡在 boot-requested,系统却正常进了 Windows。后来加了启动时扫描"唯一合法可续跑任务"的机制。
5. 排除表"装着装了其实没装" :GUI 在线备份漏传`/ConfigFile` ,一条排除都没生效,Parallels 的`Mac disk` 被装进 WIM,还原到 72% 报`0x80070020` 。这是最贵的一个坑。
6. DISM 排除表的三个冷知识 :没有`/Exclude` ,只有`/ConfigFile` 的`[ExclusionList]` ;通配符只能放路径最后一段(中间不行);对"已被独占的文件"在打开前就跳过,且大小写不敏感。靠这些,v1.7.5 才做到了不停 Parallels 服务也能还原。
7. 别解析本地化 DiskPart 输出 :靠星号表格猜磁盘/分区号,语言或列布局一变就错配。改成`IOCTL_STORAGE_GET_DEVICE_NUMBER` 原生查询。
8. macOS 编译不等于 Windows 编译 :`cargo test` 不编译`cfg(windows)` 分支,数组长度、字符串转义、`?` 用法这类错只有 ARM64 构建才暴露,栽过两次。
9. 日志编码能搞死业务 :中文 Windows 的 DISM 输出不是 UTF-8,按 UTF-8 读会让已经在跑的 Capture 直接失败。改成按字节读、无损替换。
10. 其它小坑 :ARM64 上 1 MiB 栈缓冲触发`STATUS_STACK_OVERFLOW` (改堆);3224 字节的`BCD-Template` 无法被 BCDBoot 加载(要用系统里 20480 字节那份);`mountvol` 对空闲盘符正常返回退出码 1,曾被误判为"不可用";旧测试在任务目录堆了 48 个任务、约 61.8 GiB。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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