记录一次由 AI 助手执行的 Windows「清理优化」把系统弄得无法启动、并从 Arch 侧离线定位根因并修复的全过程。
TL;DR
- 现象:优化脚本执行后,Windows 重启即「Legion logo → 黑屏 → 自动重启」循环;安全模式同样失败,且没有蓝屏(是卡死,不是崩溃)。
- 根因:清理脚本删除了 Winsock 命名空间目录里的一条 NSP 条目,却没有同步把目录计数减 1。注册表变成「计数 = 9、实际条目 = 8」,开机初始化 Winsock 时读到不存在的第 8 条 → 启动卡死。
- 修复:把
Num_Catalog_Entries/Num_Catalog_Entries64改回 8,并把剩余条目重编号补齐(9 → 8),离线写回注册表后即可正常启动。 - 教训:修改「成对 / 成组」的底层数据(计数、索引、过滤器列表)必须维护其不变量;延迟到下次开机生效的改动,必须重启验证后再宣布完成。
1. 环境
| 项 | 值 |
|---|---|
| 机器 | Lenovo Legion Y7000 2019 (i5-9300H / GTX1650 / Intel UHD630) |
| 系统盘 | NVMe WDC PC SN720 512G(SMART 正常) |
| Windows | Windows 10 家庭中文版 22H2,Build 19045.6466(CoreCountrySpecific) |
| Linux | Arch Linux(同一块盘,双系统,GRUB 引导) |
双系统在这里非常关键:Arch 相当于一个「自带的正规救援系统」,让我们能离线挂载 NTFS、解析注册表与日志、直接修复。
2. 背景:AI 做了什么
在 Windows 上,用 opencode + deepseek-flash 做了一次「系统垃圾与启动项清理」,共生成并执行了 10 个阶段的 PowerShell 脚本(系统优化脚本1~10.ps1),日志在桌面 优化日志*.txt。摘要:
| 阶段 | 主要动作 |
|---|---|
| 1 | 清流氓软件(FlashCenter/FlashRepair/BirdWallpaper)、删残留服务驱动(WpSvc / HardwareProtectWp / SunloginService / orayvhid);Redis 改手动;卸 Flash / 电脑管家 / 旧 Python |
| 2 | 残留驱动收尾、删 BirdWallpaper、禁用遥测(DiagTrack / dmwappushservice)、清僵尸启动项 |
| 3 | 驱动收尾(注册开机任务 FinalCleanup) |
| 4 | 服务调整(Bonjour→手动、LISFService→禁用、NvContainerLocalSystem→手动)、禁用一批计划任务、移除启动项、删 NI |
| 5 | NI 残留目录、再卸电脑管家 |
| 6 | 删除卸载残留空壳目录 |
| 7 | 彻底清 NI:移除 Winsock NSP 条目 ← 问题就出在这里;并把 NI 文件登记到 PendingFileRenameOperations |
| 8 | 继续登记 ProgramData 下 NI 残留的「下次开机删除」 |
| 9 | 禁用联想 ImController、删 SLBrowser 更新任务、igccservice→手动、卸「手机连接」(失败) |
| 10 | igccservice→自动、卸载「手机连接」(成功) |
关键点:脚本 7~10 在 06:11–06:15 运行,之后系统正常关机,这些改动要到「下一次开机」才第一次生效。
3. 现象与时间线
| 时间(本地) | 事件 |
|---|---|
| 05:05 | 开机(#1573),开始优化会话 |
| 06:07 | 重启(#1574)——最后一次成功启动 |
| 06:11–06:15 | 运行脚本 7~10(NSP 移除、PendingFile 登记、ImController、手机连接) |
| 06:19 | 正常关机 |
| 09:03 | 第一次失败启动(#1575):logo → 黑屏 → 自动重启 |
| 09:06 | 再次失败(#1576) |
| 09:36 | 安全模式(带命令提示符)也失败 |
| 之后 | 多次进 WinRE 尝试(启动修复 / sfc / dism),期间出现过一次蓝屏(无 dump),均无效 |
诊断要点:「卡死」而非「崩溃」——没有生成 MEMORY.DMP/minidump,System.evtx 没有新事件,bootstatuspolicy=DisplayAllFailures 也没抓到蓝屏,说明系统在写事件日志之前就已经挂住。
4. 排查过程
从 Arch 侧离线进行:
- 挂载 Windows 盘(只读),确认盘符与结构。
- 读 opencode 记录:会话数据库(
~/.local/share/opencode/opencode.db)、10 个脚本、桌面日志,还原出「到底改了什么」。 - 解析注册表 hive(
SYSTEM/SOFTWARE)、事件日志(System.evtx)、Kernel-Boot、MeasuredBoot、SrtTrail.txt、CBS.log、ntbtlog.txt、NTFS USN 日志(还原那次开机的文件增删)。 - 逐项排除:
- 启动关键驱动(
Start=0/1)文件一个不缺; - 核心文件(
dxgkrnl / win32k / cdd / monitor / ntoskrnl)与WinSxS原件哈希一致; - SSD SMART 正常(可用备用 100%、已用 6%、数据完整性错误 0);
Startup Repair跑两次,「根本原因数 = 0」;sfc/dism /restorehealth无法修复(DISM 报0x800f081f缺源)。
- 启动关键驱动(
- 关键反转:读
sfc.log发现 SFC 实际只报了一张锁屏壁纸C:\Windows\Web\Screen\img105.jpg损坏(chkdsk顺带修过一点 NTFS 元数据)——与启动无关,是误导。 - 用时间戳做 diff:把「脚本 7~10 运行时段」内被修改的注册表键全部列出来。SYSTEM 里只有寥寥几处,其中一处就是:
...\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries(64)—— 立刻核对计数。
5. 根因
注册表位置:
1 | HKLM\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5 |
- 删除前:条目
1..9(9 条),计数9。 - 脚本 7 用
Remove-Item删掉了第 8 条(NI 的nimdnsNSP):- 只剩
1..7和9(8 条), - 但计数仍是 9。
- 只剩
- 于是 Winsock 命名空间目录出现「计数 9 / 实际 8」的不一致,并且第 8 个索引缺失。
Windows 初始化 Winsock 时会按计数去读条目;读不到第 8 条 → 启动期在 Winsock/服务初始化阶段卡住。
为什么脚本会漏:Windows 正常增删 NSP 通过 API 完成、API 会自动维护计数;脚本直接删注册表子键,绕过了这个不变量维护。
6. 修复
离线(Arch 侧)修改 Windows 的 SYSTEM hive:
Num_Catalog_Entries/Num_Catalog_Entries64:9 → 8;- 把剩余的 Bonjour 条目
000000000009重编号为000000000008(使条目连续为1..8); - 写回
C:\Windows\System32\config\SYSTEM并同步 hive 日志。
修改后校验:Catalog_Entries(64) = 1..8,计数 = 8。重启一次即恢复正常。
备份:
~/ocwin/SYSTEM.bak-nsp-*,以及 ESP 上的BCD.bak-scheng-*。
7. 为什么症状长这样
| 现象 | 解释 |
|---|---|
| logo 后黑屏、自动重启、无蓝屏 | 是**卡死(hang)**不是 bugcheck,因此没有 dump,也写不了事件日志 |
| 安全模式也失败 | Winsock 在安全模式同样初始化,而问题在基础 SYSTEM 注册表里 |
Startup Repair 查不出 |
它只做磁盘/BCD/驱动/注册表可加载性等结构性检查,不校验 Winsock 目录计数与条目的一致性 |
sfc 只报一张壁纸 |
与启动无关,是诊断噪音 |
ntbtlog 停在 dxgkrnl |
引导日志本就会在显示初始化附近截断,属假线索 |
8. 教训与检查清单
- 动「成对/成组」的底层数据(计数、索引、过滤器列表等)——要么走正规 API,要么改完立刻校验一致性。
- 任何延迟到下次开机生效的改动,必须重启验证后再宣布完成。
- 排查顺序建议:先分清「卡死」还是「崩溃」→ 看最近改了什么 → 做状态 diff → 小步改、每步重启验证。
- 排查「无法启动」时,别急着相信
sfc的「发现损坏文件」——它可能只是锁屏图片之类的无关文件。 - 手边常备一个救援系统(双系统 / Linux live USB / Windows 安装 U 盘)+ 重要数据备份;比什么都实在。
9. 工具箱(本次实际用到)
- 离线挂载 NTFS / ESP:
udisksctl/mount(ntfs3/ntfs-3g) - 注册表 hive 读写:
hivexsh/hivexregedit/python-registry - 日志解析:
python-evtx、strings、NTFS USN 日志解析 - Windows 侧:
WinRE、bcdedit、sfc、dism、chkdsk、reg - 引导编辑:
BCD(/boot/EFI/Microsoft/Boot/BCD)
记录整理自 2026-10-06 的排查过程。