NTFS文件系统解析(二)

这篇具有很好参考价值的文章主要介绍了NTFS文件系统解析(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、引言

NTFS文件系统的的工作流程主要依赖于两个部分,文件记录部分用于记录文件本身的信息,而索引部分则通过树的形式存储着文件系统的结构信息。
而无论是文件记录还是索引,NTFS文件系统都为其设计了标准的数据结构,便于解析。

2、结构

从结构层面上说,无论文件记录还是索引,其本身的结构都相对简单,如下所示:
| 文件记录头 | 属性列表 | 属性列表 |… …| 结束标志 |
| 索引记录头 | 索引头 | 索引数据 | … … | 结束标志 |

// File Record Layout
// Record Header
// Attribute
// Attribute
// ...
// End Marker (0xFFFFFFFF)
typedef struct {
  b32 magic;          // MFT标志,始终为"FILE"
  ub16 usn_offset;    // 更新序列号USN(update sequence number)偏移
  ub16 usn_size;      // 更新序列号数组大小,单位:word
  b64 lsn;            // 日志文件序列号($LogFile Sequence Number,LSN)
  ub16 sn;            // 序列号(used times of this record)
  ub16 hard_links;    // 硬链接数
  ub16 attr_offset;   // 第一个属性列表的偏移
  ub16 flags;         // 标志(Flag),00H表示文件被删除,01H表示文件正在使用,02H表示目录被删除,03H表示目录正在使用
  b32 used;           // 文件记录实际使用的长度,可以理解为文件大小
  b32 alloced;        // 文件记录分配的长度,可以理解为磁盘占用大小
  b64 record_ref;     // 基本文件记录的文件索引号。当一个文件存在0x20属性列表时,用于区分是否主文件记录。
  ub16 next_attr;     // 下一属性ID
  ub16 border;        // 填充
  b32 record_number;  // 文件记录的参考号
} FileRecordHeader;

typedef struct {
  // Index Record Header
  b32 magic;        // 索引记录标志,始终为"INDX"
  ub16 usn_offset;  // 更新序列号USN(update sequence number)偏移
  ub16 usn_size;    // 更新序列号数组大小,单位:word
  b64 lsn;          // 日志文件序列号
  b64 vcn;          // 虚拟簇号
  // Index Header
  b32 entry_offset;  // 第一个索引的偏移
  b32 total_size;    // 所有索引的实际大小
  b32 alloc_size;    // 所有索引的分配大小
  b8 flags;          // 标志(Flag),1表示存在子节点,2表示叶子节点
  b8 padding[3];     // 填充
} IndexBlock;

3、更新序列号(USN)

NTFS文件系统为了保持数据的一致性,在文件和索引记录的每个扇区的最后2个字节都会写入更新序列号。正常情况下,不需要考虑这种特殊情况。
但是,当一个记录的恰巧写到扇区最后2个字节时,由于扇区尾部已经写入了2个字节的更新序列号。因此,NTFS文件系统会将本应写入扇区尾部的2个字节记录到文件记录的USN数组中。所以当需要解析文件记录时,我们需要将USN数组中的内容还原到对应的位置上去。文章来源地址https://www.toymoban.com/news/detail-743795.html

bool CFileRecord::PatchUS(b16 *sector_pointer, b32 sector_num, b16 usn,
                          b16 *us_data) const {
  // 遍历文件激烈的所有扇区
  for (b32 i = 0; i < sector_num; i++) {
    // 偏移到扇区的最后一个字
    sector_pointer += ((ntfs_volume_->sector_size_ >> 1) - 1);
    // 检测更新序列号是否一致
    if (*sector_pointer != usn) return false;  // USN check
    // 还原数据
    *sector_pointer = us_data[i];              // set data to update us
    sector_pointer++;
  }
  return true;
}

// 当读取到文件记录时
if (frh->magic == kFileRecordMagic) {
  // 计算出USN数组的位置
  b16 *usn_addr = (b16 *)((b8 *)frh + frh->usn_offset);
  // 第一个字存储USN
  b16 usn = *usn_addr;
  // 第二个字开始存储实际数据
  b16 *usarray = usn_addr + 1;
  if (PatchUS((b16 *)frh,
              ntfs_volume_->mft_size_ / ntfs_volume_->sector_size_, usn,
              usarray)) {
    file_record_ = frh;
    return true;
  }
}

到了这里,关于NTFS文件系统解析(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ext4、ntfs、xfs、btrfs、zfs、f2fs和reiserFS文件系统性能对比

    原文地址:CSDN 博客 目前的文件系统五花八门,从人人皆知的 ext4、ntfs 和 xfs,到 btrfs、zfs 等小众文件系统,可谓是琳琅满目,让人难以抉择适合自身业务的文件系统。 本文总结了国外网友在 OpenBenchmark 网站上的结果,并给出不同情境下各大文件系统的性能表现与对比。 目

    2024年01月25日
    浏览(43)
  • 网络安全学习-NTFS安全权限、文件共享

    NTFS安全权限 权限概述 设置NTFS权限,实现不同用户访问不同对象(文件、文件夹)的权限 分配正确访问权限后,用户才能访问资源 设置权限防止资源被篡改、删除 文件系统概述 文件系统就是这个分区的存储格式,不建立文件系统就无法存储任何文件 格式化就是重建文件系

    2024年01月20日
    浏览(43)
  • macOS Ventura 以上系统使用 OMI NTFS 挂载ntfs磁盘

    由于macOS Ventura 13.0 及以上的版本,默认支持NTFS 内核已被移除,大多ntfs软件不再支持 Ventura 及以上版本,目前 OMI NTFS 可以采用开启系统内核扩展的方法来实现NTFS磁盘的读写模式挂载。 首先需要下载 OMI NTFS  打开软件后,需要根据下方的教程,进行详细设置。 以下是针对I

    2024年01月16日
    浏览(46)
  • 解决linux系统挂载NTFS格式磁盘的问题

    一般情况下,Linux是识别不了NTFS格式移动硬盘的(需要重编译Linux核心才能,加挂NTFS分区),这时候为了能让Linux服务器能够识别NTFS的移动硬盘,就必须安装ntfs-3g(Third Generation Read/Write NTFS Driver)的包。 NTFS-3G介绍 NTFS-3G是一个开源项目,NTFS-3G是为Linux, Android, Mac OS X, FreeBSD

    2024年02月11日
    浏览(51)
  • Centos系统服务器挂载硬盘(ntfs格式和exfat格式)

    目录 前言 一、查看硬盘情况 1、fdisk -l 查看目前所有插在系统上的磁盘情况 2、df-h 查看目前已经挂载在系统上的磁盘情况 3、用mount挂载硬盘时,报错already mounted or busy 二、centos系统挂载硬盘 1、ntfs格式硬盘挂载 2、exfat格式硬盘挂载 1.首先安装库: 2、安装库参考网址: 3、

    2024年02月05日
    浏览(63)
  • Linux 文件系统全面解析:从基本原理到实际应用

    文件系统(File System)是一种用于管理、存储、组织和检索计算机系统中数据的方法。它定义了如何在磁盘或其他存储设备上组织数据,使得数据可以被有效地存储、访问和修改。文件系统通过将数据存储为文件并将文件组织到目录(也称为文件夹)中来实现这一点。此外,

    2023年04月23日
    浏览(43)
  • 解决Macbook pro无法写入U盘的问题,苹果MAC系统读写NTFS格式u盘硬盘方法。

    平时用U盘传数据时候,如果是windows,一般不会出现问题,但是如果要从MAC下使用U盘拷贝文件,那基本上就会遇到无法写入NTFS格式U盘的问题。 解决方法 格式化U盘,更换U盘格式,比如Fat32,或者exFat格式; 购买软件,让MAC支持NTFS格式; 通过mac终端添加配置,让MAC原生支持

    2024年02月01日
    浏览(77)
  • Hbase 系列教程:HBase 分布式文件存储系统解析

    作者:禅与计算机程序设计艺术 : Hbase 是 Apache 的开源 NoSQL 数据库项目之一。它是一个分布式、可扩展的、高性能、面向列的非关系型数据库。作为 Hadoop 大数据生态的一部分,Hbase 以高可用性、可伸缩性和水平可扩展性著称。它提供了一个列族模型(Column Family Model),能

    2024年02月05日
    浏览(52)
  • 嵌入式系统(embedded systems)-配置文件解析-开源库minIni

    minIni开源库的介绍 minIni是一个用于在嵌入式系统中读写“INI”文件的程序库。minIni占用很少的资源,具有确定的内存占用,并且可以为各种类型的文件I/O库配置。 gitee 链接:link https://gitee.com/resetlove/minIni github 链接:link https://github.com/compuphase/minIni.git minlni是一个可移植和可配置

    2024年02月03日
    浏览(49)
  • GlusterFS:开源分布式文件系统的深度解析与应用场景实践

    在当今大数据时代背景下,企业对存储系统的容量、性能和可靠性提出了前所未有的挑战。GlusterFS作为一款开源的、高度可扩展的分布式文件系统,以其独特的无中心元数据设计和灵活的卷管理机制,在众多场景中脱颖而出,为解决大规模数据存储难题提供了强有力的支持。

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包