在编辑 BCD 文件时,看到了内存诊断程序的条目,心里一动,跟错误提示里的 checksum
产生了一点关联。这是有原因的,当年我买目前安装着的一条内存时,在 ThinkPad 上会引发蓝屏。后来把它安装到现在的 Dell Latitude 5401 上,竟然被 BIOS 自带的自检程序把错误修复了!用软件(尽管是 BIOS 里的)修复硬件错误那还是我头一次遇到,因此该内存一直用到现在。但眼下,前面提到的 checksum
既然触动了我的心弦,决定再测一把。
重启时在开始没找对进入 BIOS 的热键,顺水推舟使用了 Windows 11(第二块硬盘上的系统)附带的 Memory Test 工具,果然,检测到了问题,见下图。
这下,无可推辞,还是得跑一遍 BIOS 的检测流程。于是乎,检测到的问题就再一次被神奇地修复了,赶紧留影纪念,以弥补上次没有存照的遗憾(下图)。可惜的是,着急导致手抖了,文字拍得糊之又糊,需要特别说明,对话框中间的文字是“Memory issues resolved”,😜。
尽管解决了内存问题,可躺平的系统依然一无进展。悻悻地回到家用电脑上看片(片名是《喊山》,故事用的是晋西北的乡村背景,还能看),同时间歇性放空脑袋。然后,就注意到这台电脑也在进行更新,“适用于 Windows 10 Version 22H2 的 08 累积更新”,对应的是 KB5029331,正是尸体系统最后安装的那一个。一个念头陡然升起,对呀,既然这次事故随着这一个更新接踵而至,是不是更新过程中出了什么意外,导致有文件损毁?瞬间做出两个方案。方案 A 是,待这台电脑更新成功后,去系统目录下看一眼更新的文件是否可以比较容易地找出来,以 \Windows\System32
目录为重点检查对象,后续如果有必要,再检查其子目录,如 drivers
等。方案 B 是方案 A 的替补方案,如果方案 A 查找更新后的文件不利,则想办法去微软官网下载 KB5029331 的更新包,将其中的内容作为需要检查的文件列表来源。(顺便再补记一笔,首先尝试的不是这个文件比对,而是进入安装盘的修复功能里,再到其高级功能里,用卸载更新这个功能尝试恢复到更新前,但种种努力都可耻地失败了。)
看片电脑顺利更新完成(没有变成不幸的第二台)后,直奔 System32
目录,按修改日期排序一看,刚刚更新了哪些文件和目录一目了然,数量并不算大。花了十分钟,把它们保持原目录结构复制到了 U 盘上。时至深夜,休息先,一夜无话。
转眼一早醒来。把 U 盘插到躺尸系统所在的机器上,引导进入 Ubuntu。打开 Beyond Compare,选定 U 盘上的 System32 目录和 Windows 10 系统中的 System32 目录进行比对。一番操作下来发现,不同的文件屈指可数。打开文件内容进行进一步的判断,有几个是文本文件,一看内容即行放过,显然不是追索的目标。最后,唯一的一个可疑文件出现了,ci.dll
,见下图。
两份副本仅有一个字节的差异,在 U 盘上的一份该字节的值为 8B
,而 Windows 10 系统下的一份中,该字节值为 83
,差值为 8
(见下图),也就是说,有一个 bit 的数据对不上。
为了更加确定这个文件就是问题所在,老夫不惜又到另一台电脑上,下载了 Windows 10 SDK,安装了其中的一小部分组件,主要是为了使用其中的 signtool.exe,用以对这两份 PE 文件进行校验。其结果是可以预料的,Windows 10 系统下的版本通不过校验,而 U 盘上的版本则顺利通过。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
C:\Program Files (x86)\Windows Kits\10\bin\x64>signtool verify /pa /v "E:\Dandy\ci-sus.dll" Verifying: E:\Dandy\ci-sus.dll Signature Index: 0 (Primary Signature) Hash of file (sha256): 4CFD25ACAB82978D707B433A496389E3F3B131BCC3AEC57ED35D1217DFA4011E Signing Certificate Chain: Issued to: Microsoft Root Certificate Authority 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Sun Jun 24 06:04:01 2035 SHA1 hash: 3B1EFD3A66EA28B16697394703A72CA340A05BD5 Issued to: Microsoft Windows Production PCA 2011 Issued by: Microsoft Root Certificate Authority 2010 Expires: Tue Oct 20 02:51:42 2026 SHA1 hash: 580A6F4CC4E4B669B9EBDC1B2B3E087B80D0678D Issued to: Microsoft Windows Issued by: Microsoft Windows Production PCA 2011 Expires: Thu Feb 01 08:05:41 2024 SHA1 hash: 58FD671E2D4D200CE92D6E799EC70DF96E6D2664 The signature is timestamped: Tue Aug 15 08:25:49 2023 Timestamp Verified by: Issued to: Microsoft Root Certificate Authority 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Sun Jun 24 06:04:01 2035 SHA1 hash: 3B1EFD3A66EA28B16697394703A72CA340A05BD5 Issued to: Microsoft Time-Stamp PCA 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Tue Oct 01 02:32:25 2030 SHA1 hash: 36056A5662DCADECF82CC14C8B80EC5E0BCC59A6 Issued to: Microsoft Time-Stamp Service Issued by: Microsoft Time-Stamp PCA 2010 Expires: Fri Dec 15 04:22:14 2023 SHA1 hash: C8674118C39B38396C1816664945F6A1681FA9C6 SignTool Error: WinVerifyTrust returned error: 0x80096010 Number of files successfully Verified: 0 Number of warnings: 0 Number of errors: 1 C:\Program Files (x86)\Windows Kits\10\bin\x64>signtool verify /pa /v "E:\Dandy\ci-ok.dll" Verifying: E:\Dandy\ci-ok.dll Signature Index: 0 (Primary Signature) Hash of file (sha256): 4CFD25ACAB82978D707B433A496389E3F3B131BCC3AEC57ED35D1217DFA4011E Signing Certificate Chain: Issued to: Microsoft Root Certificate Authority 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Sun Jun 24 06:04:01 2035 SHA1 hash: 3B1EFD3A66EA28B16697394703A72CA340A05BD5 Issued to: Microsoft Windows Production PCA 2011 Issued by: Microsoft Root Certificate Authority 2010 Expires: Tue Oct 20 02:51:42 2026 SHA1 hash: 580A6F4CC4E4B669B9EBDC1B2B3E087B80D0678D Issued to: Microsoft Windows Issued by: Microsoft Windows Production PCA 2011 Expires: Thu Feb 01 08:05:41 2024 SHA1 hash: 58FD671E2D4D200CE92D6E799EC70DF96E6D2664 The signature is timestamped: Tue Aug 15 08:25:49 2023 Timestamp Verified by: Issued to: Microsoft Root Certificate Authority 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Sun Jun 24 06:04:01 2035 SHA1 hash: 3B1EFD3A66EA28B16697394703A72CA340A05BD5 Issued to: Microsoft Time-Stamp PCA 2010 Issued by: Microsoft Root Certificate Authority 2010 Expires: Tue Oct 01 02:32:25 2030 SHA1 hash: 36056A5662DCADECF82CC14C8B80EC5E0BCC59A6 Issued to: Microsoft Time-Stamp Service Issued by: Microsoft Time-Stamp PCA 2010 Expires: Fri Dec 15 04:22:14 2023 SHA1 hash: C8674118C39B38396C1816664945F6A1681FA9C6 File has page hashes. Successfully verified: E:\Dandy\ci-ok.dll Number of files successfully Verified: 1 Number of warnings: 0 Number of errors: 0 C:\Program Files (x86)\Windows Kits\10\bin\x64> |
这下就不再手软了,把通不过校验的文件改名(加了后缀 .bad
),把正确的版本复制进去(没轻易在 Ubuntu 下进行,怕它的 NTFS 驱动再出什么不可预料的幺蛾子节外生枝,特意改用 PE 引导后复制的)。
再次在 Grub2 里选中 Windows 10 启动系统,看到那个旋转的圈圈时,终于放下心来,两天多三天的辛劳(可是没有功劳)总算换回一点成果。比较有喜剧效果的是,登录进入后就收到 Google Play 的邮件,说对开发策略的违例已经解除。原来以为是需要专门编译新版本的安装包,上传到市场上把所有发布轨道滚动推进一遍的,结果听了一位兄弟的传道,把那几个涉及到的测试轨道先暂停了,就迎来了“已解决”的反馈。不过显然,后续还是要抽时间把版本提上去,否则这些轨道怕是恢复起来又有麻烦。
事后回想,那一个 bit 的错误,恐怕还真是那条内存在作祟,瞅空还是换了比较稳妥。但俺是个懒人,谁知道呢,也许它就会成为薛定谔之内存条,总是在换与不换的状态间摆动。
后话一:事后对系统报错时没有指明确切的文件这一现象仍然耿耿于怀,就顺手进一步查看了一下 ci.dll
究竟是何方神圣。在该 DLL 的 PE 文件的版本信息中,是这样描述的,“Code Integrity Module”。看上去,似乎它就是负责进行代码的完整性校验的,怪不得报不出来目标,原来竟是它自己。实在也过于巧合了。
后话二:Beyond Compare 真是最值得买的软件,力挺。