关于MiniFilter驱动的安装
Minifilter驱动的安装,本质上是一个向操作系统注册并激活的过程 ,核心是向过滤器管理器(Filter Manager,即FltMgr.sys)登记,并告知它你的驱动应该何时、以何种方式被加载。
整个过程可以分为两大阶段:静态注册 (通过INF文件)和动态加载(系统启动或手动触发)。
阶段一:静态注册(INF文件安装)
这个阶段的目标是在系统中"登记"你的驱动信息,让操作系统和过滤器管理器知道它的存在。主要工作由SetupAPI执行,核心是操作注册表。
-
复制驱动文件 :将
.sys驱动文件复制到目标目录(如%windir%\system32\drivers)。 -
创建驱动服务 :在注册表路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\下,为你的驱动创建一个服务项(Service Key)。这一步是标准Windows驱动安装的一部分,会创建:ImagePath:指向驱动文件的路径。Start:驱动启动类型(如手动、自动、系统启动时等)。Group:驱动所属的加载顺序组(Load Order Group) ,对于Minifilter,必须指定如"FSFilter Activity Monitor"这样的文件系统过滤组。Dependencies:依赖项,Minifilter必须依赖"FltMgr"。
-
创建Minifilter专用注册表项 :这是与传统驱动安装的关键区别。在刚才创建的服务项下,会额外创建一个名为
Instances的子键。这个子键及其内容是过滤器管理器识别和加载Minifilter的依据,包含:DefaultInstance:指定默认使用的实例名称。- 实例子键 :以实例名命名的子键(如
Instances\YourInstanceName),包含该实例的Altitude(高度值) 和Flags(标志)。
完成这三步,你的驱动就在系统中完成了"注册",具备了被加载的基本条件。
阶段二:动态加载(驱动启动)
当满足启动条件(如你手动输入 sc start 命令,或系统根据Start类型自动加载)时,加载流程进入第二阶段。
-
服务控制器(SCM)加载驱动 :服务控制管理器根据注册表信息,将你的
.sys驱动文件加载到内核空间。 -
调用
DriverEntry入口点 :驱动被加载后,系统会立即调用其入口函数DriverEntry。这是驱动执行的第一个函数,在此进行初始化。 -
向过滤器管理器(FltMgr)注册 :在
DriverEntry函数中,驱动必须执行两个核心操作:FltRegisterFilter:调用此函数向过滤器管理器注册。驱动会传入一个FLT_REGISTRATION结构,其中包含了所有需要过滤的操作的回调函数。FltStartFiltering:调用此函数通知过滤器管理器,驱动已初始化完毕,可以开始过滤I/O请求了。
-
创建并附加实例(Instance) :
FltStartFiltering调用后,过滤器管理器会根据INF文件中定义的实例信息,在合适的时机为每个卷(Volume)调用驱动的InstanceSetupCallback回调。该回调会为驱动在特定卷上创建一个"实例"(Instance) ,将其附加(Attach) 到文件系统栈上。什么是"高度值"(Altitude)?
它是一个数字字符串,决定了你的驱动在文件系统栈中的加载位置和调用顺序。数值越高,驱动在栈中的位置越靠上,能更早地处理I/O请求。这个值必须是唯一的,生产环境使用需向微软申请。
INF文件示例
inf
;
; MyMiniFilter.inf
;
; -----------------------------------------------------------------------
; Windows File System MiniFilter Driver INF
;
; 本 INF 按照微软官方 Minifilter INF 推荐结构编写
; 适用于 Windows 10 1903 及以后版本
; Windows 11 24H2 已采用 Parameters\Instances 结构
; -----------------------------------------------------------------------
;=======================================================================
; Version
;
; 描述驱动程序基本信息。
; Windows 安装程序首先读取这一节。
;=======================================================================
[Version]
; 固定写法,表示 Windows NT 系列驱动
Signature = "$WINDOWS NT$"
; MiniFilter 所属类别
; ActivityMonitor 对应监控类过滤驱动
Class = "ActivityMonitor"
; ActivityMonitor 对应的 GUID
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
; 驱动提供商
Provider = %ManufacturerName%
; CAT 文件
CatalogFile = MiniFilter.cat
; 驱动版本
DriverVer = 06/26/2026,1.0.0.0
; 防止 Driver Package 被非法修改
PnpLockdown = 1
;=======================================================================
; DestinationDirs
;
; 指定 CopyFiles 的目标目录
; 13 = Driver Store
;=======================================================================
[DestinationDirs]
DriverFiles = 13
;=======================================================================
; SourceDisksNames
;
; 指定安装介质
;=======================================================================
[SourceDisksNames]
1 = %DiskName%,,,
;=======================================================================
; SourceDisksFiles
;
; 指定需要复制哪些文件
;=======================================================================
[SourceDisksFiles]
MyMiniFilter.sys = 1
;=======================================================================
; DefaultInstall
;
; 右键 INF -> Install
; 或 pnputil 安装时执行这里
;=======================================================================
[DefaultInstall.NTamd64]
; 驱动名称
OptionDesc = %MyMiniFilter.ServiceDesc%
; 复制驱动文件
CopyFiles = DriverFiles
;=======================================================================
; DefaultInstall.Services
;
; 创建 SCM(Service Control Manager) 服务
;=======================================================================
[DefaultInstall.NTamd64.Services]
AddService = MyMiniFilter,,MyMiniFilter.Service
;=======================================================================
; DriverFiles
;
; CopyFiles 使用的文件列表
;=======================================================================
[DriverFiles]
MyMiniFilter.sys
;=======================================================================
; MyMiniFilter.Service
;
; 创建驱动服务
;
; 对应:
; HKLM\SYSTEM\CurrentControlSet\Services\MyMiniFilter
;=======================================================================
[MyMiniFilter.Service]
; SCM 中显示名称
DisplayName = %MyMiniFilter.ServiceName%
; 驱动说明
Description = %MyMiniFilter.ServiceDesc%
; 驱动文件路径
ServiceBinary = %13%\MyMiniFilter.sys
; ***********************************************************
; Minifilter 必须使用
; SERVICE_FILE_SYSTEM_DRIVER
; ***********************************************************
ServiceType = 2
; 手动启动
StartType = 3
; 启动失败记录错误
ErrorControl = 1
;************************************************************
; Minifilter 所属组
;
; 必须与 Altitude 对应
;************************************************************
LoadOrderGroup = "FSFilter Activity Monitor"
;************************************************************
; 依赖 Filter Manager
;************************************************************
Dependencies = FltMgr
;************************************************************
; 添加 Minifilter 注册表
;************************************************************
AddReg = MyMiniFilter.AddRegistry
;=======================================================================
; MyMiniFilter.AddRegistry
;
; 注册 Minifilter Instance
;
; HKR
; =
; HKLM\SYSTEM\CurrentControlSet\Services\MyMiniFilter
;=======================================================================
[MyMiniFilter.AddRegistry]
;------------------------------------------------------------
; SupportedFeatures
;
; 微软官方 Sample 推荐添加
;------------------------------------------------------------
HKR,"Parameters","SupportedFeatures",0x00010001,0x3
;------------------------------------------------------------
; 默认 Instance
;------------------------------------------------------------
HKR,"Parameters\Instances","DefaultInstance",0x00000000,%DefaultInstance%
;------------------------------------------------------------
; Instance Altitude
;------------------------------------------------------------
HKR,"Parameters\Instances\%DefaultInstance%","Altitude",0x00000000,%DefaultAltitude%
;------------------------------------------------------------
; Flags
;
; 0 = 自动附加
;------------------------------------------------------------
HKR,"Parameters\Instances\%DefaultInstance%","Flags",0x00010001,0
;=======================================================================
; Strings
;
; 所有字符串统一放这里
;=======================================================================
[Strings]
ManufacturerName = "LXZ"
DiskName = "MyMiniFilter Installation Disk"
MyMiniFilter.ServiceName = "MyMiniFilter"
MyMiniFilter.ServiceDesc = "My MiniFilter Driver"
; 默认 Instance 名称
DefaultInstance = "MyMiniFilter Instance"
; Activity Monitor 推荐高度
DefaultAltitude = "370030"
同时,在VS中把项目属性中的no catalog关闭,再关闭run inf2cat,把输出文件夹中的cat、inf、sys文件都拷贝到同一个目录中。这样就可以使用右键或者pnputil安装minifilter驱动了。
总结
整个Minifilter安装流程可以概括为:
- INF文件 :一个"安装脚本",指示系统该往注册表里写什么。
- 注册表 :一个"信息仓库",存储了驱动的服务配置 和Minifilter专用实例信息(含高度值)。
- 过滤器管理器 (FltMgr) :一个"管理员",它读取注册表信息,加载、管理并调度所有Minifilter驱动。
DriverEntry:驱动的"初始化函数",在此向过滤器管理器**"报到"并提交"服务清单"**(回调函数)。
理解这个流程后,你会发现无论是使用INF文件,还是通过代码动态操作注册表,其本质都是在完成这个"注册与激活"的过程。