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高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片