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

相关文章

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: