【win备份还原工具开发日记】V1 实现说明:开发过程中踩过的坑
这份文档就是一本"坑账",把开发到 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。
- 点赞
- 收藏
- 关注作者
评论(0)