Window内核函数 - 获取或修改文件属性

2024-05-24 02:12

本文主要是介绍Window内核函数 - 获取或修改文件属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        获取和修改文件属性,包括获取文件大小、获取或修改文件指针位置、获取或修改文件名、获取或修改文属性(只读属性、隐藏属性)、获取或修改文件创建、修改日期等。DDK提供了内核函数 ZwSetInformationFile 和 ZwQueryInformationFile 函数来进行获取和修改文件属性。

NTSTATUS ZwSetInformationFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID FileInformation,IN ULONG Length,IN FILE_INFORMATION_CLASS FileInformationClass);
// FileHandle: 文件句柄
// IoStatusBlock:返回设置的状态
// FileInformation:依据 FileInformation 不同而不同。作为输入信息、
// Length:FileInformation 数据的长度
// FileInformationClass:描述修改属性的类型
NTSTATUS ZwQueryInformationFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,OUT PVOID FileInformation,IN ULONG Length,IN FILE_INFORMATION_CLASS FileInformationClass);
// FileHandle: 文件句柄
// IoStatusBlock:返回设置的状态
// FileInformation:依据 FileInformation 不同而不同。作为输入信息、
// Length:FileInformation 数据的长度
// FileInformationClass:描述修改属性的类型

这两个函数的参数基本相同。其中 FileInformationClass执行修改或者查询的类别。

(1). 当 FileInformationClass 是 FileStandardInformation 时,输入和输出的数据是 FILE_STANDARD_INFORMATION 结构体,描述文件的基本信息。

typedef struct _FILE_STANDARD_INFORMATION {LARGE_INTEGER AllocationSize;      // 为文件分配的大小(注:这个不是文件大小,而是可能所需要的大小)LARGE_INTEGER EndOfFile;         // 距离文件结束还有多少个字节ULONG NumberOfLinks;            // 有多少个链接文件BOOLEAN DeletePending;            // 是否准备删除 BOOLEAN Directory;                // 是否为目录
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;

(2). 当 FileInformationClass 是 FileBasicInformation 时,输入和输出的数据是 FILE_BASIC_INFORMATION 结构体,描述文件的基本信息。

typedef struct _FILE_BASIC_INFORMATION {LARGE_INTEGER CreationTime;     // 文件创建时间LARGE_INTEGER LastAccessTime;    // 最后访问时间LARGE_INTEGER LastWriteTime;    // 最后写时间LARGE_INTEGER ChangeTime;        // 修改修改时间ULONG FileAttributes;            // 文件属性
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;

其中,时间参数是从一个LARGE_INTEGER的整数,该证书代表从1901年经过多少个10ns(纳秒)。
    FileAttributes 描述文件属性。 
        FILE_ATTRIBUTE_NORMAL 描述一般文件。 
        FILE_ATTRIBUTE_DIRECTORY 描述是目录。
        FILE_ATTRIBUTE_READONLY 描述该文件为只读。
        FILE_ATTRIBUTE_HIDDEN 代表隐含文件。
        FILE_ATTRIBUTE_SYSTEM 代表系统文件。
        
(3). 当 FileInformationClass 是 FileNameInformation时,输入和输出的数据是 FILE_NAME_INFORMATION 结构体,描述文件名信息。

typedef struct _FILE_NAME_INFORMATION {ULONG FileNameLength;   // 文件名长度WCHAR FileName[1];        // 文件名
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;    

注意: 这里指定文件名的字符串是宽字符集字符串。

(4). 当 FileInformationClass 是 FilePositionInformation 时, 输入和输出的数据是 FILE_POSITION_INFORMATION 结构体,描述文件名信息。
    

typedef struct _FILE_POSITION_INFORMATION {LARGE_INTEGER CurrentByteOffset; // 代表当前文件指针位置
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;

下面的代码演示了如何使用ZwQueryInformationFile函数查询、修改文件属性。

	OBJECT_ATTRIBUTES  objectAttri;IO_STATUS_BLOCK iostatus;HANDLE hfile;UNICODE_STRING logFileUnicodeStr;// 初始化 UNICODE_STRING 字符串RtlInitUnicodeString(&logFileUnicodeStr, L"\\?\\C:\\1.LOG");// 或者写成 “\\Device\\hARDDISKvOLUME\\1.LOG”// 初始化 objectAttriInitializeObjectAttributes(&objectAttri,&logFileUnicodeStr,OBJ_CASE_INSENSITIVE,NULL,NULL);// 创建文件NTSTATUS ntStatus = ZwCreateFile(&hfile,GENERIC_READ,&objectAttri,&iostatus,NULL,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN, // 打开文件,如果不存在则返回错误FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if (NT_SUCCESS(ntStatus)){KdPrint(("Open file successuflly. \n"));}FILE_STANDARD_INFORMATION fsi;ntStatus = ZwQueryInformationFile(hfile, &iostatus,&fsi,sizeof(FILE_STANDARD_INFORMATION),FileStandardInformation);if (NT_SUCCESS(ntStatus)){KdPrint(("file length: %u\n", fsi.EndOfFile.QuadPart));}// 修改当前文件指针FILE_POSITION_INFORMATION  fpi;fpi.CurrentByteOffset.QuadPart = 100i64;ntStatus = ZwSetInformationFile(hfile, &iostatus,&fpi,sizeof(FILE_POSITION_INFORMATION),FilePositionInformation);if (NT_SUCCESS(ntStatus)){KdPrint(("update the file pointer successfully. \n"));}// 关闭文件句柄ZwClose(hfile);

这篇关于Window内核函数 - 获取或修改文件属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997073

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返