NTFS文件系统解析(三)

1、引言

对于NTFS文件系统而言,无论文件内容本身,抑或真实的文件属性,都被称之为属性。
而正如前文说到的,NTFS预定义了16种属性用于文件系统的管理。
而通常情况下,往往只需要关注其中的某些属性即可。

2、属性头

为了便于管理,NTFS文件系统为所有的属性定义了统一的头部结构,可以称之为属性头。
而由于每种属性的长度不一,因此又额外定义了常驻属性和非常驻属性。

// 长度:0x10
typedef struct {b32 attr_type;  // 当前属性类型b32 length;     // 属性长度b8 non_resident;  // 常驻属性标识:0 - 常驻属性, 1 - 非常驻属性b8 name_length;   // 属性名长度:0 - 无名属性ub16 name_offset; // 属性名偏移:0x18ub16 flags;    //  ub16 attr_id;  // 
} AttributeHeader;// 长度:0x8 + 0x10
typedef struct {AttributeHeader header;  // 属性头b32 length;              // 属性体长度ub16 offset;             // 属性偏移b8 index_flag;           // Indexed flagb8 padding;              // Padding
} ResidentAttrHeader;// 长度:0x30 + 0x10
typedef struct {AttributeHeader header;  // 属性头b64 vcn_begin;           // 起始VCN号b64 vcn_end;             // 结束VCN号ub16 data_run_offset;    // Data Runs偏移ub16 compression_size;   // Compression unit sizeb32 padding;             // Paddingb64 byte_alloc;          // 分配大小b64 byte_use;            // 实际使用大小b64 init_size;           // Initialized data size of the stream
} NonResidentAttrHeader;

3、$STANDARD_INFORMATION

$STANDARD_INFORMATION
常驻属性。通常情况下我们可以通过本属性获取文件时间和文件访问属性。

// 文件属性
typedef enum {READONLY = 0x0001,HIDDEN = 0x0002,SYSTEM = 0x0004,ARCHIVE = 0x0020,DEVICE = 0x0040,NORMAL = 0x0080,TEMPORARY = 0x0100,SPARSEFILE = 0x0200,REPARES_Point = 0x0400,COMPRESSED = 0x0800,OFFLINE = 0x1000,NOT_CONTENT_INDEXED = 0x2000,ENCRYPTED = 0x4000,DIRECTORY = 0x10000000,   //(copy from corresponding bit in MFT record)INDEX_VIEW = 0x20000000,  //(copy from corresponding bit in MFT record)
} FileAttrFlags;// STANDARD_INFORMATION = 0x10,
typedef struct {b64 time_create;      // 文件创建时间b64 time_update;      // 文件修改时间b64 time_mft_change;  // 文件记录修改时间b64 time_access;      // 文件访问时间b32 file_attribute;   // 文件属性b32 max_version;      // 文件最大版本b32 version;          // 当前文件版本b32 class_id;         // Class Idb32 owner_id;         // Owner Idb32 security_id;      // Security Idb64 quota_charged;    // Quota chargedb64 usn;              // USN Journel
} StdInformation;

4、$ATTRIBUTE_LIST

常驻/非常驻属性。

当一个文件或者文件夹存在多个文件记录时,主文件记录中会生成一个或多个ATTRIBUTE_LIST属性。在这种情况下,需要通过遍历ATTRIBUTE_LIST属性读取base_record_ref对应的文件记录。

// ATTRIBUTE_LIST = 0x20,
typedef struct {b32 attr_type;  // Attribute Typeub16 record_length;b8 name_length;b8 name_offset;b64 start_vcn;b64 base_record_ref;  // 文件记录号ub16 attr_id;
} AttrList;

5、$FILE_NAME

$FILE_NAME

常驻属性。通常情况下,一个文件只存在一个FILE_NAME属性,这种情况下,文件的基本属性与STANDARD_INFORMATION是保持一致的。

但是当文件系统结构变化时,如上图所示。或者当文件产生硬链接时,FILE_NAME属性都会增加。这种情况下,就需要对本属性做特殊处理。

// 文件名命名空间
typedef enum {POSIX_STYLE = 0,WIN32_STYLE,DOS_STYLE,WIN_DOS_STYLE,
} FileNameSpace;// FILE_NAME = 0x30,
typedef struct {b64 parent_ref;       // 低6位存储当前文件记录号b64 time_create;      // 文件创建时间b64 time_update;      // 文件修改时间b64 time_mft_change;  // 文件记录修改时间b64 time_access;      // 文件访问时间b64 byte_alloc;       // 分配大小b64 byte_use;         // 实际使用大小b32 flags;            // 文件属性b32 ea_flags;         // 文件EA属性ub8 filename_length;  // 文件名长度(单位):字符 b8 name_space;        // 命名空间
} FileName;

6、$VOLUME_INFORMATION

常驻属性。通常情况下,卷信息属性只存储在Volume中。不需要特殊处理

// VOLUME_INFORMATION = 0x70,
typedef struct {b8 resv1[8];   // 00b8 major_ver;  // major version 1--winNT, 3--Win2000/XPb8 minor_ver;  // minor version 0--win2000, 1--WinXP/7ub16 flag;     // markb8 resv2[4];   // 00
} VolumeInformation;

7、$DATA

常驻/非常驻属性。DATA属性用于存储文件本身的数据。当文件内容较少时,数据直接存储在DATA中。
当数据长度超过一定时,DATA中存储Data Runs,数据本身则异地存储。
注意:文件内容数据只存储在有名DATA属性中,因此通过DATA读取文件内容时需要对name_length进行判断。

8、$INDEX_ROOT

$INDEX_ROOT
常驻属性。索引根节点通常由标准属性头,索引根属性头,索引属性头和索引属性组成。
索引根属性头决定当前块存储的索引类型。通常情况下,索引中存储的都是0x30文件名属性。
正如上图所示,绿色部分代表IndexEntry的头部,紧接着的红色部分和黄色部分就是去除了标准属性头之后的0x30属性,而最后的紫色部分则存储着子节点的VCN号。

typedef enum {ENTRY_SUBNODE = 1,  // 存在子节点ENTRY_LAST = 2,     // 叶子节点
} IdxEntryTypes;// INDEX_ROOT = 0x90,
typedef struct {// Index Root Headerb32 attr_type;          // 属性类型b32 collation_rule;b32 index_size;         // 索引块大小b8 clusters_per_index;  // Clusters per index block (same as Bpb?)b8 padding[3];          // Padding// Index Headerb32 entry_offset;  // 第一个索引的偏移b32 total_size;    // 索引数据的总大小b32 alloc_size;    // Allocated size of the index entriesb8 flags;          // 索引标志b8 padding2[3];    // Padding
} IndexRoot;typedef struct {b64 mft_ref;ub16 size;         // 索引大小ub16 stream_size;  // 数据流长度b8 flags;          // 索引标志b8 padding[3];     // Padding// copy of body(without header) of attribute/* Name | Index Of              | Used By* --------------------------------------* $I30 | Filenames	            | 目录* $SDH | Security Descriptors  | $Secure* $SII | Security Ids	        | $Secure* $O   | Object Ids	          | $ObjId* $O   | Owner Ids	            | $Quota* $Q   | Quotas	              | $Quota* $R   | Reparse Points	      | $Reparse*/b8 stream[1];  // align to 8// VCN of the sub-node in the Index Allocation
} IndexEntry;

9、$INDEX_ALLOCATION

$INDEX_ALLOCATION

非常驻属性。INDEX_ALLOCATION的结构与INDEX_ROOT基本一致。唯一的差别在于一个是常驻属性,另一个是非常驻属性。

typedef struct {// Index Record Headerb32 magic;        // "INDX"ub16 usn_offset;  // offset of update sequence numberub16 usn_size;    // size of update sequence number and array, by wordsb64 lsn;          // $LogFile sequence numberb64 vcn;          // vcn of this index block in the index allocation// Index Headerb32 entry_offset;  // Offset to the first index entryb32 total_size;    // Total size of the index entriesb32 alloc_size;    // Allocated size of the index entriesb8 flags;          // Non-leaf node Flagb8 padding[3];     // Padding
} IndexBlock;typedef struct {b64 mft_ref;ub16 size;         // 索引大小ub16 stream_size;  // 数据流长度b8 flags;          // 索引标志b8 padding[3];     // Padding// copy of body(without header) of attribute/* Name | Index Of              | Used By* --------------------------------------* $I30 | Filenames	            | 目录* $SDH | Security Descriptors  | $Secure* $SII | Security Ids	        | $Secure* $O   | Object Ids	          | $ObjId* $O   | Owner Ids	            | $Quota* $Q   | Quotas	              | $Quota* $R   | Reparse Points	      | $Reparse*/b8 stream[1];  // align to 8// VCN of the sub-node in the Index Allocation
} IndexEntry;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/181591.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI】Stable-Diffusion-WebUI使用指南

注:csdn对图片有审核,审核还很奇葩,线稿都能违规,为保证完整的阅读体验建议移步至个人博客阅读 最近AI绘画实现了真人照片级绘画水准,导致AI绘画大火,公司也让我研究研究,借此机会正好了解一下…

一个JS版寻路的实现

js版的寻路的测试 20231104_161146 path get_v8: function (x_inc, y_inc) {if (x_inc 0) {if (y_inc < 0) {return [[0, -1], [-1, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [1, 1], [0, 1]];} else if (y_inc > 0) {return [[0, 1], [-1, 1], [1, 1], [-1, 0], [1, 0…

090基于web+springboot的中小企业设备管理系统

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本中小企业设备管理系统管理员有个人中心&#xff0c;用户管理&#xff0c;员工管理&#xff0c;设备信息管理&#xff0c;配件信息管…

c++类和对象(八) static成员 友元

1.1 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b;用static修饰的成员函数&#xff0c;称之为静态成员函数。静态成员变量一定要在类外进行初始化。 面试题&#xff1a;实现一个类&#xff0c;计算…

【深度学习】pytorch——快速入门

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch快速入门 简介张量&#xff08;Tensor&#xff09;操作创建张量向量拷贝张量维度张量加法函数名后面带下划线 _ 的函数索引和切片Tensor和Numpy的数组之间的转换张量&#xff08;tensor&#xff09;与标量…

2.10 CSS BFC

1.简介 BFC是Block Formatting Context(块级格式上下文)&#xff0c;可以理解成元素的一个“特异功能”。该“特异功能”&#xff0c;在默认的情况下处于关闭状态;当元素满足了某些条件后&#xff0c;该"特异功能被激活。所谓激活"特异功能”&#xff0c;专业点说就…

【KVM】软件虚拟化和硬件虚拟化类型

前言 大家好&#xff0c;我是秋意零。 今天介绍的内容是虚拟化技术以及软件虚拟化和硬件虚拟化。 &#x1f47f; 简介 &#x1f3e0; 个人主页&#xff1a; 秋意零&#x1f525; 账号&#xff1a;全平台同名&#xff0c; 秋意零 账号创作者、 云社区 创建者&#x1f9d1; 个…

Leetcode—187.重复的DNA序列【中等】

2023每日刷题&#xff08;二十&#xff09; Leetcode—187.重复的DNA序列 实现代码 class Solution { public:const int L 10;vector<string> findRepeatedDnaSequences(string s) {unordered_map<string, int> str;vector<string> ans;int len s.size()…

【市场分析】Temu数据采集销售额商品量占比分析数据分析接口Api

引言 temu电商平台是一个充满活力的电商平台&#xff0c;拥有多种商品类别和数万家店铺。在这个项目中我的任务是采集平台上的大量公开数据信息。通过数据采集&#xff0c;我旨在深入了解temu电商平台的产品分布、销售趋势和文本描述&#xff0c;以揭示有趣的见解。 数据采集…

PyQuery库写一个有趣的爬虫程序

PyQuery库是一个基于jQuery语法的Python库&#xff0c;它可以方便地对HTML/XML文档进行解析和操作。使用PyQuery库可以快速地获取网页中的数据&#xff0c;进行数据清洗和分析。PyQuery库的基本用法包括字符串初始化、打开网页、css属性、标签内容等获取、DOM基本操作等相关技巧…

Scala 泛型编程

1. 泛型 Scala 支持类型参数化&#xff0c;使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数&#xff0c;Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) {override def toString: String first ":" sec…

设置DevC++支持c++11标准

1.点击编译选项 2. 设置语言标准 3.点击确认 4.测试代码 使用auto成功 测试&#xff01;

【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 &#x1f3c6;前言 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点&#xff1a; 比较节省资源&#xff08;这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等&#…

【SpringCloud Alibaba -- Nacos】Linux 搭建 Nacos 集群

搭建 Nacos 集群 架构 centos安装docker https://docs.docker.com/engine/install/centos/ 详细配置过程 MySql8 mysql数据库配置 数据库脚本 nacos/conf/nacos-mysql.sql Nacos2 application.properties 修改为mysql spring.datasource.platformmysqldb.num1 db.url…

0007Java安卓程序设计-ssm基于Android的校园新闻管理系统

文章目录 **摘** **要**目 录开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把校园新闻管理与现在网络相结合&#xff0c;利用java技术建设校园新闻管理系统app&#xff0c;实…

数据结构与算法(Java版) | 排序算法的介绍与分类

各位朋友&#xff0c;现在我们即将要进入数据结构与算法&#xff08;Java版&#xff09;这一系列教程中的排序算法这一章节内容的学习中了&#xff0c;所以还请大家系好安全带&#xff0c;跟随我准备出发吧&#xff01; 相信诸位应该都知道排序算法有很多种吧&#xff01;就算没…

包装印刷行业万界星空科技云MES解决方案

印刷业的机械化程度在国内制造行业内算是比较高的&#xff0c;不算是劳动密集型企业。如书本的装订、包装的模切、烫金、糊盒等都已经有了全自动设备。印刷厂除了部分手工必须采用人工外&#xff0c;大部分都可以采用机器&#xff0c;也就意味着可以由少量工人生产出大量产品。…

核电堆芯组件动态特性试验研究

u 核电试验概述 反应堆是核电事业的核心组成部分之一&#xff0c;堆内构件、堆芯燃料组件等部件在冷却剂流动冲击下&#xff0c;会诱发剧烈振动&#xff0c;导致堆芯内试验件流道不稳定。为了保障反应堆的安全运行&#xff0c;根据国家核安全法规规定&#xff0c;有必要对受冷…

linux 查看当前目录下每个文件夹大小

要在 Linux 中查看当前目录下每个文件夹的大小&#xff0c;可以使用 du 命令&#xff08;磁盘使用情况&#xff09;结合其他一些选项。下面是几个常用的命令示例&#xff1a; 显示当前目录下每个文件夹的大小——只显示一层文件夹&#xff1a; du -h --max-depth1该命令会以人…