强删 McAfee 后 Windows 无法启动:一次「磁盘过滤驱动」残留的完整排障实录
强删 McAfee 后 Windows 无法启动:一次「磁盘过滤驱动」残留的完整排障实录
现象:手贱直接删了 McAfee 的安装目录,重启后系统再也进不去了。
结果:花了两个小时,在 WinRE 里靠离线注册表把它救回来。
这篇记录完整的排查过程——包括我走的 6 条弯路。
一、事情是怎么发生的
华为 MateBook,出厂预装 McAfee,试用期弹窗烦得很。
嫌卸载慢,直接进了这几个目录,Shift+Delete 全删了:
C:\Program Files\McAfee
C:\Program Files\Common Files\McAfee
C:\ProgramData\McAfee
C:\Windows\System32\drivers\mfe*.sys ← 后来发现这里其实没删掉
删完重启。
然后,机器再也进不了系统了。
二、第一反应:安全模式能救吗
结论:不能。这是第一个弯路,而且是最容易浪费时间的一个。
很多人对「安全模式」有个误解,以为它只加载最基础的驱动,第三方驱动都会被屏蔽。
实际上 Windows 的驱动加载顺序是按 Start 值分级的:
| Start 值 | 类型 | 加载时机 | 安全模式是否加载 |
|---|---|---|---|
0 |
Boot-Start | 内核初始化,比文件系统还早 | 会加载 |
1 |
System-Start | 内核初始化阶段 | 部分加载 |
2 |
Auto | 系统启动后由 SCM 加载 | 不加载 |
3 |
Demand | 按需加载 | 不加载 |
4 |
Disabled | 不加载 | 不加载 |
杀毒软件的驱动基本都是 Start=0——因为它要在任何文件被打开之前就挂上钩子。这类驱动在安全模式下照样会加载。
所以如果是 Boot-Start 驱动出问题,安全模式和无安全模式没有任何区别,一样崩。
安全模式只能解决 Start>=2 的问题。
三、弯路二:在 Services 里找不到 McAfee
进了 WinRE 命令行,第一想法是把 McAfee 残留的服务项全禁掉。
挂载离线注册表:
reg load HKLM\OFF C:\Windows\System32\config\SYSTEM
搜服务:
reg query HKLM\OFF\ControlSet001\Services /f mfe /k
返回空。
当时以为已经删干净了,差点放弃这条路。后来才发现两个问题。
四、弯路三:reg load 静默失败,导致所有查询都是假阴性
这条坑得最深。
WinRE 里的盘符分配和你想象的不一样。我第一次用的是 D:\Windows\...:
reg load HKLM\OFF D:\Windows\System32\config\SYSTEM
命令执行了,没仔细看输出——实际上它报了「系统找不到指定的文件」,HKLM\OFF 根本没挂上。
后续所有 reg query HKLM\OFF\... 都在查一个不存在的键,当然返回空。
教训:挂载后必须验证,不能假设成功。
验证方法(查一个必然存在的系统服务):
reg query HKLM\OFF\ControlSet001\Services\Tcpip /v Start
返回 Start REG_DWORD 0x2 才说明挂载有效。
WinRE 里的盘符规律
X:永远是 WinRE 自己的内存盘- 系统盘取决于分区结构,可能是 C: 也可能是 D:
- 有独立 EFI 分区时,EFI 分区可能占用 C:
判断方法:dir C:\Windows / dir D:\Windows,哪个能列出内容就是系统盘。
五、弯路四:WinRE 里 findstr 不可用
习惯性想用管道过滤:
reg query HKLM\OFF\ControlSet001\Services | findstr /i "mfe"
提示找不到命令。
WinRE 是精简环境,findstr 有时会因为 PATH 或组件裁剪不可用。用绝对路径 X:\Windows\System32\findstr.exe 能跑,但没必要——reg query 本身就带搜索能力:
reg query <键路径> /f <关键词> /k :: 只搜键名
reg query <键路径> /f <关键词> /v :: 只搜值名
reg query <键路径> /f <关键词> /d :: 只搜数据
reg query <键路径> /f <关键词> /s :: 递归所有子键
不带 /k /v /d 时,默认三者都搜。
六、弯路五:/v UpperFilters 报「找不到」
这条纯属输入法背锅。
reg query "HKLM\OFF\ControlSet002\Control\Class\{4d36e967-...}" /v UpperFilters
→ 错误:系统找不到指定的注册表项或值
但同一个键,不带 /v 就能看到 UpperFilters 这一行。
原因是 /v 后面那个空格是中文输入法打的全角空格(U+3000),CMD 把它当成了值名的一部分。
改成加引号就好了:
reg query "..." /v "UpperFilters"
在 WinRE / CMD 里敲注册表命令,先确认输入法是英文状态。这个坑值一个晚上。
七、弯路六:ControlSet001 和 ControlSet002 搞混
这是最隐蔽的一条。
Windows 的注册表里有两套控制集:
HKLM\SYSTEM\ControlSet001
HKLM\SYSTEM\ControlSet002
HKLM\SYSTEM\Select
Select 键里记录了当前生效的是哪一套:
reg query HKLM\OFF\Select
典型输出:
Current REG_DWORD 0x2 ← 当前生效的是 ControlSet002
Default REG_DWORD 0x2
Failed REG_DWORD 0x0
LastKnownGood REG_DWORD 0x1
如果 Current = 0x2,你改 ControlSet001 里的任何东西,重启后都不会生效。
我在这上面白改了一轮,重启后现象一模一样,还以为方法错了。
八、转折点:问题不在 Services,在 Class
当 Services 里搜不到东西时,换个地方搜——果然有了:
reg query HKLM\OFF\ControlSet002\Control\Class /f mfe /s
输出:
HKEY_LOCAL_MACHINE\OFF\ControlSet002\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318}
UpperFilters REG_MULTI_SZ partmgr\0mfedisk
就是它。
九、根因分析:磁盘类过滤驱动
9.1 什么是设备类过滤驱动
Windows 允许第三方驱动「插入」到某类设备的驱动栈中间,做拦截处理。注册位置在:
HKLM\SYSTEM\<ControlSet>\Control\Class\{设备类GUID}
两个关键值:
UpperFilters:在功能驱动之上的过滤驱动LowerFilters:在功能驱动之下的过滤驱动
磁盘驱动器(DiskDrive)类的 GUID 是固定的:
{4d36e967-e325-11ce-bfc1-08002be10318}
它的 UpperFilters 正常值只有一个:
partmgr
partmgr.sys 是 Windows 自带的分区管理器,磁盘设备栈里必须有它。
9.2 McAfee 干了什么
McAfee 为了让实时扫描能拦到每一次磁盘 IO,把自己注册成了磁盘过滤驱动:
UpperFilters REG_MULTI_SZ partmgr\0mfedisk
REG_MULTI_SZ是多字符串类型,多行显示时用\0分隔。
mfedisk 就插在 partmgr 后面。每次读写磁盘,IO 都要经过它。
9.3 为什么删了文件就崩
链条是这样的:
内核初始化
→ 枚举磁盘设备
→ 加载 DiskDrive 类的过滤驱动链
→ 读到 UpperFilters = [partmgr, mfedisk]
→ 尝试加载 mfedisk
→ 文件/依赖组件已被删除 → 加载失败
→ 磁盘设备栈初始化中断
→ 系统拿不到磁盘句柄
→ 引导失败 / 蓝屏 / 无限重启
关键在于:这一步发生在文件系统挂载之前。
也就是说,系统还没有能力去「读配置」「跳过错误」「进安全模式」——它在能够读取磁盘之前就已经死了。
这就是为什么安全模式无效,也是一部分机器会表现为「连自动修复都进不去」的原因。
9.4 为什么 Services 里搜不到
Services 下搜 mfe 返回空,是因为:
- 服务项可能在删除过程中被一并清掉了(或本来就没有独立服务项)
- 但
Class键下的UpperFilters引用还在
Windows 加载过滤驱动时,如果 UpperFilters 里列了一个不存在的服务名,大多数情况会被忽略;但如果服务存在、Start=0、而驱动初始化失败,那就是硬崩。
这种「引用残留但服务实体半死不活」的状态,是最难查的。
十、完整修复步骤(可直接照抄)
步骤 0:进入 WinRE 命令提示符
开机看到 logo 时长按电源键强制断电,重复 3 次,第 4 次开机会进入「自动修复」界面:
高级选项 → 疑难解答 → 高级选项 → 命令提示符
步骤 1:确认系统盘符
dir C:\Windows /b
dir D:\Windows /b
哪个能列出内容,哪个就是系统盘。下面假设是 C:。
步骤 2:挂载离线注册表
reg load HKLM\OFF C:\Windows\System32\config\SYSTEM
必须看到「操作成功完成」。
步骤 3:确认当前控制集
reg query HKLM\OFF\Select
看 Current:
0x1→ 后面全部用ControlSet0010x2→ 后面全部用ControlSet002
步骤 4:验证挂载有效(别省这一步)
reg query HKLM\OFF\ControlSet002\Services\Tcpip /v Start
返回 0x2 才算正常。
步骤 5:定位问题键
reg query HKLM\OFF\ControlSet002\Control\Class /f mfe /s
预期看到 UpperFilters ... partmgr\0mfedisk。
步骤 6:备份
reg export "HKLM\OFF\ControlSet002\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318}" C:\classdisk_bak.reg
步骤 7:修复 UpperFilters
reg add "HKLM\OFF\ControlSet002\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318}" /v "UpperFilters" /t REG_MULTI_SZ /d partmgr /f
是覆盖成只有 partmgr,不是删整个值。
partmgr必须保留——删了它才是真的没救了。
步骤 8:验证
reg query "HKLM\OFF\ControlSet002\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318}" /v "UpperFilters"
应该只剩:
UpperFilters REG_MULTI_SZ partmgr
步骤 9:顺手禁用相关服务
for %f in (C:\Windows\System32\drivers\mfe*.sys) do reg add "HKLM\OFF\ControlSet002\Services\%~nf" /v Start /t REG_DWORD /d 4 /f
Start=4 是禁用,比删除安全,以后能改回来。
在 CMD 命令行里用
%f;写进.bat文件要写成%%f。
步骤 10:卸载并重启
reg unload HKLM\OFF
wpeutil reboot
reg unload 不能省。 它会把内存中的修改刷回 hive 文件,不执行的话改动可能丢失。
重启后——系统正常启动。
十一、修复后的收尾
系统能进不代表干净了。建议按顺序做:
- 备份重要数据。系统还在「半残」状态,先保命。
- 建还原点:
Win+R→sysdm.cpl→ 系统保护 → 创建。 - 用 MCPR 彻底清理。McAfee 官方卸载工具,会清掉残留的
mfe*.sys、空服务项和注册表。 - 确认 Defender 接管:设置 → 隐私和安全性 → Windows 安全中心 → 病毒和威胁防护。
- 复查 UpperFilters:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318}" /v "UpperFilters"
十二、踩坑速查表
| # | 坑 | 表现 | 解法 |
|---|---|---|---|
| 1 | 以为安全模式能绕过 | 安全模式同样崩 | Boot-Start 驱动在安全模式也加载,无用 |
| 2 | WinRE 盘符搞错 | reg load 静默失败 |
dir C:\Windows / dir D:\Windows 试探 |
| 3 | 未验证挂载 | 查询全部返回空 | reg query ...\Services\Tcpip /v Start |
| 4 | findstr 不可用 |
提示找不到命令 | 用 reg query /f /k /s 原生搜索 |
| 5 | 全角空格 | /v UpperFilters 报找不到 |
切英文输入法,值名加双引号 |
| 6 | 控制集搞错 | 改了没效果 | reg query ...\Select 看 Current |
| 7 | 只搜 Services | 找不到残留 | 还要搜 Control\Class、Control\EarlyLaunch |
十三、原理补充
为什么杀软都要注册过滤驱动
实时防护的本质是「在文件被打开/写入之前拦一刀」。要实现这个,只能把自己插到 IO 栈里。所以主流杀软都会注册:
- 文件系统过滤驱动(minifilter,
fltmc filters可查) - 磁盘类过滤驱动(
UpperFilters) - ELAM 早期启动驱动(
Control\EarlyLaunch,保证开机第一刻就有防护)
这三层里,磁盘过滤驱动最致命——它挂掉,系统连盘都读不到。
排查其他杀软残留时的检查点
HKLM\SYSTEM\<ControlSet>\Services\<服务名> 驱动服务注册
HKLM\SYSTEM\<ControlSet>\Control\Class\{GUID} 类过滤驱动
HKLM\SYSTEM\<ControlSet>\Control\EarlyLaunch ELAM 策略
HKLM\SOFTWARE\ 软件安装信息
十四、最后
三句话总结:
- 杀毒软件不要直接删文件夹。 它有内核驱动和设备栈钩子,删文件只是砍了它的肉身,魂还挂在系统里。
- 卸载安全软件请用官方工具(MCPR、ESET Uninstaller、Kaspersky Removal Tool 等),或者至少走「设置 → 应用 → 卸载」。
- 删任何带驱动的软件之前,先建个还原点。 这次能救回来,很大程度上是因为
partmgr没被一起删掉——纯属运气。
希望这篇能帮到同样卡在「删了杀软开不了机」的人。
环境:HUAWEI MateBook / Windows 11 / WinRE 命令行
浙公网安备 33010602011771号