Windows驱动_文件系统过滤驱动之五

来源:互联网 发布:淘宝退款不退货违法 编辑:程序博客网 时间:2024/05/16 05:28
            本来以为,软件驱动,都被自己看得差不多了,谁知道,又冒出来个网络过滤驱动,原来微软专为了网络设备,设计了一种WFP,专门使用为网络过滤,可见,微软对网络的重视,其实也是,现在的网络安全越来越得到很多国家的重视。目前的“棱镜门”可见一斑。另一方面,技术都是无止境的,知道的多了,不知道的也越多了,没办法,既然吃了这碗饭,就只有继续下去。

 

           今天来看一下,文件系统过滤驱动如何加载到系统中。

 

          在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"

原创粉丝点击