-
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 打开文件句柄
- 定义一个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 handle的 IN-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内核驱动读写文件
2020-10-11 13:04:35windows内核驱动条件下文件的创建、读、写等功能实现源码。适用于驱动调试和运行观察的日志打印输出,比Windbg和reaceview更方便。 -
windows驱动开发sys文件+vc++编写exe调用驱动中的功能
2020-12-26 20:54:15windows驱动开发sys文件+vc++编写exe调用驱动中的功能 两个工程:一个sys驱动工程,一个exe工程 c语言难,vc++更难,c语言驱动开发更是难上加难。一套完整的源代码奉上 -
开发windows驱动程序,实现监控文件读写操作.zip
2020-12-27 09:37:59开发windows驱动程序,实现监控文件读写操作.zip C语言难,VC更难,C驱动更是难上加难 -
Windows 旧驱动文件清理工具
2018-03-17 09:01:25你是否为每次安装驱动后C盘越来越小而苦恼?现在不必了!配合 Rapr 驱动文件清理,一键释放旧驱动的占用空间! -
文件过滤驱动用于windows驱动学习
2020-10-19 10:57:25文件过滤驱动,方便大家参考,内容比较完善,参考此驱动后,对以后写WINDOWS下驱动有帮助。第一个驱动就是从这里开始的,源代码比较有参考意义 -
基于Windows微过滤驱动文件透明加解密研究
2020-10-17 11:49:37介绍了研究“基于Windows文件系统微过滤驱动的文件透明加/解密技术”过程中必须掌握的一些理论基础,包括Windows执行体组件、内核机制、驱动开发基础等基本理论知识。基于微过滤驱动模型,采用3DES加密算法,实现... -
Window文件监控微过滤驱动
2018-07-25 10:04:25Windows文件微过滤驱动(基于minifilter),监控文件的相关操作(如打开、关闭等),并通知应用层进程 -
windows 文件过滤驱动开发
2017-10-31 16:07:04Windows 文件系统过滤驱动开发教程,对于初学者理解Windows过滤驱动很好的教材 -
windows驱动开发+exe调用驱动文件中的api
2020-12-26 20:48:53vc++ windows驱动开发+exe调用驱动文件中的api 用windows ddk编写windows驱动文件sys,再用visual c++编写exe调用驱动文件中的功能 -
windows ddk驱动开发,编写文件监控程序.zip_bsp驱动开发
2020-12-26 20:51:13windows 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驱动标黄色感叹号。禁用驱动程序强制签名 也可以解决此问题,但一次性禁用的...直接替换驱动文件的方式可以一劳永逸的解决此问题。 -
集成usb3.0驱动的Windows2008系统镜像文件(企业版)
2019-08-29 14:32:16下载内容为百度云分享链接,官方原版windows2008系统。自己手动制作的,希望帮到需要的朋友!(由于上一资源所需积分过高,特增加此条新资源) -
集成usb3.0驱动的Windows2008系统镜像文件
2018-08-28 09:43:27下载内容为百度云分享链接,官方原版windows2008系统。自己手动制作的,希望帮到需要的朋友! -
windows内科安全与驱动开发,minifilter禁止txt文件打开demo
2017-11-03 10:55:28《寒江独钓 Windows内核安全编程》的miniflter简单介绍和使用,Minifilter驱动文件,用Minifilter.inf安装 UseMinifilter,应用层 Minifilter_dll ,应用层(客户程序和驱动层通信) -
openmv_windows驱动.zip
2020-07-06 16:50:41OpenMV window环境OpenMV Cam驱动文件,当电脑不能自动完成驱动安装时,需手动安装驱动完成设备端口连接 -
《Windows 文件系统过滤驱动开发教程(第二版)》
2018-03-21 16:13:07里面详细的讲解的关于过滤驱动的知识点,对于学习这方面的小伙伴们很好帮助。 -
Windows驱动程序之cat文件介绍
2022-01-18 13:51:16目录 一、cat文件简介 二、cat文件应用场景 三、cat文件的生成 四、cat文件与数字签名 1、测试签名 ...一、cat文件简介 ...Windows通过使用这些哈希或者指纹来验证驱动程序包在发布后是否未被更改。 一般双...目录
一、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
-
RTL8153 RTL8152(windows+ linux)驱动.zip
2021-07-09 14:27:22RTL8153 RTL8152(windows+ linux)驱动, 包含windows7 windows8 windows10 xp linux下的驱动文件 -
Windows虚拟鼠标键盘驱动
2018-01-18 13:59:16Windows虚拟鼠标键盘驱动 完整源代码包含visual studio项目文件 -
Windows网络和文件系统驱动开发相关
2013-10-08 20:38:43Windows网络和文件系统驱动开发相关,觉得还是不错的资料的 -
windows文件核心驱动结构简介、FileMon例程简介
2014-05-25 23:51:42windows文件核心驱动结构简介、FileMon例程简介、开发注意要点 绝对非常有用!! -
Windows驱动开发集合(PDF+笔记+随书源码+CHM帮助)
2019-03-07 11:33:21Microsoft Windows驱动程序模型设计 Windows驱动学习笔记 Windows文件系统过滤驱动开发教程(第二版) WDMdriver3随书附带光盘 WIN2000驱动程序设计 windows驱动模型 驱动程序超级宝典 笔记及Driverstudio -
windows 驱动 应用层与驱动层通信(读、写文件) 源码
2013-06-04 16:37:36windows 驱动 应用层与驱动层通信(读、写文件) 源码,WDF、WDM IOCONTROL -
windows驱动 遍历nt路径下所有子文件及子文件夹的文件
2018-11-15 08:26:37写一个驱动,得到了nt路径,如\Device\HarddiskVolumeN(例如u盘),然后需要遍历其中的子文件和文件夹中的子文件。ZwOpenFile打开成功了,但是在msdn中没有找到遍历子文件的函数。 尝试用... -
windows驱动inf文件详解
2014-12-16 17:48:51INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名称开始,如[Version]、[Manufacturer]等,后面是改接所含有的各个项,如Signature、DriverVer等。节中各项的基本定义格式为: ...转载自http://www.verydemo.com/demo_c173_i93265.html
INF文件是一个文本文件,由许多按层次结构排列的节组成,他们以方括号中的节名称开始,如[Version]、[Manufacturer]等,后面是改接所含有的各个项,如Signature、DriverVer等。节中各项的基本定义格式为:
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”为字符串的内容。
-
文件过滤系统框架 Windows文件系统过滤驱动开发教程
2010-11-23 22:48:4301.Windows文件系统过滤驱动开发教程(1) .doc 02.Windows文件系统过滤驱动开发教程(2) .do 03.Windows文件系统过滤驱动开发教程(3) .doc 04.Windows文件系统过滤驱动开发教程(4).doc 05.Windows文件系统过滤驱动开发... -
基于IRP的Windows设备驱动程序文件操作的实现 (2010年)
2021-05-20 22:40:34文件是数据存储的基础,处于W indows操作系统内核中的设备驱动程序,对文件系统的访问不像应用程序那样方便。文章介绍了W indows设备驱动程序通过建立自定义I/O请求包(IRP),并将IRP发送到文件系统驱动程序的方式,实现... -
基于Windows文件系统过滤驱动的文件加解密技术研究与实现.pdf
2013-08-17 10:55:16文件透明加解密方案,有需要的同学可以参考下 -
windows驱动程序WDF开发+WDF USB驱动开发指南+usb2.0协议
2018-04-30 11:02:56学习完这三个文件后,你将拥有为usb设备开发windows驱动程序的能力。如需学习stm32 usb设备的开发,敬请关注本人csdn账号。本人有stm32 usb设备开发的相关文档:“STM32F10xxx全速USB设备开发套件用户手册+usb2.0...