强删 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 → 后面全部用 ControlSet001
  • 0x2 → 后面全部用 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 文件,不执行的话改动可能丢失。

重启后——系统正常启动。


十一、修复后的收尾

系统能进不代表干净了。建议按顺序做:

  1. 备份重要数据。系统还在「半残」状态,先保命。
  2. 建还原点:Win+R → sysdm.cpl → 系统保护 → 创建。
  3. 用 MCPR 彻底清理。McAfee 官方卸载工具,会清掉残留的 mfe*.sys、空服务项和注册表。
  4. 确认 Defender 接管:设置 → 隐私和安全性 → Windows 安全中心 → 病毒和威胁防护。
  5. 复查 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\                                  软件安装信息

十四、最后

三句话总结:

  1. 杀毒软件不要直接删文件夹。 它有内核驱动和设备栈钩子,删文件只是砍了它的肉身,魂还挂在系统里。
  2. 卸载安全软件请用官方工具(MCPR、ESET Uninstaller、Kaspersky Removal Tool 等),或者至少走「设置 → 应用 → 卸载」。
  3. 删任何带驱动的软件之前,先建个还原点。 这次能救回来,很大程度上是因为 partmgr 没被一起删掉——纯属运气。

希望这篇能帮到同样卡在「删了杀软开不了机」的人。


环境:HUAWEI MateBook / Windows 11 / WinRE 命令行

posted @ 2026-10-24 22:22  shian  阅读(8)  评论(0)    收藏  举报