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

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更