本系列文章源于WDK,所有权利归原作者所有,翻译的目的只为交流和学习。除了商用你可以随意地使用这篇译文。但请不要删除声明。 ——by jununfly
一个文件系统minifilter驱动的INF文件一般包含以下部分:
1.Version (必需的)
版本部分指定由minifilter驱动的类型决定的一个类和GUID,如下例.
[Version]
Signature = "$WINDOWS NT$"
Class = "ActivityMonitor"
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider = %Msft%
DriverVer = 10/09/2001,1.0.0.0
CatalogFile =
下表是文件系统minifilter驱动应该在版本中指定的值.
Entry | Value |
Signature | "$WINDOWS NT$" |
Class | 参考 File System Filter Driver Classes and Class GUIDs. |
ClassGuid | 参考 File System Filter Driver Classes and Class GUIDs. |
Provider | 在你自己的INF文件中,你应该指定一个provider 而非Microsoft. |
DriverVer | 参考 INF DriverVer directive. |
CatalogFile | 对反病毒minifilter驱动来说这是有符号的值,此入口包含一个WHQL提供的catalog文件的名.所有其他minifilter驱动应令此处为空白.详细信息,参考INF Version Section一文中对CatalogFile入口的描述. |
2.DestinationDirs (可选但推荐)
DestinationDirs 指定minifilter驱动和应用程序文件将会被复制到哪个目录下.
在这个地方和ServiceInstall 中,你可以指定一个由系统定义的已知系统目录的数字值. 有关这些值的详情,参考 INF DestinationDirs Section.下例中,值12代表驱动目录(在基于NT的平台上是%windir%\system32\drivers),值10代表Windows目录(%windir%).
[DestinationDirs]
DefaultDestDir = 12
Minispy.DriverFiles = 12
Minispy.UserFiles = 10,FltMgr
3.DefaultInstall (必需的)
在DefaultInstall 中,一个CopyFiles directive 会复制minifilter驱动的驱动文件和用户应用程序文件到DestinationDirs指定的目标中.
注意 CopyFiles directive不应涉及catalog文件或INF文件自身. SetupAPI会自动复制这些文件.
你可以创建一个单一的INF文件来在多版本的Windows OS上安装你的驱动.你可以通过为每个版本的OS创建额外的DefaultInstall、DefaultInstall.Services、DefaultUninstall和DefaultUninstall.Services来创建这种INF文件. 每一个都以decoration (例如.ntx86, .ntia64或.nt)修饰来指定它要应用的是哪个OS版本.更多关于创建此类INF文件的信息,参考 Creating INF Files for Multiple Platforms and Operating Systems.
下例是一个典型的DefaultInstall项.
[DefaultInstall]
OptionDesc = %MinispyServiceDesc%
CopyFiles = Minispy.DriverFiles, Minispy.UserFiles
4.DefaultInstall.Services (必需的)
DefaultInstall.Services包含一个AddService directive ,它控制驱动的服务如何以及什么时候被加载,如下例:
[DefaultInstall.Services]
AddService = %MinispyServiceName%,,Minispy.Service
5.ServiceInstall (必需的)
ServiceInstall 包含用于加载驱动服务的信息.在例子MiniSpy驱动中,此项的被命名为"Minispy.Service", 如下例所示.ServiceInstall 的名必须出现在DefaultInstall.Services 项的AddService directive 中.
[Minispy.Service]
DisplayName = %MinispyServiceName%
Description = %MinispyServiceDesc%
ServiceBinary = %12%\minispy.sys
ServiceType = 2 ; SERVICE_FILE_SYSTEM_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL%
LoadOrderGroup = "FSFilter Activity Monitor"
AddReg = Minispy.AddRegistry
Dependencies = FltMgr
ServiceType入口指定了服务的类型.Minifilter驱动应指定一个为2的值(SERVICE_FILE_SYSTEM_DRIVER).更多关于ServiceType 入口的信息,参考 INF AddService Directive.
StartType 指定了什么时候启动服务.下表列出了它的取值范围及这些值的启动类型.
值 | 描述 |
0x00000000 | SERVICE_BOOT_START |
0x00000001 | SERVICE_SYSTEM_START |
0x00000002 | SERVICE_AUTO_START |
0x00000003 | SERVICE_DEMAND_START |
0x00000004 | SERVICE_DISABLED |
更多有关这些启动类型的信息,参考What Determines When a Driver Is Loaded一文中的"Driver Start Types".
LoadOrderGroup 提供filter管理器需要用来确保minifilter驱动和legacy FSFD之间的互用性的信息.你应该为你正在开发的minifilter驱动类型指定一个合适的LoadOrderGroup 值.详情参考 Load Order Groups and Altitudes for Minifilter Drivers.
注意你必须指定一个LoadOrderGroup 值,即使你的minifilter驱动的启动类型不是SERVICE_BOOT_START.在这里,minifilter驱动和legacy FSFD有些不同.
注意 filter管理器的StartType值为SERVICE_BOOT_START,它的LoadOrderGroup值为FSFilter Infrastructure. 这些值确保filter管理器总在一切minifilter驱动之前被加载.
更多关于驱动被加载时StartType和LoadOrderGroup入口如何决定,参考 What Determines When a Driver Is Loaded.
注意 对minifilter驱动来说,StartType和LoadOrderGroup值不决定minifilter驱动在minifilter实例栈中绑定到哪.这个位置是由minifilter实例的altitude决定的.
ErrorControl指定如果在系统启动期间服务失败了要进行的行为. Minifilter 驱动应指定它为1 (SERVICE_ERROR_NORMAL). 更多关于ErrorControl 的信息参考 INF AddService Directive.
AddReg directive 涉及一个或多个INF作者定义的AddRegistry 项,这个项包含要被存储到最新安装的服务的注册值中的信息.Minifilter驱动用AddRegistry 来定义minifilter驱动实例并指定一个默认的实例.
Dependencies 指定了驱动依靠的一切服务或加载顺序组的名字.一切minifilter驱动都必须指定FltMgr,它是filter管理器的服务名.
6.AddRegistry (必需的)
AddRegistry 添加key和值到注册表中. Minifilter驱动用AddRegistry 项来定义minifilter实例并指定一个默认实例.只要filter管理器为该minifilter驱动创建一个新的实例这个信息就会被用到.
在例子MiniSpy 驱动中,以下AddRegistry 和Strings 中的%strkey% 记号定义三个实例,每一个都命名为MiniSpy驱动的默认实例.
[Minispy.AddRegistry]
HKR,%RegInstancesSubkeyName%,%RegDefaultInstanceValueName%,0x00000000,%DefaultInstance%
HKR,%RegInstancesSubkeyName%"\"%Instance1.Name%,%RegAltitudeValueName%,0x00000000,%Instance1.Altitude%
HKR,%RegInstancesSubkeyName%"\"%Instance1.Name%,%RegFlagsValueName%,0x00010001,%Instance1.Flags%
HKR,%RegInstancesSubkeyName%"\"%Instance2.Name%,%RegAltitudeValueName%,0x00000000,%Instance2.Altitude%
HKR,%RegInstancesSubkeyName%"\"%Instance2.Name%,%RegFlagsValueName%,0x00010001,%Instance2.Flags%
HKR,%RegInstancesSubkeyName%"\"%Instance3.Name%,%RegAltitudeValueName%,0x00000000,%Instance3.Altitude%
HKR,%RegInstancesSubkeyName%"\"%Instance3.Name%,%RegFlagsValueName%,0x00010001,%Instance3.Flags%
7.DefaultUninstall (可选)
DefaultUninstall 可选但如果你的驱动可以被卸载的话则推荐你使用它.它包含 DelFiles和DelReg directive来移除文件和注册值入口,如下列所示.
[DefaultUninstall]
DelFiles = Minispy.DriverFiles, Minispy.UserFiles
DelReg = Minispy.DelRegistry
8.DefaultUninstall.Services (可选)
DefaultUninstall.Services 可选但如果你的驱动可以被卸载的话则推荐你使用它.它包含DelService directive来移除minifilter驱动的服务,如下来自MiniSpy驱动的例子所示.
注意 DelService directive应总是指定SPSVCINST_STOPSERVICE标记(0x00000200)来在服务被删除之前停止它.
[DefaultUninstall.Services]
DelService = Minispy,0x200
9.Strings (必需的)
Strings 定义INF文件中使用的每一个%strkey%记号.
你可以通过在INF文件中创建额外的现场指定的Strings.LanguageID 项来创建一个单一的国际化INF文件.
下例是一个典型的Strings项.
[Strings]
Msft = "Microsoft Corporation"
MinispyServiceDesc = "Minispy mini-filter driver"
MinispyServiceName = "Minispy"
RegInstancesSubkeyName = "Instances"
RegDefaultInstanceValueName = "DefaultInstance"
RegAltitudeValueName = "Altitude"
RegFlagsValueName = "Flags"
DefaultInstance = "Minispy - Top Instance"
Instance1.Name = "Minispy - Middle Instance"
Instance1.Altitude = "370000"
Instance1.Flags = 0x1 ; Suppress automatic attachments
Instance2.Name = "Minispy - Bottom Instance"
Instance2.Altitude = "365000"
Instance2.Flags = 0x1 ; Suppress automatic attachments
Instance3.Name = "Minispy - Top Instance"
Instance3.Altitude = "385000"
Instance3.Flags = 0x1 ; Suppress automatic attachments
注意 从x64-based Windows Vista systems开始,所有的内核模式组件,包括非PnP(即插即用)驱动,比如FSD(文件系统, legacy filter和minifilter驱动), 都必须被签名以便加载和执行. 因为这个情况,以下是FSD相关的信息:
o 非PnP驱动的INF文件,包括FSD,不要求包含[Manufacturer] 或[Models]项.
o SignTool 命令行工具, 位于WDK安装目录的\bin\SelfSign 目录中,可以直接用于"嵌入式的签名"一个驱动SYS 执行文件.由于性能原因,引导启动的驱动必须包含一个内含的签名.
o 给定一个INF文件, Inf2cat 命令行工具可用于创建一个驱动包的catalog (.cat)文件.仅catalog文件可以接收WHQL 标识签名.
o 在管理员特权下,一个未签名的驱动也可以在以Vista开始的x64-based系统上安装.不过,这个驱动的加载会失败因为它是未签名的.
o 关于驱动签名的详细信息,参考Driver Signing.
o 掌握签名处理的详细信息, 参考Kernel-Mode Code Signing Walkthrough.
o 所有的内核模式组件,包括自定义的内核模式开发工具,必须被签名.更多信息参考Signing Software for Use in a Driver Development Environment (Windows Vista).