【win备份还原工具开发日记】06:v1.3.3 基线、断电续跑与 PE 恢复桌面
v1.3.3 基线:固定约束与实现
-
产品运行时只有 Rust:Rust Win32 GUI + Rust prepare + Rust
Recovery.exe;PowerShell 只用于构建和测试控制。 -
程序目录即工作目录:任务/载荷/状态/日志/BCD 快照都写
<程序目录>,不依赖C:\ProgramData,不再让用户选"任务卷"。还原前按程序目录卷 GUID 与目标比较,相同立即阻止。 -
身份与保护:源/工作目录/镜像/目标/EFI 全存 GUID、偏移、容量、序列号;EFI/MSR/Recovery 不能做镜像卷或还原目标;BitLocker 未知或已加密即拒绝。
-
判断口径必须写清:代码已覆盖 / 离线已验证 / ARM64 构建已验证 / Windows 准备已验证 / WinRE 实机已验证 / GUI 真实鼠标已验证 / 已知失败,不能混级。
实机收口证据:断电续跑、EFI 回归与拒绝矩阵
-
三阶段断电续跑:
power-loss-target-erased/image-applied/boot-repaired各在独立快照完成真实 WinRE 断电→续跑→success;修复链是 v1.3.1 盘符参与 payload 比较 → v1.3.2 清临时盘符 + 放宽已格式化目标序列号 → v1.3.3 一次性 fault marker 防循环。 -
异常拒绝矩阵 6 案例全通过:无新任务目录、BCD 逻辑对比 UNCHANGED、WinRE 保持 Enabled、全程无重启。
-
两个真实 bug:
json_text()不处理布尔值 → GUI 的hasWindowsInstallation恒 false;EFI 保留分区在assert_bitlocker_off之前没显式拒绝(旧包会误报 BitLocker 错误)。 -
GUI 自动化边界:GUI 以 HIGH 完整性运行时,非提升进程的
SendMessage/SetCursorPos/SendInput被 UIPI 静默拦截;改用计划任务Interactive + RunLevel Highest在 Session 1 内注入WM_COMMAND/BM_CLICK/WM_SETTEXT才有效。
PE 作为第二系统与「恢复桌面」(路线 3)
-
"BCD 有条目 ≠ 可引导"实锤:
create-secondary菜单真实出现两条目,但进入第二系统报0xc000000f——根因是目标卷残缺(Q:\Windows\System32只有bootstr.dll没有winload.efi)。 -
PE 引导链配错就 0xc0000225:自定义 osloader 条目第一次成功、重建后失败,差异是缺显式
systemroot \windows+nx OptIn;补上即恢复。 -
「返回 Windows」退出链三连坑:PE 内
/store场景{current}解析成 PE 自己 → 部署期把 Windows 条目 GUID 写进 ESPpe-exit-guid.txt;ExitWindowsEx在 PE 无权限静默失败 → 加wpeutil reboot兜底;std::fs写 PE 挂载 FAT 卷失败 → 用CreateFileW直写卷路径日志。 -
mountvol S: /S未提升会静默失败,曾误判「NO_LOG」;读回日志必须用提升 PowerShell。 -
PE 场景特有:PE(
winpe=yes)里 bootmgr 不回写 bootsequence,设了就每次重启都进 PE,验证后需恢复快照或人工清。 -
固件阶段键盘注入无效:
prlctl send-key-event在 bootmgr 阶段完全不生效,Boot Manager 菜单交互自动化只剩 VNC/USB HID 通道(未采用)。
- 点赞
- 收藏
- 关注作者
评论(0)