今天来看一下,文件系统过滤驱动如何加载到系统中。
在WINDOWS 2000以前的操作系统中,文件系统过滤驱动,是通过服务管理器加载安装到系统中的,对于XP以后的操作系统,微软规定必须通过INF文件,使用安装程序,将文件系统过滤驱动安装到系统中。
在不远的将来,基于INF文件的安装方式也会放到Windows Hardware Certification Kit需求中去。
我们下来具体来看一下文件系统过滤驱动的INF文件有哪些特定的设置。
我们知道INF文件其实就是一个文本文件,微软规定了很多节,SetupAPI调用特定的节的内容安装驱动,比如相关注册表的配置,文件的拷贝等等。
从VISTA开始,WIN64位,必须INF文件必须遵守如下的规定:
1,对于不是PNP的驱动,包含文件系统驱动,INF文件以后不再需要Manufaxturer和Models这两个节。
2,SignTool命令行工具,包含在WDK的安装目录\bin\SelfSign下面,可以直接对驱动SYS可执行文件进行签名,基于performance的原来,采用系统启动就加载方式的驱动,必须包含一个内置的签名。
3,对于给定的一个INF文件,Inf2Cat命令行工具可以为驱动包创建一个.cat文件,.cat文件可以得到WHQL的签名。
4,在管理员的权限下,一个没有经过签名的驱动在WIN64 VISTA以后仍然可以被安装,但是驱动启动时会失败,因为没有签名。
5,当然微软有一个Walkthrough来解决这个问题,可以通过如下的网站http://msdn.microsoft.com/en-
us/windows/hardware/gg487328.aspx。
6,所有的内核部件,包含定制的内核工具,都必须签名,具体的可以看如下网站:http://msdn.microsoft.com/en-us/library/windows/hardware/ff552275(v=vs.85).aspx。
INF文件不能用于从注册表中读取相关的信息,而启动用户模式的应用程序。
当你创建完INF文件后,就需要在里面加入一些代码,这些代码可以被安装程序识别,安装程序会调用用户模式安装函数读取INF文件里面的相关信息,然后执行安装操作。
你可以使用微软定义好的为文件系统过滤驱动写的INF模板,进行修改INF文件,你可以使用ChkINF工具来检测你的INF文件的语法。
一个完整的INF文件一般包含如下的节:
Version (required)
DestinationDirs (optional but recommended)
SourceDisksNames (required)
SourceDisksFiles (required)
DefaultInstall (required)
DefaultInstall.Services (required)
ServiceInstall (required)
DefaultUninstall (optional)
DefaultUninstall.Services (optional)
Strings (required)
先来看Version节:
Version节包含Class 和ClassGuid,版本,cat文件名等信息。
[Version]
Signature = "$WINDOWS NT$"
Class = "ActivityMonitor"
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider = %Msft%
DriverVer = 08/28/2000,1.0.0.1
CatalogFile =
下面的一些值,是文件系统过滤驱动需要在Version节中指定的值。
Entry Value
Signature "$WINDOWS NT$"
Class See File System Filter Driver Classes and Class GUIDs.
ClassGuid See File System Filter Driver Classes and Class GUIDs.
Provider In your own INF file, you should specify a provider other than Microsoft.
DriverVer See INF DriverVer directive.
CatalogFile Leave this entry blank. In the future, it will contain the name of a WHQL-supplied catalog
file for signed drivers.
DestinationDirs Section(optional but recommended)
DestinationDirs节指定我们的文件系统过滤驱动和相关的应用程序存放在哪个目标文件夹。
在DestinationDirs和ServiceInstall节,我们可以使用系统定义好的代表常用文件路径的数字值,比如12代表%windir%\system32\drivers,而10代表的是%windir%文件夹
[DestinationDirs]
DefaultDestDir = 12
MyLegacyFilter.DriverFiles = 12
MyLegacyFilter.UserFiles = 10,MyLegacyFilter
SourceDisksNames节(required):
SourceDisksNames指定需要部署在的媒体装置名。如果只在唯一的媒体磁盘上部署为1,下面的Disk1在string节中定义。
[SourceDisksNames]
1 = %Disk1%
SourceDisksFiles 节(required):
SourceDisksFiles 指定需要拷贝到目标文件夹的源文件列表,下面的这个1是上面SourceDisksNames节中指定的。
[SourceDisksFiles]
myLegacyFilter.exe = 1
myLegacyFilter.sys = 1
DefaultInstall 节(required):
在DefaultInstall里面, CopyFiles指示拷贝文件系统过滤驱动和用户应用程序拷贝到 DestinationDirs 指定的目标文件夹。
注意:CopyFiles不涉及cat和inf文件的拷贝,因为SetupAPI会自动拷贝这些文件。
你可以创建一个INF文件,把你的驱动安装到不同版本的Windows操作系统中,但是需要创建额外的additional
DefaultInstall, DefaultInstall.Services, DefaultUninstall, DefaultUninstall.Services这些节为不同版本的操作系统。但是
每一个节的标识的标志不一样(nt86,ntia64,nt)对应不同版本的操作系统。
下面的例子中,CopyFiles指示拷贝那些在 MyLegacyFilter.DriverFiles 和MyLegacyFilter.UserFiles 中指定的文件拷贝到目标文件夹。
[DefaultInstall]
OptionDesc = %MyLegacyFilterServiceDesc%
CopyFiles = MyLegacyFilter.DriverFiles, MyLegacyFilter.UserFiles
DefaultInstall.Services 节(required):
DefaultInstall.Services包含AddService指示控制驱动服务子健的增加。
下面的例子中AddService增加了MyLegacyFilter服务到操作系统中,%MyLegacyFilterServiceName%为服务名的字符串,MyLegacyFilter.Service需要在注册表中增加的注册表的子健和相应的值。
[MyLegacyFilter.Service]
DisplayName = %MyLegacyFilterServiceName%
Description = %MyLegacyFilterServiceDesc%
ServiceBinary = %12%\myLegacyFilter.sys
ServiceType = 2 ; SERVICE_FILE_SYSTEM_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
LoadOrderGroup = "FSFilter Activity Monitor"
AddReg = MyLegacyFilter.AddRegistry
下面就里面的值一一进行说明:
DisplayName :服务显示的名字。
Description :描述服务的字符串
ServiceBinary :整个要执行的服务的全路径名。
ServiceType :可以取如下值。
0x00000001 SERVICE_KERNEL_DRIVER (Device driver service)
0x00000002 SERVICE_FILE_SYSTEM_DRIVER (File system or file system filter driver service)
0x00000010 SERVICE_WIN32_OWN_PROCESS (Microsoft Win32 service that runs in its own process)
0x00000020 SERVICE_WIN32_SHARE_PROCESS (Win32 service that shares a process)
StartType :加载方式,我们之前有说过,这里不详述。
0x00000000 SERVICE_BOOT_START
0x00000001 SERVICE_SYSTEM_START
0x00000002 SERVICE_AUTO_START
0x00000003 SERVICE_DEMAND_START
0x00000004 SERVICE_DISABLED
LoadOrderGroup :指示文件系统过滤驱动的功能。具体的类型分类,可以参考http://msdn.microsoft.com/en-
us/library/windows/hardware/ff549694(v=vs.85).aspx
ErrorControl:说明,如果文件系统过滤驱动加载失败,系统如何响应,就是接下来干吗。
0x00000000 SERVICE_ERROR_IGNORE (Log the error and continue system startup.)
0x00000001 SERVICE_ERROR_NORMAL (Log the error, display a message to the user, and continue system
startup.)
0x00000002 SERVICE_ERROR_SEVERE (Switch to the registry's LastKnownGood control set and continuesystem startup.)
0x00000003 SERVICE_ERROR_CRITICAL (If system startup is not using the registry's LastKnownGood controlset, switch to LastKnownGood and try again. If startup still fails, run a bug-check routine. Only the drivers that
are needed for the system to startup should specify this value in their INF files.)
AddRegistry节:定义为了新增加的服务,增加的注册表项。
注意:如果INF还要用于在服务安装后,还要更新注册表项的值,这个节需要指定0x00000002 (FLG_ADDREG_NOCLOBBER)这个
标志,这个标志在HKLM\CurrentControlSet\Services这个路径下增加。
[ExampleFileSystem.AddRegistry]
HKR,Parameters,ExampleParameter,0x00010003,1
DefaultUninstall 节(optional):
如果我们的驱动支持反安装,就需要指定这个节, DelFiles 指示删除掉之前拷贝的文件,DelReg 删除掉之前增加的注册表项。
DefaultUninstall.Services 节 (optional):
删除我们增加的系统服务。
[DefaultUninstall.Services]
DelService = MyLegacyFilter,0x200
Strings 节(required):
定义INF中需要用的字符串:
[Strings]
Msft = "Microsoft Corporation"
MyLegacyFilterServiceDesc = "MyLegacyFilterFilter Driver"
MyLegacyFilterServiceName = "MyLegacyFilter"
MyLegacyFilterRegistry = "system\currentcontrolset\services\MyLegacyFilter"
MyLegacyFilterMaxRecords = "MaxRecords"
MyLegacyFilterMaxNames = "MaxNames"
MyLegacyFilterDebugFlags = "DebugFlags"
Disk1 = "MyLegacyFilter Source Media"