文件系统Minifilter驱动(五)

来源:互联网 发布:酱紫类似的网络用语 编辑:程序博客网 时间:2024/04/29 12:33

安装Minifilter驱动

XP及更新的Windows OS中,你应该用INF文件和一个安装应用程序来安装你的minifilter驱动. (2K及更早的OS中,minifilter 驱动一般是借助Service Control Manager安装的.)

注意"基于INF的安装"仅仅意味着你需要使用一个INF文件来复制文件并存储信息到注册表中.你没有被要求用仅仅一个INF文件来安装你的整个产品,且你没有被要求为你的驱动提供一个"右键点击安装"的选项. 

本节包括: 

一、为minifilter驱动创建一个INF文件

[这是初稿且有可能改变.]

一个文件系统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创建额外的DefaultInstallDefaultInstall.ServicesDefaultUninstallDefaultUninstall.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驱动之前被加载. 

更多关于驱动被加载时StartTypeLoadOrderGroup入口如何决定,参考 What Determines When a Driver Is Loaded

注意  对minifilter驱动来说,StartTypeLoadOrderGroup值不决定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 可选但如果你的驱动可以被卸载的话则推荐你使用它.它包含 DelFilesDelReg 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相关的信息: 

非PnP驱动的INF文件,包括FSD,不要求包含[Manufacturer] 或[Models]项

SignTool 命令行工具, 位于WDK安装目录的/bin/SelfSign 目录中,可以直接用于"嵌入式的签名"一个驱动SYS 执行文件.由于性能原因,引导启动的驱动必须包含一个内含的签名. 

给定一个INF文件, Inf2cat 命令行工具可用于创建一个驱动包的catalog (.cat)文件.仅catalog文件可以接收WHQL 标识签名. 

在管理员特权下,一个未签名的驱动也可以在以Vista开始的x64-based系统上安装.不过,这个驱动的加载会失败因为它是未签名的. 

关于驱动签名的详细信息,参考Driver Signing

掌握签名处理的详细信息, 参考Kernel-Mode Code Signing Walkthrough

所有的内核模式组件,包括自定义的内核模式开发工具,必须被签名.更多信息参考Signing Software for Use in a Driver Development Environment (Windows Vista)

原创粉丝点击