关于MiniFilter驱动的安装

关于MiniFilter驱动的安装

Minifilter驱动的安装,本质上是一个向操作系统注册并激活的过程 ,核心是向过滤器管理器(Filter Manager,即FltMgr.sys)登记,并告知它你的驱动应该何时、以何种方式被加载。

整个过程可以分为两大阶段:静态注册 (通过INF文件)和动态加载(系统启动或手动触发)。

阶段一:静态注册(INF文件安装)

这个阶段的目标是在系统中"登记"你的驱动信息,让操作系统和过滤器管理器知道它的存在。主要工作由SetupAPI执行,核心是操作注册表

  1. 复制驱动文件 :将.sys驱动文件复制到目标目录(如 %windir%\system32\drivers)。

  2. 创建驱动服务 :在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 下,为你的驱动创建一个服务项(Service Key)。这一步是标准Windows驱动安装的一部分,会创建:

    • ImagePath:指向驱动文件的路径。
    • Start:驱动启动类型(如手动、自动、系统启动时等)。
    • Group:驱动所属的加载顺序组(Load Order Group) ,对于Minifilter,必须指定如 "FSFilter Activity Monitor" 这样的文件系统过滤组。
    • Dependencies:依赖项,Minifilter必须依赖 "FltMgr"
  3. 创建Minifilter专用注册表项 :这是与传统驱动安装的关键区别。在刚才创建的服务项下,会额外创建一个名为 Instances 的子键。这个子键及其内容是过滤器管理器识别和加载Minifilter的依据,包含:

    • DefaultInstance:指定默认使用的实例名称。
    • 实例子键 :以实例名命名的子键(如 Instances\YourInstanceName),包含该实例的 Altitude(高度值)Flags(标志)

完成这三步,你的驱动就在系统中完成了"注册",具备了被加载的基本条件。

阶段二:动态加载(驱动启动)

当满足启动条件(如你手动输入 sc start 命令,或系统根据Start类型自动加载)时,加载流程进入第二阶段。

  1. 服务控制器(SCM)加载驱动 :服务控制管理器根据注册表信息,将你的 .sys 驱动文件加载到内核空间。

  2. 调用 DriverEntry 入口点 :驱动被加载后,系统会立即调用其入口函数 DriverEntry。这是驱动执行的第一个函数,在此进行初始化。

  3. 向过滤器管理器(FltMgr)注册 :在 DriverEntry 函数中,驱动必须执行两个核心操作:

    • FltRegisterFilter :调用此函数向过滤器管理器注册。驱动会传入一个 FLT_REGISTRATION 结构,其中包含了所有需要过滤的操作的回调函数。
    • FltStartFiltering :调用此函数通知过滤器管理器,驱动已初始化完毕,可以开始过滤I/O请求了
  4. 创建并附加实例(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文件,还是通过代码动态操作注册表,其本质都是在完成这个"注册与激活"的过程。