Windows驱动开发学习记录-使用Inf安装过滤驱动时自动添加注册表相关内容

发布时间 2023-05-26 16:00:33作者: 禁锢在时空之中的灵魂

 

做过滤驱动时一般需要在相关class驱动里添加过滤信息,即LowerFilters或者UpperFilters,比如disk类的注册表当前信息,如下图:

一个常规的inf文件如下所示:

;
; USBFilter.inf
;

[Version]
Signature="$WINDOWS NT$"
Class=TOASTER
ClassGuid={B85B7C50-6A01-11d2-B841-00C04FAD5171}
Provider=%ManufacturerName%
DriverVer = 05/26/2023,14.57.39.49
CatalogFile=USBFilter.cat
PnpLockdown=1

;This template is supported for OS version 17763 (Windows 10 version 1809) and after.
;For Windows OS prior to Windows 10 1809 set DefaultDestDir = 12
[DestinationDirs]
DefaultDestDir = 12
USBFilter.DriverFiles  = 12            ;%windir%\system32\drivers

[DefaultInstall]
OptionDesc          = %ServiceDescription%
CopyFiles           = USBFilter.DriverFiles
AddReg = USBFilter.AddReg

[DefaultInstall.Services]
AddService          = %ServiceName%,,USBFilter.Service

[USBFilter.DriverFiles]
%DriverName%.sys


[USBFilter.Service]
DisplayName      = %ServiceName%
Description      = %ServiceDescription%
ServiceBinary    = %12%\%DriverName%.sys        ;%windir%\system32\drivers\
ServiceType      = 1                      ;SERVICE_FILE_SYSTEM_DRIVER
StartType        = 1                            ;
ErrorControl     = 1                            ;SERVICE_ERROR_NORMAL

[USBFilter.AddReg]
HKLM,SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318},UpperFilters,0x00010008,USBFilter


[SourceDisksNames]
1 = %DiskName%,,,""

[SourceDisksFiles]
USBFilter.sys  = 1,,

;[Manufacturer]
;%ManufacturerName%=Standard,NT$ARCH$




[Strings]
ManufacturerName="USB过滤驱动" ;TODO: Replace with your manufacturer name
DiskName="USBFilter Source Disk"
ServiceDescription      = "USB过滤驱动"
ServiceName             = "USBFilter"
DriverName              = "USBFilter"

其中【DefaultInstall】区段添加了 AddReg = USBFilter.AddReg,然后在 【USBFilter.AddReg】 区段添加了注册表的内容:

[USBFilter.AddReg]
HKLM,SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318},UpperFilters,0x00010008,USBFilter

其中倒数第二个参数一般用0x00010000,这个参数代表用后边指定的内容进行覆盖,但这里需要的是附加内容,所以用的0x00010008,然后右键点击安装就可以了。

安装好后如图所示:

 其中倒数第二个参数的意义如下:

flag
此可选的十六进制值,表示为系统定义的低单词和高字标志值的 ORed 位掩码,定义值条目和/或控制加载项注册表操作的数据类型。

每个标志的位掩码值如下所示:

0x00000001 (FLG_ADDREG_BINVALUETYPE)
给定值为“原始”数据。 (此值与 FLG_ADDREG_TYPE_BINARY.) 相同

0x00000002 (FLG_ADDREG_NOCLOBBER)
阻止给定值替换现有值条目的值。

0x00000004 (FLG_ADDREG_DELVAL)
从注册表中删除给定的子项,或者从指定的注册表子项中删除指定的值项名称

0x00000008 (FLG_ADDREG_APPEND)
将给定  追加到现有命名值项的值。 仅当同时设置FLG_ADDREG_TYPE_MULTI_SZ时,此标志才有效。 如果指定的字符串值已存在,则不会追加指定的字符串值。

0x00000010 (FLG_ADDREG_KEYONLY)
创建给定 的子项,但忽略任何提供的值条目名称和/或值。

0x00000020 (FLG_ADDREG_OVERWRITEONLY)
仅当给定子项中已存在指定的 value-entry-name 时,才重置为所提供的

0x00001000 (FLG_ADDREG_64BITKEY)
(Windows XP 和更高版本的 Windows.) 在 64 位注册表中进行更改。 如果未指定,则对本机注册表进行更改。

0x00002000 (FLG_ADDREG_KEYONLY_COMMON)
(Windows XP 和更高版本的 Windows.) 这与FLG_ADDREG_KEYONLY相同,但也适用于 INF DelReg 指令的 del-registry-section

0x00004000 (FLG_ADDREG_32BITKEY)
(Windows XP 和更高版本的 Windows.) 在 32 位注册表中进行更改。 如果未指定,则对本机注册表进行更改。

0x00000000 (FLG_ADDREG_TYPE_SZ)
给定的值项和/或值的类型 为 REG_SZ

 备注

此值是指定值项的默认类型,因此可以从外接程序注册表节中任何 reg-root= 行中省略标志值,该行对此类型的值项进行操作。

0x00010000 (FLG_ADDREG_TYPE_MULTI_SZ)
给定的值项和/或值是注册表类型 REG_MULTI_SZ。 后面的值字段可以是用逗号分隔的字符串列表。 此规范不需要给定字符串值的任何 NULL 终止符。

0x00020000 (FLG_ADDREG_TYPE_EXPAND_SZ)
给定 的值条目名称和 /或  是注册表类型 REG_EXPAND_SZ

0x00010001 (FLG_ADDREG_TYPE_DWORD)
给定 的值条目名称和 /或  是注册表类型 REG_DWORD

0x00020001 (FLG_ADDREG_TYPE_NONE)
给定 的值条目名称和 /或  是注册表类型 REG_NONE

 详细参见《INF AddReg 指令》