基于元神操作系统实现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…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...