基于元神操作系统实现NTFS文件操作(五)
1. 背景
本文主要介绍$Root元文件的解析。先介绍元文件的构成及各个部分的结构,然后结合上一篇博文中读取到的元文件内容,对测试磁盘中目标分区的根目录进行展示。
2. $Root元文件解析
(1)$Root元文件的结构
$Root元文件由两部分构成,即文件头和属性列表,最后以4个FF结尾。$Root元文件占用2个扇区,即1KB(1024字节),但并非所有这1024字节都存放着有效内容,4个FF之后的部分就是无效的数据,可以直接忽略。上文所读取的$Root元文件结构如下图所示:

需要注意的是,每个扇区的最后两个字节都具有特殊用途,存放的都是更新序列号,与文件头部分的更新序列号相同。
对于前16个$MFT元文件,它们都拥有和$Root一样的构成。其中,文件头的长度和结构是不变的,但是属性列表是可变的,例如,0号元文件包含10H、30H、80H、B0H属性,1号元文件包含10H、30H、80H属性,2号元文件包含10H、30H、80H属性,3号元文件包含10H、30H、50H、60H、70H、80H属性,4号元文件包含10H、30H、50H、80H属性,5号元文件包含10H、30H、40H、50H、90H、A0H、B0H属性,6号元文件包含10H、30H、80H属性,7号元文件包含10H、30H、50H、80H属性,8号元文件包含10H、30H、80H属性。
(2)$Root元文件的文件头
文件头的前4个字节(即偏移0x00-0x03处的字节)为固定值,是“FILE”这4个字符的ASCII码;偏移0x04-0x05表示更新序列号的偏移;偏移0x06-0x07表示更新序列号的数目;偏移0x08-0x0F表示日志文件序列号;偏移0x10-0x11表示序列号,用于记录本文件被重复使用的次数;偏移0x12-0x13表示硬链接数;偏移0x14-0x15表示第一个属性的偏移地址;偏移0x16-0x17为标志字节,值为0时表示本文件为已删除的文件,值为1时表示本文件为正常文件,值为2时表示本文件为已删除的目录,值为3时表示本文件为正常目录;偏移0x18-0x1B表示文件的实际大小,以字节为单位;偏移0x1C-0x1F表示文件的分配大小(即在磁盘中占用的空间大小),以字节为单位;偏移0x20-0x27表示文件参考号;偏移0x28-0x29表示下一个自由ID号;偏移0x2A-0x2B表示边界值;偏移0x2C-0x2F表示本MFT的记录号;偏移0x30-0x31表示更新序列号;偏移0x32开始为更新序列数组。
其中,用于判断元文件有效性的包括:偏移0x00-0x03处固定为46 49 4C 45(即“FILE”的ASCII码),若读出的数据与此不同,说明读取的不是有效的$Root元文件;偏移0x30-0x31处为更新序列号,该元文件两个扇区的最后两个字节的值也为更新序列号,若这3处的值不相同,说明读取到的不是有效的$Root元文件。
与文件操作有关的内容包括:偏移0x14-0x15处为第一个属性的偏移地址,根据该值可以定位和解析当前元文件的第一个属性;偏移0x16-0x17处的标志字节可用于辅助操作,例如,查找文件、读文件时只需操作正常文件(即只需操作标志字节为1的文件),递归操作子目录时只需考虑正常目录(即只需考虑标志字节为3的文件),新建文件时只需考虑标记为已删除的文件(即只需考虑标志字节为0或2的文件),依此类推;偏移0x18-0x1B处为文件的实际大小,该值在读取文件内容时会用到。
结合下图中读取到的$Root元文件的文件头内容,偏移0x00-0x03处为固定值“FILE”;偏移0x04-0x05处为30 00(即0x0030),表示更新序列号在偏移0x0030处,定位到0x0030处可发现其值为66 04,同样的每个扇区的最后两个字节也为66 04,说明读取的元文件是有效的;偏移0x06-0x07处的值为03 00(即0x0003),表示有3个更新序列号,分别位于文件头和每个扇区的结尾;偏移0x14-0x15处为38 00(即0x0038),表示偏移0x38处开始第一个属性,即开始10H属性;偏移0x16-0x17处为03 00(即0x0003),表示当前文件为正常目录(即分区的根目录);偏移0x18-0x1B处为98 02 00 00(即0x00000298),表示当前文件的实际大小为0x298字节,即664字节;偏移0x1C-0x1F处为00 04 00 00(即0x00000400),表示当前文件分配的大小为0x400字节,即1024字节(1KB),对比实际大小可见,分配的大小大于或等于实际大小,而多出来的空间是浪费掉的磁盘空间,此处需要注意的是:对于正常的文件,分配的大小是以簇为单位的,假设每簇扇区数为8,则分配的大小是以8*512=4KB为单位的,即最小分配4KB,即便实际大小只有1个字节,也要分配4KB的磁盘空间;而$Root元文件中的此处分配值为1KB,是因为存放的是元文件(即$Root文件),该元文件固定占2个扇区,不是以簇为单位的。

(3)$Root元文件的属性
$Root元文件的属性列表中包含7个属性,分别为10H、30H、40H、50H、90H、A0H、B0H属性。10H属性包含文件的创建、修改、最近访问时间及兼容DOS的文件属性;30H属性存放文件名或目录名;40H属性为对象标识符;50H属性存放安全相关信息;90H属性存放B+树的根节点,可用于实现索引,如目录等;A0H属性用于存放B+树的所有子节点;B0H属性存放位映射,每一位表示一个簇的使用状态,值为1时表示对应的簇已经使用,值为0时表示对应的簇空闲(即尚未使用)。其中,30H属性、90H属性、A0H属性在文件遍历、文件搜索等相关操作中比较常用,B0H则在文件删除等磁盘空间相关的操作中会用到。
每个属性都由一个属性头和属性体构成。每个属性从开始位置起的若干字节为属性头,属性头分为常驻属性头和非常驻属性头。属性头的偏移0x00-0x03表示属性类型,即10、30、40、50、90、A0、B0等值;偏移0x04-0x07表示属性的长度;偏移0x08处为常驻标志,值为00时表示当前属性为常驻属性,值为01时表示当前属性为非常驻属性;偏移0x09处为属性名的长度;偏移0x0A-0x0B表示属性名开始的偏移;偏移0x0C-0x0D处为文件压缩标志;偏移0x0E-0x0F表示属性ID。
根据偏移0x08处的值,属性分为常驻属性和非常驻属性。对于常驻属性的属性头,偏移0x10-0x13表示属性数据的长度;偏移0x14-0x15表示属性体开始的位置;偏移0x16处为索引标志;偏移0x18开始为属性体。
对于非常驻属性的属性头,偏移0x10-0x17表示起始虚拟簇号;偏移0x18-0x1F表示结束虚拟簇号;偏移0x20-0x21表示Data RUN的偏移地址;偏移0x22-0x23处为压缩单位;偏移0x28-0x2F表示属性分配的大小;偏移0x30-0x37表示属性的实际大小;偏移0x38-0x3F表示属性的初始大小;偏移0x40开始为Data RUN信息。
每种属性的属性体都具有不同的结构,$Root元文件属性的解析涉及到的内容较多,限于篇幅,将在下一篇博文中进行介绍。
3. 总结
本文介绍了$Root元文件的结构及文件头的结构,并结合读取到的数据进行了解析,最后介绍了属性及属性头的结构,下文将结合读取的内容对$Root元文件的属性进行解析。
安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。
相关文章:
基于元神操作系统实现NTFS文件操作(五)
1. 背景 本文主要介绍$Root元文件的解析。先介绍元文件的构成及各个部分的结构,然后结合上一篇博文中读取到的元文件内容,对测试磁盘中目标分区的根目录进行展示。 2. $Root元文件解析 (1)$Root元文件的结构 $Root元文件由两部…...
AutoCAD学习
AutoCAD学习 最基本操作 命令用途说明空格键确认键也可以是重复刚才的命令回车键也是确认键鼠标右键也可以选择确认LINE、L直线命令绘制直线DLI线性尺寸标注DIMLINEAR鼠标滚轮滚动放大缩小视图界面鼠标中键按住移动视图DAL对齐线性标注DIMALIGNED F8 正交模式ORTHOMODE Tab 切换…...
go的一些知识点
一.package 1.新建项目 新建一个itying文件夹,在里面使用命令 就能生成一个go项目。生成一个go.mod 2.调用别的包的代码 按照下面的目录层级生成代码 //clac.go package calcfunc Add(x, y int) int {return x y } func Sub(x, y int) int {return x - y }…...
前端 vue3 对接科大讯飞的语音在线合成API
主要的功能就是将文本转为语音,可以播放。 看了看官方提供的demo,嗯....没看懂。最后还是去网上找的。 网上提供的案例,很多都是有局限性的,我找的那个他只能读取第一段数据,剩下的不读取。 科大讯飞的接口…...
缺省参数
一、概念 在声明或定义函数时为函数的参数指定一个默认值,调用时,如果对应参数没有传参,则使用其默认值,否则使用指定的实参 void TestFunc(int a 0) {cout<<a<<endl; }int main() {TestFunc(); // 没有传参&am…...
Stable Diffusion绘画 | 来训练属于自己的模型:炼丹启动
经过前面几轮辛苦的准备工作之后,现在开始进入终篇的炼丹环节。 在「上传素材」页面,点击「开始训练」: 可以在「查看进度-进度」中,查看模型训练的整体进度: 求助!!!操作「开始训练…...
08_OpenCV文字图片绘制
import cv2 import numpy as npimg cv2.imread(image0.jpg,1) font cv2.FONT_HERSHEY_SIMPLEXcv2.rectangle(img,(500,400),(200,100),(0,255,0),20) # 1 dst 2 文字内容 3 坐标 4 5 字体大小 6 color 7 粗细 8 line type cv2.putText(img,flower,(200,50),font,1,(0,0,250)…...
【笔记】选择题笔记+数据结构笔记
文章目录 2014 41方法一先序遍历方法二 连通分量是极大连通子图 一个连通图的生成树是一个极小连通子图 无向图的邻接表中,第i个顶点的度为第i个链表中的结点数 邻接表和邻接矩阵对不同的操作各有优势。 最短路径算法: 单源最短路径 已知图G(V,E),我们…...
浅谈汽车智能座舱如何实现多通道音频
一、引言 随着汽车智能座舱的功能迭代发展,传统的 4 通道、6 通道、8 通道等音响系统难以在满足驾驶场景的需求,未来对于智能座舱音频质量和通道数会越来越高。接下来本文将浅析目前智能座舱如何实现音频功放,以及如何实现多路音频功放方案。…...
系统架构设计师教程 第13章 13.1层次式体系结构概述 笔记
13.1 层次式体系结构概述 分层式体系结构是一种最常见的架构设计方法,能有效地使设计简化,使设计的系统机构清晰,便于提高复用能力和产品维护能力。 层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并…...
cnn突破一(先搞定三层反馈神经网络bpnet,c#实现)
惦记cnn很久了,一直搞机器视觉,走不出来,现在megauging已经实现,说明书也写了不少,该突破的突破了,该改进的也改进了,一个心病治好了,有空把人工智能在机器视觉上的延伸,…...
如何创建一个docker,给它命名,且下次重新打开它
1.创建一个新的docker并同时命名 docker run -it --name one ubuntu:18.04 /bin/bash 这时候我们已经创建了一个docker,并且命名为"one" 2.关闭当前docker exit 3.这时docker已经终止了,我们需要使用它要重新启动 docker start one 4.现在可以重新打…...
【D3.js in Action 3 精译_025】3.4 让 D3 数据适应屏幕(中)—— 线性比例尺的用法
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…...
Python的多线程与多进程:并发编程基础与实战
随着计算机硬件的不断发展,现代计算机通常配备多核处理器,使得在程序中同时处理多个任务成为可能。并发编程是提升程序性能、充分利用多核处理器能力的重要技术之一。在Python中,并发编程的实现主要包括多线程、多进程以及异步编程(如asyncio)。然而,由于Python的全局解释…...
HarmonyOS Next应用开发——响应式布局之媒体查询
响应式布局之媒体查询 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式,常用于多屏幕的应用适配。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(…...
240 搜索二维矩阵 II
解题思路: \qquad 解这道题最重要的是如何利用从左到右、从上到下为升序的性质,快速找到目标元素。 \qquad 如果从左上角开始查找,如果当前matrix[i][[j] < target,可以向右、向下扩展元素都是升序,但选择哪个方向…...
jenkins微服务
如果vim进去某个文件里,可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹,然后向其中导入两个包 2.安装jenkins 再在控制…...
【Kotlin基于selenium实现自动化测试】初识selenium以及搭建项目基本骨架(1)
导读大纲 1.1 Java: Selenium 首选语言1.2 配置一个强大的开发环境 1.1 Java: Selenium 首选语言 Java 是开发人员和测试人员进行自动化 Web 测试的首选 Java 和 Selenium 之间的协同作用受到各种因素的驱动,从而提高它们的有效性 为什么Java经常被认为是Selenium的首选语言 广…...
汽车追尾为什么是后车的责任?
简单点说:因为人后面没有长眼睛。 结论 在汽车追尾事故中,通常情况下后车被认为是责任方的原因在于交通法规对驾驶安全标准的约定和实践中的责任识别原则。虽然追尾事故常见地被归责于后车,但具体判断并不是绝对的,仍需综合多种…...
[运维]4.bookinfo无法部署的问题
为了拉取镜像,搭建了阿里云镜像仓库,教程见:K8S中基于NFS-Subdir-External-Provisioner存储组件实现的StorageClass-CSDN博客 但是bookinfo的ratings和productpage无法运行,部署后显示crashLoopBackOff [rootmaster ~]# kubectl…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...
