MiniFilter驱动启动报系统错误2 找不到指定文件问题排查
问题根因
- 核心错误:INF模板完全用错。你当前使用的是**NDIS轻量网络过滤驱动(LWF)**的INF模板,和你开发的文件系统MiniFilter驱动完全不匹配。两类驱动的类GUID、安装逻辑、所需注册表项、加载组要求完全不同,用网络驱动的配置装文件过滤驱动,服务配置从根上就是错的,不管怎么改ImagePath都不可能启动成功。
- 代码存在低级错误:回调注册数组中
IRP_MJ_WRITE的预处理回调错误绑定为MiniPreCreate,你自己实现的MiniPreWrite根本没被注册,就算驱动加载成功写拦截逻辑也不会生效。 - 安装方式错误:你用SC手动建服务、OSRLoader加载、手动改注册表的方式都不满足MiniFilter的安装要求。MiniFilter需要FltMgr识别的实例配置、高度值、加载组等专属注册表项,不是只建个服务项加个ImagePath就能跑,缺必要配置时系统就会抛找不到文件的错误。
- 配置不符合规范:现有INF里
LoadOrderGroup填的是自定义字符串companyName,MiniFilter必须使用微软预定义的FSFilter Activity Monitor/FSFilter Anti-Virus这类文件系统过滤专属加载组,自定义加载组会导致FltMgr无法识别驱动。 - 潜在路径问题:如果你是用32位程序/32位CMD把sys文件复制到
system32\drivers,会被系统自动重定向到SysWOW64\drivers目录,内核加载时找不到对应路径的文件也会报这个错。
修复步骤
1. 清理所有残留错误配置
以管理员身份打开命令提示符,执行以下命令删除错误创建的服务:
sc delete companyName
手动删除注册表路径HKLM\SYSTEM\CurrentControlSet\Services\companyName的整个项,清理之前散落的sys文件,避免残留配置干扰后续安装。
2. 替换为合法的MiniFilter专用INF
完全丢弃之前的NDIS驱动INF,使用MiniFilter标准模板修改,核心配置参考如下:
[Version] Signature = "$Windows NT$" Class = "ActivityMonitor" ; 文件系统过滤驱动专属类GUID,绝对不能用之前网络驱动的GUID ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} Provider = %Msft% DriverVer = 01/01/2024,1.0.0.0 CatalogFile = companyName.cat [Manufacturer] %Msft%=MSFT,NTamd64 ; 仅保留你实际编译的目标架构,不需要全平台列全 [MSFT.NTamd64] %companyName_Desc%=Install, companyName [Install] OptionDesc = %companyName_Desc% CopyFiles = MiniFilter.DriverFiles [DestinationDirs] DefaultDestDir = 12 MiniFilter.DriverFiles = 12 ; 对应系统目录%windir%\system32\drivers [MiniFilter.DriverFiles] companyName.sys,,,2 [SourceDisksNames] 1 = %DiskId1%,,,"" [SourceDisksFiles] companyName.sys = 1,, [Install.Services] AddService = companyName,,MiniFilter.Service [MiniFilter.Service] DisplayName = %companyName_Desc% ServiceType = 1 ; 标记为内核驱动 StartType = 3 ; 调试阶段先设为手动启动,调通后再改为系统启动 ErrorControl = 1 ServiceBinary = %12%\companyName.sys ; 必须使用微软规定的MiniFilter加载组,禁止自定义 LoadOrderGroup = "FSFilter Activity Monitor" AddReg = MiniFilter.AddRegistry [MiniFilter.AddRegistry] HKR,,"DebugFlags",0x00010001,0x0 ; 以下为MiniFilter实例必填配置,缺了FltMgr认不到驱动 HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance% HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude% HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags% [Strings] Msft = "YourCompany" companyName_Desc = "Test Minifilter Driver" DiskId1 = "Minifilter Installation Disk" DefaultInstance = "MiniFilter Default Instance" Instance1.Name = "MiniFilter Default Instance" ; 测试用选监控类合法高度段即可,不要随便填数字 Instance1.Altitude = "370050" Instance1.Flags = 0x0
注意:Altitude(高度值)决定了过滤驱动在文件系统栈上的加载顺序,测试时可使用370000-379999监控类段的数值,正式发布需要向微软申请合法高度。
3. 修复代码错误
首先修正回调注册的笔误,把IRP_MJ_WRITE对应的预处理回调改成你实现的MiniPreWrite:
const FLT_OPERATION_REGISTRATION Callbacks[] = { {IRP_MJ_CREATE,0,MiniPreCreate,MiniPostCreate}, {IRP_MJ_WRITE,0,MiniPreWrite,NULL}, // 原代码这里错填成MiniPreCreate {IRP_MJ_OPERATION_END} };
另外修复文件名拷贝的溢出问题:你代码里拷贝文件名时用FileNameInfo->Name.MaximumLength作为拷贝长度是错的,这个值是文件名缓冲区的总大小,不是实际字符串长度,应该用FileNameInfo->Name.Length,否则会拷贝无效内存导致蓝屏。
4. 正确安装驱动
不要用SC手动建服务,不要用OSRLoader,直接通过INF正常安装:
- 把编译好的
companyName.sys和修改后的INF放在同一文件夹 - 右键点击INF文件,选择「安装」
- 管理员身份执行
net start companyName即可正常启动
测试阶段如果驱动没有正式签名,先执行bcdedit /set testsigning on重启开启测试模式再安装。
内容的提问来源于stack exchange,提问作者hashy
相关产品推荐
相关产品推荐

