基于元神操作系统实现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…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
