精华内容
下载资源
问答
  • Windows驱动开发之文件操作
    千次阅读
    2016-07-06 15:02:11

    转载请注明来源:
    enjoy5512的博客 : http://blog.csdn.net/enjoy5512
    GitHub : https://github.com/whu-enjoy


    1. 在驱动中使用文件

      在Windows执行体中,通过文件对象来代表文件,该文件对象是一种由对象管理器管理的执行体对象。例如:目录也是由文件对象代表的。
    内核组件通过对象名来引用文件,即在文件的全路径前面加\DosDevices。(在Windows 2000及后续操作系统中,\??等同于\DosDevices)。例如,文件C:\WINDOWS\example.txt的对象名为\DosDevices\C:\WINDOWS\example.txt。你需要用对象名来打开文件以获取句柄。

    使用文件步骤:
     1. 打开文件返回文件句柄。
     2. 调用合适的ZwXxxFile 函数以完成对文件的操作。
     3. 调用ZwClose函数关闭打开的文件句柄。
     
      当打开一个指向文件的文件句柄时,Windows执行体就创建了一个文件对象来代表该文件,同时返回一个代表该对象的文件句柄。因此,对于单个文件来说,会存在多个文件对象的情况。同样,由于用户模式的应用程序可能会复制文件句柄,因此,对于同一个文件对象,也会存在多个文件句柄。只有当所有指向一个文件对象的文件句柄都关闭后,Windows执行体才会删除该文件对象。


    1.1 打开文件句柄

    1. 定义一个OBJECT_ATTRIBUTES结构体变量,然后调用InitializeObjectAttributes函数初始化该变量。关键是设置改变量的ObjectName字段为文件对象名。
    InitializeObjectAttributes宏,初始化一个OBJECT_ATTRIBUTES结构体,它指定对象句柄的属性,供打开句柄的例程使用。
    
    VOID InitializeObjectAttributes(
    [out] POBJECT_ATTRIBUTES InitializedAttributes,
    [in] PUNICODE_STRING ObjectName,
    [in] ULONG Attributes,
    [in] HANDLE RootDirectory,
    [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
    );
    
    参数:
    InitializedAttributes [out]
    指定要初始化的OBJECT_ATTRIBUTES结构体指针。
    
    ObjectName [in]
    一个指向UNICODE字符串对象的指针,它包含将要打开句柄的对象名称。
    它必须是一个完整的对象名称或者是相对于RootDirectory参数指定目录的相对路径。
    
    Attributes [in]
    指定一个或多个以下列标志:
    OBJ_INHERIT
    这个句柄可以被当前进程的子进程继承。
    OBJ_PERMANENT
    此标志仅应用于对象管理器命名的对象。
    默认情况下,这样的对象会在关闭所有它们打开的句柄时删除。
    如果指定了此标志,对象不会在所有打开的句柄关闭时删除,
    驱动可以使用ZwMakeTemporaryObject删除固定的对象。
    OBJ_EXCLUSIVE
    这个对象只可以有一个打开的句柄。意味着仅有一个进程可以访问此对象。
    OBJ_CASE_INSENSITIVE
    如果指定了此标志,在对ObjectName参数与已存在的对象名称进行匹配时,会不区分大小写。
    OBJ_OPENIF
    如果在创建对象的例程中指定此标志,当对象已经存在时,例程将会打开些对象。否则,创建对象的例程会返回值为STATUS_OBJECT_NAME_COLLISION的NTSTATUS代码。
    OBJ_KERNEL_HANDLE
    指定句柄仅能在内核模式访问。
    OBJ_FORCE_ACCESS_CHECK
    打开句柄的例程,应执行所有的访问检查,即使是在内核模式下也如此。
    
    RootDirectory [in]
    root目录对象句柄,用于ObjectName参数指定的相对路径时。
    如果ObjectName参数是一个完整的对象名,RootDirectory是NULL。
    使用ZwCreateDirectoryObject获取对象目录的句柄。
    
    SecurityDescriptor [in, optional]
    指定对象创建时应用的一个安全描述符。此参数是可选的。对象如果接受默认的安全设置,驱动程序可以指定NULL。更多信息,参见下面的备注节。
    
    返回值:
    无
    
    备注:
    InitializeObjectAttributes初始化一个OBJECT_ATTRIBUTES结构体,它设置将被打开的对象句柄的属性。调用者可以传递一个此结构的指针到实际打开句柄的例程。驱动程序运行进程上下文中,若要运行在系统进程,需要设置OBJ_KERNEL_HANDLE标志到Attributes参数。这个标志限制,使用此打开的句柄的进程仅能运行在内核模式。否则句柄可以在驱动运行的进程上下文中访问。注意,InitializeObjectAttributes始终设置OBJCECT_ATTRIBUTES的SecurityQualityOfService成员为NULL。如果驱动程序需要一个非空的值,可以直接设置SecurityQualityOfService成员。

    2 调用IoCreateFile, ZwCreateFile, 或者 ZwOpenFile,传递上面定义的结构体变量,成功就会返回执行该文件的句柄。

    注:驱动一般用ZwCreateFile和ZwOpenFile,IoCreateFile很少使用,当调用ZwCreateFile,ZwOpenFile或IoCreateFile时,Windows执行体创建一个代表该文件的新的文件对象,并返回一个指向该对象的句柄。文件对象一直存在,知道你关闭了所有指向它的文件句柄。
    
    原型:
    NTSYSAPI
    NTSTATUS
    NTAPI
    ZwCreateFile(
    OUT PHANDLE FileHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PLARGE_INTEGER AllocationSize OPTIONAL,
    IN ULONG FileAttributes,
    IN ULONG ShareAccess,
    IN ULONG CreateDisposition,
    IN ULONG CreateOptions,
    IN PVOID EaBuffer OPTIONAL,
    IN ULONG EaLength
    );
    
    参数理解:
    OUT-FileHandle--------这是一个指向一个变量的指针,用来最后存放file object handleIN-DesiredAccess----这个参数指定一个访问权限,大概有以下的权限:
    FILE_ANY_ACCESS 0x0000 // any type
    FILE_READ_ACCESS 0x0001 // file & pipe
    FILE_READ_DATA 0x0001 // file & pipe
    FILE_LIST_DIRECTORY 0x0001 // directory
    FILE_WRITE_ACCESS 0x0002 // file & pipe
    FILE_WRITE_DATA 0x0002 // file & pipe
    FILE_ADD_FILE 0x0002 // directory
    FILE_APPEND_DATA 0x0004 // file
    FILE_ADD_SUBDIRECTORY 0x0004 // directory
    FILE_CREATE_PIPE_INSTANCE 0x0004 // named pipe
    FILE_READ_EA 0x0008 // file & directory
    FILE_WRITE_EA 0x0010 // file & directory
    FILE_EXECUTE 0x0020 // file
    FILE_TRAVERSE 0x0020 // directory
    FILE_DELETE_CHILD 0x0040 // directory
    FILE_READ_ATTRIBUTES 0x0080 // all types
    FILE_WRITE_ATTRIBUTES 0x0100 // all types
    FILE_ALL_ACCESS // All of the preceding +
    STANDARD_RIGHTS_ALL
    最后一个权限最大,这里面要注意的是范围问题,有的值只适合目录,有的只适合管道,有的只适合命名管道,有的同时适用,想下这个地方可以做什么文章
    
    ObjectAttributes---指向下面这个结构的一个变量,就是来表明文件对象的属性的。
    typedef struct _OBJECT_ATTRIBUTES {
    ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor; /* type SECURITY_DESCRIPTOR */
    PVOID SecurityQualityOfService; /* type SECURITY_QUALITY_OF_SERVICE */
    } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
    这个结构是针对很多对象的,不光是针对文件对象的,所以OBJ_PERMANENT(永久), OBJ_EXCLUSIVE(互斥),and OBJ_OPENLINK这三个实际上对于文件对象来说始终是无效的
    
    IoStatusBlock-----这个也是个指针变量,指向一个叫做IO_STATUS_BLOCK的结构体,最后函数返回的时候,这个结构体的成员 里面要填充一些值,具体的呢就是完成状态,请求操作的一些信息,最重要的一个成员就是Information成员,他显示了函数对文件的处理方式,他的值 可能是下面的几个:
    FILE_SUPERSEDED(替代)
    FILE_OPENED(打开)
    FILE_CREATED(创建)
    FILE_OVERWRITTEN(重写)
    FILE_EXISTS(存在)
    FILE_DOES_NOT_EXIST(文件不存在)
    
    再看下这个IO_STATUS_BLOCK的具体结构:
    typedef struct _IO_STATUS_BLOCK {
    union {
    NTSTATUS Status;
    PVOID Pointer;
    } DUMMYUNIONNAME;
    ULONG_PTR Information;
    } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
    
    AllocationSize---这是个可选的参数,他是指定初始化文件需要的内存字节数的,所以可向而知,他只有在真正的涉及到文件创建的时候才有意义,也就是说创建,重写,替换这些操作的时候。指向一个LARGE_INTEGER:
    typedef union _LARGE_INTEGER {
    _ANONYMOUS_STRUCT struct
    {
    ULONG LowPart;
    LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct
    {
    ULONG LowPart;
    LONG HighPart;
    } u;
    #endif //MIDL_PASS
    LONGLONG QuadPart;
    } LARGE_INTEGER, *PLARGE_INTEGER;
    
    FileAttributes---这个参数指定文件的属性,刚才是文件对象的属性。可以是以下的:
    FILE_ATTRIBUTE_READONLY
    FILE_ATTRIBUTE_HIDDEN
    FILE_ATTRIBUTE_SYSTEM
    FILE_ATTRIBUTE_DIRECTORY
    FILE_ATTRIBUTE_ARCHIVE
    FILE_ATTRIBUTE_NORMAL
    FILE_ATTRIBUTE_TEMPORARY
    FILE_ATTRIBUTE_SPARSE_FILE
    FILE_ATTRIBUTE_REPARSE_POINT
    FILE_ATTRIBUTE_COMPRESSED
    FILE_ATTRIBUTE_OFFLINE
    FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
    FILE_ATTRIBUTE_ENCRYPTED
    
    ShareAccess---指定共享的权限,以下三种的组合:
    FILE_SHARE_READ
    FILE_SHARE_WRITE
    FILE_SHARE_DELETE
    
    CreateDisposition---这个参数指定要对文件干嘛,可以是下面的值:
    FILE_SUPERSEDE
    FILE_OPEN
    FILE_CREATE
    FILE_OPEN_IF
    FILE_OVERWRITE
    FILE_OVERWRITE_IF
    
    
    CreateOptions---这个参数指定创建或者打开文件的时候做的一些事情,可以是以下的组合:
    FILE_DIRECTORY_FILE
    FILE_WRITE_THROUGH
    FILE_SEQUENTIAL_ONLY
    FILE_NO_INTERMEDIATE_BUFFERING
    FILE_SYNCHRONOUS_IO_ALERT
    FILE_SYNCHRONOUS_IO_NONALERT
    FILE_NON_DIRECTORY_FILE
    FILE_CREATE_TREE_CONNECTION
    FILE_COMPLETE_IF_OPLOCKED
    FILE_NO_EA_KNOWLEDGE
    FILE_OPEN_FOR_RECOVERY
    FILE_RANDOM_ACCESS
    FILE_DELETE_ON_CLOSE
    FILE_OPEN_BY_FILE_ID
    FILE_OPEN_FOR_BACKUP_INTENT
    FILE_NO_COMPRESSION
    FILE_RESERVE_OPFILTER
    FILE_OPEN_REPARSE_POINT
    FILE_OPEN_NO_RECALL
    FILE_OPEN_FOR_FREE_SPACE_QUERY
    
    EaBuffer---这个是个可选的参数,用来存放一些扩展的属性
    EaLength---存放扩展属性的字节大小
    
    返回值理解:
    如果成功,返回STATUS_SUCCESS
    如果失败,返回
    STATUS_ACCESS_DENIED,
    STATUS_OBJECT_NAME_NOT_FOUND, STATUS_OBJECT_NAME_COLLISION,
    STATUS_OBJECT_NAME_INVALID, STATUS_SHARING_VIOLATION, STATUS_NOT_A_DIRECTORY, or
    STATUS_FILE_IS_A_DIRECTORY.

    1.2 文件操作

    下表列出了驱动中常用的利用文件句柄操作文件的函数

    操作函数
    读文件ZwReadFile
    写文件ZwWriteFile
    读文件属性ZwQueryInformationFile
    设置文件属性ZwSetInformationFile
    NTSTATUS
    ZwReadFile(
    IN HANDLE FileHandle,
    IN HANDLE Event OPTIONAL,
    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    IN PVOID ApcContext OPTIONAL,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    OUT PVOID Buffer,
    IN ULONG Length,
    IN PLARGE_INTEGER ByteOffset OPTIONAL,
    IN PULONG Key OPTIONAL);
    
    各参数的简要介绍如下所示:
    FileHandle:函数ZwCreateFile 返回的句柄。如果它是一个内核句柄,则ZwReadFile 和ZwCreateFile 并不需要在同一个进程中,因为内核句柄是各进程通用的。
    Event :一个事件,用于异步完成读时;我们忽略这个参数。
    ApcRoutine Apc:回调例程,用于异步完成读时;我们忽略这个参数。
    IoStatusBlock:返回结果状态,与ZwCreateFile 中的同名参数相同。
    Buffer:缓冲区,如果读取文件的内容成功,则内容将被读取到这里。
    Length:描述缓冲区的长度,即试图读取文件的长度。
    ByteOffset:要读取的文件的偏移量,也就是要读取的内容在文件中的位置。一般来说,不要将其设置为NULL,文件句柄不一定支持直接读取当前偏移。
    Key:读取文件时用的一种附加信息,一般不使用。
    
    当函数执行成功时返回STATUS_SUCCESS,实际上只要能够读取到任意字节的数据(不管它是否符合参数Length 的要求),都返回成功;但是,如果仅读取文件长度之外的部分,则返回STATUS_END_OF_FILE。ZwWriteFile 的参数与ZwReadFile 基本相同。
    ZwQueryInformationFile与ZwSetInformationFile参数基本相同
    ZwSetInformationFile 函数:
    NTSTATUS
    ZwSetInformationFile(
    IN HANDLE FileHandle,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PVOID FileInformation,
    IN ULONG Length,
    IN FILE_INFORMATION_CLASS FileInformationClass
    );
    
    Parameters
    
    FileHandle [in]
    Handle to the file object. This handle is created by a successful call to ZwCreateFile or ZwOpenFile.
    
    IoStatusBlock [out]
    Pointer to an IO_STATUS_BLOCK structure that receives the final completion status and information about the requested operation. The Information member receives the number of bytes set on the file.
    
    FileInformation [in]
    Pointer to a buffer that contains the information to set for the file. The particular structure in this buffer is determined by the FileInformationClass parameter. Setting any member of the structure to zero tells ZwSetInformationFile to leave the current information about the file for that member unchanged.
    
    Length [in]
    The size, in bytes, of the FileInformation buffer.
    
    FileInformationClass [in]
    The type of information, supplied in the buffer pointed to by FileInformation, to set for the file. Device and intermediate drivers can specify any of the following FILE_INFORMATION_CLASS values.

    2. 代码示例

    //程序说明开始
    //==================================================================================
    //  功能 :  文件操作函数
    //  参数 :    
    //  (入口)  
    //  (出口)  无
    //  返回 :  VOID
    //  主要思路 : 
    //  调用举例 : 
    //  日期 : 2016年7月5日 21:07:02 - 2016年7月5日 23:47:35
    //==================================================================================
    //程序说明结束
    VOID FileOption()
    {
        HANDLE SourceFileHandle = NULL;      //源文件句柄
        HANDLE TargetFileHandle = NULL;      //目标文件句柄
        NTSTATUS Status = STATUS_SUCCESS;    //返回状态
        OBJECT_ATTRIBUTES ObjectAttributes;  //OBJECT_ATTRIBUTES结构
        UNICODE_STRING SourceFilePath = RTL_CONSTANT_STRING(L"\\??\\c:\\source.txt"); //源文件
        UNICODE_STRING TargetFilePath = RTL_CONSTANT_STRING(L"\\??\\c:\\target.txt"); //目标文件
        UNICODE_STRING String = {0};           //指向Buffer
        IO_STATUS_BLOCK IoStatusBlock;         //返回结果状态结构体
        PVOID Buffer = NULL;                   //buffer指针
        USHORT Length = 0;                     //要读写的长度
        LARGE_INTEGER Offset = {0};            //要读写的偏移
    
        //初始化OBJECT_ATTRIBUTES结构体
        InitializeObjectAttributes(
            &ObjectAttributes,
            &SourceFilePath,
            OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
            NULL,
            NULL);
    
        //以FILE_OVERWRITE_IF方式打开
        Status = ZwCreateFile(
            &SourceFileHandle,
            GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
            &ObjectAttributes,
            &IoStatusBlock,
            NULL,
            FILE_ATTRIBUTE_NORMAL,
            FILE_SHARE_READ,
            FILE_OVERWRITE_IF,
            FILE_NON_DIRECTORY_FILE|
            FILE_RANDOM_ACCESS|
            FILE_SYNCHRONOUS_IO_NONALERT,
            NULL,
            0);
        if (!NT_SUCCESS(Status))
        {
            DbgPrint("Open source file fault !! - %#x\n", Status);
            return Status;
        }
    
        //字符串操作
        //动态申请内存
        Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, 1024, 'Tag1');
        if (NULL == Buffer)
        {
            DbgPrint("申请Buffer失败!!\n");
            ZwClose(SourceFileHandle);
            Status = STATUS_INSUFFICIENT_RESOURCES;
            return Status;
        }
        //初始化字符串指针
        RtlInitEmptyUnicodeString(&String, Buffer, 512*sizeof(WCHAR));
        //拷贝字符串
        RtlCopyUnicodeString(&String, &SourceFilePath);
        //追加Unicode变量
        RtlAppendUnicodeStringToString(&String, &TargetFilePath);
        //追加字符串
        RtlAppendUnicodeToString(&String, L"别问我这是啥");
    
        //写入文件
        Length = String.Length;
        Offset.QuadPart = 0;
        Status = ZwWriteFile(
            SourceFileHandle,
            NULL,
            NULL,
            NULL,
            &IoStatusBlock,
            Buffer,
            Length,
            &Offset,
            NULL);
        if (!NT_SUCCESS(Status))
        {
            DbgPrint("写入源文件失败!!\n - %#X", Status);
            ZwClose(SourceFileHandle);
            ExFreePool(Buffer);
            return Status;
        }
    
        //初始化OBJECT_ATTRIBUTES结构体
        InitializeObjectAttributes(
            &ObjectAttributes,
            &TargetFilePath,
            OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
            NULL,
            NULL);
    
        //打开目标文件
        Status = ZwCreateFile(
            &TargetFileHandle,
            GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
            &ObjectAttributes,
            &IoStatusBlock,
            NULL,
            FILE_ATTRIBUTE_NORMAL,
            NULL,
            FILE_OVERWRITE_IF,
            FILE_NON_DIRECTORY_FILE|
            FILE_RANDOM_ACCESS|
            FILE_SYNCHRONOUS_IO_NONALERT,
            NULL,
            0);
        if (!NT_SUCCESS(Status))
        {
            DbgPrint("目标文件打开失败!! - %#X", Status);
            ZwClose(SourceFileHandle);
            ExFreePool(Buffer);
            return Status;
        }
    
        //初始化文件指针并循环复制文件,每次复制一个字节
        Offset.QuadPart = 0;
        while(1)
        {
            //读取源文件
            Status = ZwReadFile(
                SourceFileHandle,
                NULL,
                NULL,
                NULL,
                &IoStatusBlock,
                Buffer,
                1,
                &Offset,
                NULL);
            if (!NT_SUCCESS(Status))
            {
                if (STATUS_END_OF_FILE == NULL)
                {
                    Status = STATUS_SUCCESS;
                }
                break;
            }
    
            //写入目标文件
            Status = ZwWriteFile(
                TargetFileHandle,
                NULL,
                NULL,
                NULL,
                &IoStatusBlock,
                Buffer,
                1,
                &Offset,
                NULL);
            Offset.QuadPart += 1;
        }
    
        //释放指针,释放申请的内存
        ZwClose(SourceFileHandle);
        ZwClose(TargetFileHandle);
        ExFreePool(Buffer);
    }
    更多相关内容
  • windows内核驱动条件下文件的创建、读、写等功能实现源码。适用于驱动调试和运行观察的日志打印输出,比Windbg和reaceview更方便。
  • windows驱动开发sys文件+vc++编写exe调用驱动中的功能 两个工程:一个sys驱动工程,一个exe工程 c语言难,vc++更难,c语言驱动开发更是难上加难。一套完整的源代码奉上
  • 开发windows驱动程序,实现监控文件读写操作.zip C语言难,VC更难,C驱动更是难上加难
  • 你是否为每次安装驱动后C盘越来越小而苦恼?现在不必了!配合 Rapr 驱动文件清理,一键释放旧驱动的占用空间!
  • 文件过滤驱动,方便大家参考,内容比较完善,参考此驱动后,对以后写WINDOWS驱动有帮助。第一个驱动就是从这里开始的,源代码比较有参考意义
  • 介绍了研究“基于Windows文件系统微过滤驱动文件透明加/解密技术”过程中必须掌握的一些理论基础,包括Windows执行体组件、内核机制、驱动开发基础等基本理论知识。基于微过滤驱动模型,采用3DES加密算法,实现...
  • Windows文件微过滤驱动(基于minifilter),监控文件的相关操作(如打开、关闭等),并通知应用层进程
  • Windows 文件系统过滤驱动开发教程,对于初学者理解Windows过滤驱动很好的教材
  • vc++ windows驱动开发+exe调用驱动文件中的api 用windows ddk编写windows驱动文件sys,再用visual c++编写exe调用驱动文件中的功能
  • windows ddk驱动开发,编写一个文件...用vc++开发的windows驱动程序,用来实现监视文件操作 sys的IRP_MJ_CREATE和IRP_MJ_CLOSE中调用exe,给exe传递两个参数:1)进程名,2)文件PATH,传递完后: 传递进程名和文件名给exe
  • SVNDrv驱动文件.zip

    2021-04-20 09:54:23
    操作系统:windows10 说明:华为secoclient由于签名问题连接不上,SVN Adapter V1.0驱动标黄色感叹号。禁用驱动程序强制签名 也可以解决此问题,但一次性禁用的...直接替换驱动文件的方式可以一劳永逸的解决此问题。
  • 下载内容为百度云分享链接,官方原版windows2008系统。自己手动制作的,希望帮到需要的朋友!(由于上一资源所需积分过高,特增加此条新资源)
  • 下载内容为百度云分享链接,官方原版windows2008系统。自己手动制作的,希望帮到需要的朋友!
  • 《寒江独钓 Windows内核安全编程》的miniflter简单介绍和使用,Minifilter驱动文件,用Minifilter.inf安装 UseMinifilter,应用层 Minifilter_dll ,应用层(客户程序和驱动层通信)
  • openmv_windows驱动.zip

    2020-07-06 16:50:41
    OpenMV window环境OpenMV Cam驱动文件,当电脑不能自动完成驱动安装时,需手动安装驱动完成设备端口连接
  • 里面详细的讲解的关于过滤驱动的知识点,对于学习这方面的小伙伴们很好帮助。
  • Windows驱动程序之cat文件介绍

    千次阅读 2022-01-18 13:51:16
    目录 一、cat文件简介 二、cat文件应用场景 三、cat文件的生成 四、cat文件与数字签名 1、测试签名 ...一、cat文件简介 ...Windows通过使用这些哈希或者指纹来验证驱动程序包发布后是否未被更改。 一般双...

    目录

    一、cat文件简介

    二、cat文件应用场景

    三、cat文件的生成

    四、cat文件与数字签名

    1、测试签名

    2、微软签名

    五、参考文档


    一、cat文件简介

           cat即目录英文单词catalog的简写形式,.cat文件为数字签名的目录文件。.cat数字签名的目录文件可以用作任意文件集合的数字签名。目录文件包含加密哈希或指纹的集合,目录文件的每个指纹对应于驱动程序包安装的文件。Windows通过使用这些哈希或者指纹来验证驱动程序包在发布后是否未被更改。

            一般双击打开驱动包中的cat安全目录如下所示:

    二、cat文件应用场景

           PnP即插即用设备安装会将驱动包的签名目录文件识别为驱动包的数字签名,驱动程序的INF安装文件通过Version部分中的CatalogFile参数指定驱动程序包的目录文件。

           在INF安装过程中会对INF文件中的数字签名信息进行检查,INF文件中的CatalogFile参数是必须的,否则将会安装不成功并提示INF文件不包含数字签名信息。如果将Version中的CatalogFile参数行进行删除,再使用pnputil工具对INF文件进行安装操作,那么将会提示“The third-party INF does not contain digital signature information”,如图:

           另外,在INF安装过程中会对驱动程序包的cat目录文件进行检查,cat目录文件必须是经过签名的,否则也会导致INF安装失败及错误提示。例如,这里将cat目录文件替换成一个未经签名的文件,然后通过pnputil工具进行安装,如图:

           在驱动程序安装过程中,系统会将cat目录文件拷贝到%SystemRoot%\CatRoot目录下,并将INF文件拷贝到%SystemRoot%\Inf目录下。比如,通过CMD查看本地的系统根目录%SystemRoot%为C:\Windows,那么这里的%SystemRoot%\INF即C:\Windows\INF目录。

           Windows要求每个驱动程序包都应该对应单独的目录文件,且具备唯一的文件名,两个不相关的驱动程序包不能共享单个目录文件,但服务于多个设备的单个驱动程序包只需一个目录文件。

    三、cat文件的生成

           驱动程序安全目录的生成通过Inf2Cat.exe工具实现。Inf2Cat.exe为集成在WDK中的一个应用程序,通过下载WDK来获取。比如我本地下载的是Win11操作系统对应的WDK,Inf2Cat.exe位于<WDK安装目录>\Windows_Kits\10\bin\10.0.22000.0\x86\目录下。

           Inf2Cat.exe工具会对驱动程序包的INF文件进行检查是否存在结构错误,并验证驱动程序包是否可以为指定版本Windows版本列表,对驱动程序包的INF文件进行数字签名。如果验证没有问题,那么将生成指定Windows版本的未签名.cat目录文件。

            如下为一个输出cat文件的demo,对当前目录中的文件进行检查和验证,版本标识符为10_x64,即Windows10 x64的系统,检查和验证过程的详细信息将通过verbose参数打印出来。

    Inf2Cat.exe /driver:"." /os:10_x64 /verbose

    Inf2Cat.exe工具帮助命令如下:

    Inf2Cat.exe /?
    Version 3.3.0.0
    Runs driver signability tests and creates the catalog(s).
    
    INF2CAT /driver:path /os:operatingSystem1[,os2]...
            [/nocat] [/verbose]
            [/drm[:file1[,file2]...]]
            [/pe[:file1[,file2]...]]
            [/pageHashes[:file1][,file2]...]]
    
      /driver (/drv)    Indicates the path to the driver package follows.
    
      path              Specifies the path to the driver package.
    
      /os               Indicates the operating system(s) targeted by the driver
                        package follows. The targeted operating system(s) is a
                        comma separated list of the following values:
    
      operatingSystem1  2000
    
                        XP_X86           Server2003_X86
                        XP_X64           Server2003_X64
                                         Server2003_IA64
    
                        Vista_X86        Server2008_X86
                        Vista_X64        Server2008_X64
                                         Server2008_IA64
    
                        7_X86
                        7_X64            Server2008R2_X64
                                         Server2008R2_IA64
    
                        8_X86
                        8_X64            Server8_X64
                        8_ARM
    
                        6_3_X86
                        6_3_X64          Server6_3_X64
                        6_3_ARM
    
                        10_X86
                        10_X64           Server10_X64
                                         Server10_ARM64
    
                        10_AU_X86
                        10_AU_X64        Server2016_X64
    
                        10_RS2_X86
                        10_RS2_X64
    
                        10_RS3_X86
                        10_RS3_X64
                        10_RS3_ARM64
                        10_RS4_X86
                        10_RS4_X64
                        10_RS4_ARM64
                        10_RS5_X86
                        10_RS5_X64       ServerRS5_X64
                        10_RS5_ARM64     ServerRS5_ARM64
                        10_19H1_X86
                        10_19H1_X64
                        10_19H1_ARM64
                        10_VB_X86
                        10_VB_X64
                        10_VB_ARM64
                        ServerFE_X64
                        ServerFE_ARM64
                        10_CO_X64
                        10_CO_ARM64
    
      /uselocaltime     Use local timezone while running driver
                        timestamp verification tests. By default UTC is used.
    
      /nocat            Prevents the creation of the catalog(s).
    
      /verbose (/v)     Displays detailed console output.
    
      /drm              (Deprecated command line arg. Add drm signature attribute in .inf file to add drm signature attribute)
    
      /pe               (Deprecated command line arg. Add petrust signature attribute in .inf file to add petrust signature attribute)
    
      /pageHashes       Include page hashes with files.  Optionally
                        followed by a list of files.

              其中,这里并没有直接显示Win11相关版本标识符,在这里10_CO_X64即指代的Win 11  (Cobalt)。另外补充一点的是,Win11操作系统共用Win10的内核。

    四、cat文件与数字签名

           如前文所述,驱动程序包中的cat目录文件必须经过数字签名,否则将导致INF安装失败及错误提示。无论cat安全目录的预期操作系统是什么,都不影响加密技术对安全目录的数字签名。

           数字签名可以用来防止软件/文件被篡改。Windows 设备安装使用数字签名来验证驱动程序包的完整性,并验证供应商 (软件发行者) 提供驱动程序包的标识。如果驱动程序包中的文件如INF文件、目录文件以及INF中CopyFiles参数相关的文件被更改,那么PnP设备安装时会认为驱动程序包的数字签名无效。另外,设备硬件或者固件的更改会涉及到HWID的修改,那么对应INF中的HWID的值需要修改,那么也会涉及到数字签名的更新,需要重新提交WHQL或者Authenticode签名。

           在对驱动程序包进行数字签名后,相关文件的属性页面将多出一个“数字签名”菜单,显示签名者姓名、摘要算法以及时间戳。如果驱动包已过微软WHQL认证,一般情况下驱动程序包的sys文件或者dll文件会同时带有厂商的签名以及微软签名,cat目录文件将会带有微软签名,即在cat目录文件的属性页面显示数字签名信息;反之,如果cat目录文件没有经过任何数字签名,那么将不会显示“数字签名”页面,如下图。因此在拿到驱动程序包之后,通过直接查看cat目录文件属性的方式也可以确认此驱动程序是否有经过微软签名。

     

    1、测试签名

            测试签名是指使用测试证书对预发行版本得驱动程序包进行签名,以在测试计算机上使用。 

            在通过Inf2Cat工具对驱动程序的INF文件生成cat目录文件之后,通过signtool工具借助测试签名文件对目录文件进行测试签名。demo如下:

    signtool.exe sign /fd sha256 /f xxx.pfx /p 1234 xxx.cat

           其中,/fd 指定用于创建文件签名的文件摘要算法,默认为sha1;/f 指定文件中的签名证书,仅支持Personal Information Exchange (PFX) 文件格式, 可以使用 Pvk2Pfx 工具将 SPC 和 PVK 文件转换为 PFX 格式;/p指定打开 PFX 文件时要使用的密码。

            补充:

            生成cat目录文件之后使用signtool工具对目录文件进行数字签名,需要先准备好pfx文件。这里需要先生成一对公钥和私钥,然后进行pfx文件格式转换。主要涉及到makecert.exe以及pvk2pfx.exe工具:

    makecert.exe -r -pe -a sha256 -eku 1.3.6.1.5.5.7.3.3 -n CN=Foo -sv xxx.pvk xxx.cer pvk2pfx.exe -pvk xxx.pvk -spc fwu.cer -pi 1234 -spc fwu.cer -pfx xxx.pfx

    2、微软签名

           通常,测试签名驱动程序仅用于开发和测试,不得用于生产出货或者发布给客户。如要实现后者需求,驱动程序必须通过微软的正式签名。

           微软正式签名会在“创建新硬件提交”过程中完成。Parter Center用户在dashboard上传提交驱动程序包对应的.hlk包之后,后台将经历程序包验收、准备、验证、安全目录创建以及签名等过程。在这个过程中,将重新创建.cat安全目录文件,如果驱动程序包中已包含.cat目录文件,微软将用微软已签名的.cat文件替换此文件。值得一提的是,在创建新硬件提交过程中会需要指定驱动程序应包含哪些操作系统签名,这里应该与生产使用的OS对应,比如21H2或者22H1。如果只过了20H2的驱动程序搭配22H1的OS进行生产,那么这可能将不会通过WHQL测试。

           在Win10之前,微软仅对.cat文件进行签名;在Win10以后,微软将对驱动程序包中的所有可移植可执行文件进行签名。即微软签名之后的驱动程序包中的sys文件、dll文件等都会带有微软签名。

           补充:

    • 用户驱动提交微软签名认证过程:提交写好驱动程序-->HLK测试-->pass后创建.hlk文件-->提交dashboard进行“Create a new hardware submission”-->等待流程完成-->下载获取签名驱动程序包。
    • 不同Windows版本换代,如21H1至21H2,系统将允许使用之前版本操作系统的驱动程序,并提供90天的缓冲期。如Filter 81316描述如下:

    五、参考文档

    1、Catalog Files and Digital Signatures - Windows drivers | Microsoft Docs

    2、Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Docs

    3、Inf2Cat - Windows drivers | Microsoft Docs

    4、Components of a Driver Package - Windows drivers | Microsoft Docs

    5、MakeCert - Windows drivers | Microsoft Docs

    6、Pvk2Pfx - Windows drivers | Microsoft Docs

    展开全文
  • RTL8153 RTL8152(windows+ linux)驱动, 包含windows7 windows8 windows10 xp linux下的驱动文件
  • Windows虚拟鼠标键盘驱动 完整源代码包含visual studio项目文件
  • Windows网络和文件系统驱动开发相关,觉得还是不错的资料的
  • windows文件核心驱动结构简介、FileMon例程简介、开发注意要点 绝对非常有用!!
  • Microsoft Windows驱动程序模型设计 Windows驱动学习笔记 Windows文件系统过滤驱动开发教程(第二版) WDMdriver3随书附带光盘 WIN2000驱动程序设计 windows驱动模型 驱动程序超级宝典 笔记及Driverstudio
  • windows 驱动 应用层与驱动层通信(读、写文件) 源码,WDF、WDM IOCONTROL
  • 写一个驱动,得到了nt路径,如\Device\HarddiskVolumeN(例如u盘),然后需要遍历其中的子文件和文件夹中的子文件。ZwOpenFile打开成功了,但是msdn中没有找到遍历子文件的函数。 尝试用...
  • windows驱动inf文件详解

    千次阅读 2014-12-16 17:48:51
     INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名称开始,如[Version]、[Manufacturer]等,后面是改接所含有的各个项,如Signature、DriverVer等。节中各项的基本定义格式为:  ...

    转载自http://www.verydemo.com/demo_c173_i93265.html

        INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名称开始,如[Version][Manufacturer]等,后面是改接所含有的各个项,如SignatureDriverVer等。节中各项的基本定义格式为:

        entry=value[,value…]

        其中,“entry”标示项名称,“value”标示该想的取值。节名和项名称都不区分大小写,且对于Windows 98,其必须小于28个字符;对于Windows 2000,其长度的最大值为255个字节。下表是INF文件中常用的节。

    INF文件中常用的节

    说明

    Version

    INF文件的开始

    SourceDisksNames

    指明去的那个程序所在的磁盘或CD-ROM

    SourceDisksFiles

    指明驱动程序的文件名

    Destination

    指明INF文件和驱动程序的目标文件

    Manufacturer

    指明供应商及其对应Models节的名称

    Models

    指明Install/DDInstall节的名称、设备的硬件ID等信息

    Install(Windows 98)

    Install(Windows 2000)

    指明需复制的文件、想注册表中添加的内容等信息

    DDInstall.Services

    仅适用于Windows 2000

    指明驱动程序安装的详细信息

    String

    指明一系列字符串

     

    1.Version节

        Version节通常作为INF文件的开始,下表列出了其包含的各项。所有INF文件都必须含有Version节及其Signature项。

    Version节中的各项

    说明

    Signature

    指明驱动程序的签名,其取值为:$Windows NT$、$Windows 95$、$Chicago$、

    Class

    指明驱动程序所属的类别

    ClassGuid

    指明设备类的GUID,其格式为:{nnnnnnnn-nnnn-nnnn-nnnnnnnnnnnn}

    Provider

    指明该INF文件的供应商

    LayoutFile

    仅由操作系统内部提供的INF文件使用

    CatalogFile

    指明数字签名文件的文件名,其扩展名为.cat

    DriverVer

    指明驱动程序的版本信息,其格式为:mm/dd/yyyy[,x.y.v.z]

    注:①n代表一个16进制数

        下面对主要的各项进行详细介绍。

    ①.Signature项:指明驱动程序的签名。对于Windows 98和Windows 2000下的USB设备驱动程序,该项的取值通常       为“$Chicago$”。

    ②.Class和ClassGuid项:指明驱动程序所属的设备类别及其GUID,其取值情况见下表。

    常用设备类别及其GUID

    Class

    ClassGuid

    说明

    1394

    6BDD1FC1-810F-11D0-BEC7-08002BE2092F

    1394主控制器

    CDROM

    4D36E965-E325-11CE-BFC1-08002BE10318

    CD-ROM驱动器

    DiskDrive

    4D36E967-E325-11CE-BFC1-08002BE10318

    磁盘驱动器

    Display

    4D36E968-E325-11CE-BFC1-08002BE10318

    显示适配器

    FDC

    4D36E969-E325-11CE-BFC1-08002BE10318

    软盘驱动器

    HDC

    4D36E96A-E325-11CE-BFC1-08002BE10318

    硬盘控制器

    HIDClass

    745a17a0-74d3-11d0-b6fe-00a0c90f57da

    人机接口设备

    Keyboard

    4D36E96B-E325-11CE-BFC1-08002BE10318

    键盘

    Modem

    4d36e96c-e325-11ce-bfc1-08002be10318

    调制解调器

    Monitor

    4d36e96e-e325-11ce-bfc1-08002be10318

    监视器

    Mouse

    4d36e96f-e325-11ce-bfc1-08002be10318

    鼠标

    Net

    4d36e972-e325-11ce-bfc1-08002be10318

    网络适配器

    Ports

    4d36e978-e325-11ce-bfc1-08002be10318

    端口(COM&LPT)

    Printer

    4d36e979-e325-11ce-bfc1-08002be10318

    打印机

    System

    4d36e97d-e325-11ce-bfc1-08002be10318

    系统设备

    TapeDrive

    6D807884-7D21-11CF-801C-08002BE10318

    磁带驱动器

    USB

    36FC9E60-C465-11CF-8056-444553540000

    USB

    ③.DriverVer项:指明驱动程序的版本信息。其“mm/dd/yyyy”代表月/日/年;“x.y.v.z”代表驱动程序的版本号,它是可选的。


    2.SourceDiskNames节

        SourceDiskNames节指明设备驱动程序所在的磁盘或CD-ROM,其各项的格式如下:

            diskid=disk-description,disk-label,disk-serial-number   (Windows 98)

            diskid=disk-description[,[tagfile][,unused,path]]  (Windows 2000)

        其中,“disked”指出磁盘驱动器的编号,它是正整型数,通常从1开始,且不能重复;“disk-description”表示磁盘的描述信息,他通常为一个字符串。对于Windows 98,“disk-label”指出磁盘的卷标;“disk-serial-numbe”指出磁盘的序列号。对于Windows 2000,“tagfile”指出磁盘标签文件的文件名;“unused”保留未用;“path”指出驱动程序所在的路径;“[ ]”表示可选参数。


    3.SourceDiskFiles节

        SourceDiskFiles节指明设备驱动程序的文件爱你名,其各项格式如下:

            filename=diskid[,subdir] (Windows 98)

            filename=diskid[,[,subdir][,size]]   (Windows 2000)

        其中,“filename”指出驱动程序的文件名;“diskid”指出磁盘驱动器的编号;“subdir”指出该文件在磁盘上的路     径;“size”指出该文件未经压缩时的大小,以字节为单位。


    4.DestinationDirs节

        DestinationDirs节指明INF文件和设备驱动程序的目标目录。当INF文件使用CopyFiles、DelFiles、RenFiles指令时,则必须包含该节。其各项的格式如下:

        DefaultDestDir=dirid[,subdir]

        File-list-section=dirid[,subdir]

        其中,“DefaultDestDir”是一个项名称,代表文件复制、删除、重命名操作的缺色很难干目标目录;“file-list-section”指出CopyFiles、DelFiles、RenFiles指令所引用的节;“dirid”指出目标目录值,见下表;“subdir”指出dirid目录下的子目录。

    DestinationDirs节中的常用dirid

    dirid

    目标目录

    dirid

    目标目录

    10

    Windows目录:%windir%

    17

    INF目录

    11

    系统目录

    Windows 98:%windir%/system

    Windows 2000:%windir%/system32

    18

    帮助目录

    20

    字体目录

    12

    驱动程序目录

    Windows 98:%windir%/system/IoSubsys

    Windows 2000:%windir%/system32/drivers

    23

    颜色目录

    24

    应用程序目录(Windows2000)

    13

    命令目录(Windows98)

    25

    共享目录

    14

    控制面板目录(Windows98)

    50

    %windir%/system(Windows2000)

    15

    打印机目录(Windows98)

    54

    Ntldr.exe和osloader.exe所在的目录(Windows2000)

    16

    工作组目录(Windows98)

    55

    打印处理器目录(Windows2000)


    5.Manufacturer节

        Manufacturer节指明供应商及其对应Models接的名称,其各项的格式如下:

    %strkey%=models-section-name

        其中,“strkey”代表设备制造的名字,其字符串值在String节中定义;“models-section-name”指出Models节的名称。


    6.Models节

        Models节指明Install/DDInstall节的名称、设备的硬件ID和兼容ID等信息,其节名称由Manufacturer节指定。其各项的格式如下:

        device-description=install-section-name,hw-id[,compatiable-id…]

        其中,“device-description”指出设备的表述信息,他可以是一个字符串,也可以使一个%strkey%;“install-section-name”指出Install/DDInstall节的名称;“hw-id”指出设备的硬件ID;“compatiable-id”指出设备的兼容ID。


    7.Install/DDInstall节

        Install/DDInstall节指明需复制的文件、想注册表中添加的内容等信息,其节名称由Models节指定。下表列出了其包含的常用项。

    Install/DDInstall节中的常用项

    说明

    DriverVer

    指明驱动程序的版本信息,格式为:mm/dd/yyyy[,x.y.z]

    CopyFiles

    指明需复制的文件,格式为:

    CopyFiles=@filename|file-list-section[,file-list-section]...

    AddReg

    指明向注册表中添加的其他INF文件按,格式为:

    AddReg=add-registry-section[,add-registry-section]…

    Include

    指明安装时需要的其他INF文件,格式为:

    Include=filename.inf[,filename2.inf]…

    Needs

    指明安装时所需的特定INF文件,格式为:

    Needs=inf-section-name[,inf-section-name]…

    Delfiles

    指明需删除的文件,格式为:

    Delfiles=inf-section-name[,inf-section-name]…

    RenFiles

    指明需重命名的文件,格式为:

    Renfiles=inf-section-name[,inf-section-name]…

    DelReg

    指明需删除的注册表内容,格式为:

    DelReg=del-registry-section[,del-registry-section]…

      Install/DDInstall节中的常用项的详细介绍。

      ①CopyFiles项:它是Install/DDInstall节中的一个基本指令,用于指明需要复制的文件。其“filename”指出目标文件名;“file-list-section”是其创建的文件列表节,该节格式为

        [file-list-section]

        destination-file-name[,source-file-name][,temporary-file-name][,flag]

        其中,“destination-file-name”指出目标文件名;“source-file-name”指出源文件名,如果其和目标文件名相同,则可忽略该参数;“temporary-file-name”指出复制操作过程中所需要的临时文件名,他只适用于Windows 98;“flag”指出该文件的一些处理方法,其取之情况如下表。

    CopyFiles项中的flag参数

    符号

    说明

    0x00000400

    COPYFLG_REPLACEONLY

    仅替换目标目录中的文件

    0x00000800

    COPYFLG_NODECOMP

    复制并不解压缩

    0x00000008

    COPYFLG_FORCE_FILE_IN_USE

    将源文件赋值为临时文件名,以重新命名

    0x00000010

    COPYFLG_NO_OVERWRITE

    不替换原有文件

    0x00001000

    COPYFLG_REPLACE_BOOT_FILE

    强制用户重新引导系统

    0x00002000

    COPYFLG_NOPRUNE

    强制复制文件

    0x00000020

    COPYFLG_NO_VERSION_DIALOG

    不覆盖新版本的文件

    0x00000004

    COPYFLG_NOVERSIONCHECK

    可覆盖任何版本的文件

    0x00000040

    COPYFLG_OVERWRITE_ORDER_ONLY

    仅覆盖旧版本的文件

    0x00000001

    COPYFLG_WARN_IF_SKIP

    当用户跳过文件时发出警告

    0x00000002

    COPYFLG_NOSKIP

    不允许用户跳过文件

      ②AddReg项:它是Install/DDInstall节所必须包含的指令,用于指明需项注册表中添加的内容。其“add-registry-section”是它创建的添加注册表节,该节的格式为

        [add-registry-section]

        reg-root, [subkey], [value-entry-name], [flags], [value]

        其中,“reg-root”指出注册表树的根目录,它的取值在下表中;“subkey”指出reg-root下的子目录(或称子键);“value-entry-name”指出要增加的注册表值;“flags”指出其对注册表的一些处理方法,取值在下面的flags表中;“value”指出新增加注册表值的数据。

    AddReg项中的reg-root参数

    说明

    HKCR

    HKEY_CLASSES_ROOT

    HKCU

    HKEY_CURRENT_USER

    HKLM

    HKEY_LOCAL_MACHINE

    HKU

    HKEY_USER

    HKR

    被安装设备的注册表键

    AddReg项中的flags参数

    符号

    说明

    0x00000000

    FLG_ADDREG_TYPE_SZ

    value为REG_SZ类型

    0x00000001

    FLG_ADDREG_BINVALUETYPE

    value为2进制数据

    0x00000002

    FLG_ADDREG_NOCLOBBER

    不替换已有注册表中的value

    0x00000004

    FLG_ADDREG_DELVAL

    从注册表中删除subkey或

    value-entry-name

    0x00000010

    FLG_ADDREG_KEYONLY

    仅建立subkey,忽略value-entry-name

    和value

    0x00000020

    FLG_ADDREG_OVERWRITEONLY

    仅当value-entry-name时替换value

    0x00010000

    FLG_ADDREG_TYPE_MULTI_SZ

    value为REG_MULTI_SZ类型

    0x00000008

    FLG_ADDREG_APPEND

    添加value至已有注册表值

    0x00020000

    FLG_ADDREG_TYPE_EXPEND_SZ

    value为REG_EXPAND_SZ类型

    0x00010001

    FLG_ADDREG_TYPE_DWORD

    value为REG_DWORD类型

    0x00020001

    FLG_ADDREG_TYPE_NONE

    value为REG_NONE类型(Windows2000)

      ③DelFiles项:它是Install/DDInstall节中的可选指令,用于指明需删除的文件。其“file-list-section”是它创建的文件列表节,该节的格式为

        [file-list-section]

        destination-file-name[,,,flag]

        其中,“destination-file-name”指出目标文件名;“flag”指出该文件的一些处理方法,其取值如下表。

    DelFiles项中的flag参数

    符号

    说明

    0x0000001

    DELFLG_IN_USE

    在其安装处理操作完成后再删除该文件

    0x0001000

    DELFLG_IN_USE1

    功能与DELFLG_IN_USE一样,仅适用Windows2000

      ④RenFiles项:它是Install/DDInstall节中的可选指令,用于指明需重命名的文件。其“file-list-section”是它创建的文件列表节,该节的格式为

        [file-list-section]

        new-dest-file-name, old-source-file-name

        其中,“new-dest-file-name”指出该文件的新文件名;“old-source-file-name”指出其原有文件名。


      ⑤DelReg项:它是Install/DDInstall节中的可选指令,用于指明需从注册表中删除的内容。其“del-registry-section”是它创建的删除注册表节,该节的格式为

        [del-registry-section]

        reg-root, subkey [,value-entry-name]

        其中,“reg-root”指出该注册表树中的根目录,取值与AddReg的ret-root相同; “subkey”指出reg-root下的子目录(或称子键);“value-entry-name”指出要删除的注册表值。


    8.DDInstall.Services节

        DDInstall.Services节指明驱动程序安装的详细信息,他只是用于Windows 2000.他的节名称为[install-section-name.Services],其“install-section-name”由Models节指定。下表列出了其包含的常用项。

    DDInstall.Services节中的常用项

    说明

    AddService

    控制驱动程序的安装过程,格式为

    AddService=ServiceName,[flags],service-install-section

    [,event-log-install-section[,[EventLogType][,EventName]]]…

    DelService

    删除一个或多个已有的驱动程序,格式为

    DelService=ServiceName [,[flags][,[EventLogType][,EventName]]]…

    Include

    指明安装时所需的其他INF文件,格式为

    Include =filename.inf [,filename2.inf]…

    Needs

    之敏感转世所需要的特定INF文件,格式为

    Needs = inf-section-name[,inf-section-name]…

    主要项进行详细介绍。

      ①AddService项:它是DDInstall.Services节所必须包含的指令,用于控制设备驱动程序的安装过程。其“ServiceName”指出驱动程序的名字;“flags”指出一个或多个系统定义的标识,其取值情况如下表;“event-log-install-section”是其创建的事件日志安装,下表中列出了该节所包含的常用项;“service-install-section”是其创建的服务安装节,下表中列出了该节所包含的常用项;“EventLogType”指出事件日志的类型,其取值为System、Security和Application;“EventName”指出事件日志的名字。

    AddService项的常用flags参数

    符号

    说明

    0x00000002

    SPSVCINST_ASSOCSERVICE

    指明其为PnP功能驱动程序

    0x00000008

    SPSVCINST_NOCLOBBER_DISPLAYNAME

    不覆盖指定服务的名字

    0x00000100

    SPSVCINST_NOCLOBBER_DESCRIPTION

    不覆盖指定服务的描述

    0x00000010

    SPSVCINST_NOCLOBBER_STARTTYPE

    不覆盖指定服务的启动类型

    0x00000020

    SPSVCINST_NOCLOBBER_ERRORCONTROL

    不覆盖指定服务的差错控制值

    event-log-install-section节中的常用项

    说明

    AddReg

    指明向注册表中添加的内容,格式如下

    AddReg=add-registry-section[,add-registry-section]…

    DelReg

    指明需删除的注册表内容,格式如下

    DelReg=del-registry-section[,del-registry-section]…

    BitReg

    有效但几乎无用,格式如下

    BitReg=bit-registry-section[,bit-registry-section]…

    DisplayName

    驱动程序的名字,为字符串值

    Description

    驱动程序的描述,为字符串值

    ServiceType

    驱动程序的类型,为特定16进制数

    StartType

    驱动程序的启动类型,为特定16进制数

    ErrorControl

    驱动程序的差错控制级别,为特定16进制数

    ServiceBinary

    驱动程序的完整路径名:%dirid% /filename

    以下是对event-log-install-section节中的常用项的主要项进行详细介绍。

    <1>ServiceType项:指明驱动程序的类型,取值情况如下表。

    ServiceType项的取值

    符号

    说明

    0x00000001

    SERVICE_BOOT_START

    内核模式驱动程序

    0x00000002

    SERVICE_KERNEL_FILE_SYSTEM_DRIVER

    上层网络驱动程序或文件系统

    0x00000010

    SERVICE_WIN32_OWN_PROCESS

    Win32应用程序

    0x00000020

    SERVICE_WIN32_SHARE_PROCESS

    Win32应用程序

    <2>StartType项:指明驱动程序的启动类型,其取值情况如下表。

    StartType项的取值

    符号

    说明

    0x0

    SERVICE_BOOT_START

    由操作系统加载程序启动

    0x1

    SERVICE_SYSTEM_START

    由操作系统初始化过程中启动

    0x2

    SERVICE_AUTO_START

    由服务控制管理器启动

    0x3

    SERVICE_DEMAND_START

    由PnP管理器或服务控制管理器按需启动

    0x4

    SERVICE_DISABLE

    禁止启动

    <3>ErrorControl项:指明驱动程序的差错控制级别,其取值情况如下表。

    ErrorControl项的取值

    符号

    说明

    0x0

    SERVICE_ERROR_IGNORE

    不显示警告信息

    0x1

    SERVICE_ERROR_NORMAL

    显示警告信息

    0x2

    SERVICE_ERROR_SERVICE

    当驱动程序加载失败时,系统将使用其注册的LastKnownGood重试,并忽略其后的错误

    0x3

    SERVICE_ERROR_CRITICAL

    当驱动程序加载失败时,系统将使用其注册的LastKnownGood重试,并对其后的错误进行检验


      ②DelService项:它是DDInstall.Service节中的可选指令,用于删除一个或多个已有的设备驱动程序。其“ServiceName”指出驱动程序的名字;“flags”指出一个或多个系统定义的标识,取值见下表;“EventLogType”指出事件日志的类型,其取值为System、Security或Application;“EventName”指出事件日志的名字。

    DelService项的flags参数

    符号

    说明

    SPSVCINST_DELETEEVENTLOGENTRY

    删除与ServiceName有关的事件日志

    SPSVCINST_STOPSERVICE

    在删除之前首先停止服务


    9.String节

        String节指明一些列字符串,其所含各项的格式为

        strkey=[“]some string[“]

    其中,“strkey”指出字符串的名字,它只能包含字母和数字;“some string”为字符串的内容。


    展开全文
  • 01.Windows文件系统过滤驱动开发教程(1) .doc 02.Windows文件系统过滤驱动开发教程(2) .do 03.Windows文件系统过滤驱动开发教程(3) .doc 04.Windows文件系统过滤驱动开发教程(4).doc 05.Windows文件系统过滤驱动开发...
  • 文件是数据存储的基础,处于W indows操作系统内核中的设备驱动程序,对文件系统的访问不像应用程序那样方便。文章介绍了W indows设备驱动程序通过建立自定义I/O请求包(IRP),并将IRP发送到文件系统驱动程序的方式,实现...
  • 文件透明加解密方案,有需要的同学可以参考下
  • 学习完这三个文件后,你将拥有为usb设备开发windows驱动程序的能力。如需学习stm32 usb设备的开发,敬请关注本人csdn账号。本人有stm32 usb设备开发的相关文档:“STM32F10xxx全速USB设备开发套件用户手册+usb2.0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 340,266
精华内容 136,106
关键字:

windows驱动文件在哪里