基于元神操作系统实现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…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...