1. 背景

http://stackoverflow.com/q/20418694/941650

这里面临的一个核心问题是,如果MFT Reference相等,能够表明这些记录代表的是同一个文件吗?

对于这个问题,我们可以采取实验的方式来验证。

2. 实验环境

在实验设备Windows 7操作系统下,D盘是NTFS格式,而且打开了UsnJrnl功能。

使用fsutil usn工具来获取到关于UsnJrnl的信息:

  1. 1: C:\Windows\system32>fsutil usn

  1. 2: ---- USN Commands Supported ----

  1. 3: 

  1. 4: createjournal Create a USN journal

  1. 5: deletejournal Delete a USN journal

  1. 6: enumdata Enumerate USN data

  1. 7: queryjournal Query the USN data for a volume

  1. 8: readdata Read the USN data for a file

  1. 1: C:\Windows\system32>fsutil usn queryjournal D:

  1. 2: Usn Journal ID : 0x01cd6ad7d5cd624e

  1. 3: First Usn : 0x0000000028100000

  1. 4: Next Usn : 0x000000002a38bc50

  1. 5: Lowest Valid Usn : 0x0000000000000000

  1. 6: Max Usn : 0x7fffffffffff0000

  1. 7: Maximum Size : 0x0000000002000000

  1. 8: Allocation Delta : 0x0000000000400000

  1. 1: fsutil usn readdata 1 0 0x7fffffffffff0000 D:

3. 实验

1. 创建一个文档daniel.txt

  1. 1: File Ref# : 0x00050000000c6c3f

  1. 2: ParentFile Ref# : 0x0005000000000005

  1. 3: Usn : 0x000000002a38a7c8

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (020) : daniel.txt

可以看到它的File Ref为

File Ref#       : 0x00050000000c6c3f

里面分解为更新号0x0005以及Mft Reference号0x0000000c6c3f

将daniel.txt文件删除后,

  1. 1: File Ref# : 0x00050000000c6c3f

  1. 2: ParentFile Ref# : 0x003c00000000002a

  1. 3: Usn : 0x000000002a38afa0

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (024) : $R2QW90X.txt

仍然可以找到这个文件的记录,因为只是放到了回收站而已。

再在相同的位置创建一个同名的文件

  1. 1: File Ref# : 0x00040000000c6c43

  1. 2: ParentFile Ref# : 0x0005000000000005

  1. 3: Usn : 0x000000002a38b050

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (020) : daniel.txt

可以看到这时文件名和位置虽然一致,但是File Reference号已经不同了。

我们到回收站里将daniel.txt复原,

选择覆盖,

  1. 1: File Ref# : 0x00050000000c6c3f

  1. 2: ParentFile Ref# : 0x0005000000000005

  1. 3: Usn : 0x000000002a38b3c0

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (020) : daniel.txt

这时的记录就和刚刚创建的时候一致了。

我们这次将daniel.txt完成删除(不放到回收站里),再创建一个同名的文件

  1. 1: File Ref# : 0x00040000000c6c48

  1. 2: ParentFile Ref# : 0x0005000000000005

  1. 3: Usn : 0x000000002a38cf48

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (020) : daniel.txt

这回记录不一样了,但是我们发现了下面的一条记录

  1. 1: File Ref# : 0x00060000000c6c3f

  1. 2: ParentFile Ref# : 0x0005000000000005

  1. 3: Usn : 0x000000002a38bbf0

  1. 4: SecurityId : 0x00000000

  1. 5: Reason : 0x00000000

  1. 6: Name (034) : journal_dump4.txt

可见,MFT表里的位置是很珍贵的,不能随便浪费,因此会不断地复用。

所以添加了一个更新号来区分究竟是不是同一个文件,只有当File Reference整体都相同时,才有可能是同一个文件。

NTFS文件系统的UsnJrnl对于FileReference的处理的更多相关文章

  1. NTFS文件系统详细分析

    NTFS文件系统详细分析 第一部分 什么是NTFS文件系统 想要了解NTFS,我们首先应该认识一下FAT.FAT(File   Allocation   Table)是“文件分配表”的意思.对我们来说 ...

  2. linux如何编译安装新内核支持NTFS文件系统?(以redhat7.2x64为例)

    内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核 ...

  3. 详解NTFS文件系统

    一.分析NTFS文件系统的结构 当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统.NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个 ...

  4. linux权限及ntfs文件系统权限的知识

    关于ntfs权限的问题 文件的权限: [-dcbps][u:rwx][g:rwx][a:rwx] 当中: r=4, w=2, x=1,  u=owner, g=group, a=all user   ...

  5. NTFS 文件系统解析

    1. windows 下磁盘文件读写 下面是读取D:\磁盘上的第0扇区 512 Bytes CreateFile()打开磁盘,获取文件句柄: SetFilePointer()设置读写的位置: Read ...

  6. Linux系统挂载NTFS文件系统

     今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其他同学们会有类似经历,于是尽量细致的记录于此.     无论是一块安装了Windows/Linu ...

  7. 1-18 编译安装内核支持ntfs文件系统

    大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =============================== ...

  8. redhat6.5安装ntfs-3g rpm来支持ntfs文件系统挂载

    linux安装ntfs-3g模块来支持ntfs文件系统挂载 所需包 fuse-2.9.3.tar.gz ntfs-3g_ntfsprogs-2011.4.12.tgz step1. 解压fuse-2. ...

  9. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

随机推荐

  1. go 学习之fmt包

    基本模式fmt 方法可以大致分为 print, scan两类, 根据基础方法可以构建特定方法. Print 将参数写入字符串或io.writer scan 从字符串或 io.Reader 读取指定数据 ...

  2. 【java】jstack分析查看线程状态

    演示代码 public class StackTest { public static void main(String[] args) { Thread thread = new Thread(ne ...

  3. Django 使用简单笔记

    1. Django项目的启动: 1. 命令行启动 在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指 ...

  4. 环境管理 pipenv 的 使用

    安装 pip3 install pipenv 配置 配置 环境变量 WORKON_HOME , 表示 生成的虚拟环境 文件 的 存放位置 创建虚拟环境 方式一 pipenv --python 3.7 ...

  5. ERROR- 开发常见error

    一,数据插入MySql中出现中文乱码 解决办法有: 1.新建数据库选择 create database 'GG' CHARACTER SET 'utf8 ' COLLATE 'utf8_general ...

  6. POJ 3237 树链剖分

    题目链接:http://poj.org/problem?id=3237 题意:给定一棵n个结点n-1条边的树. 每条边都是一个边权. 现在有4种操作 1:CHANGE I V:把(输入的)第i条边的边 ...

  7. webRTC脱坑笔记(二)— webRTC API之MediaStream(getUserMedia)

    webRTC API WebRTC API包括媒体捕获.音频视频的编码和解码.传输层和会话管理. getUserMedia():捕获音频和视频. MediaRecorder:录制音频和视频. RTCP ...

  8. Linux重定向命令(stdout, stdin, stderr)

    ls -l /usr/bin > ls-output.txt 将输出结果重定向到 ls-output.txt 文件.注意:再次使用> ls-output.txt会默认覆盖源文件.如果要追加 ...

  9. yield关键字详解与三种用法

    本篇文章比较硬核, 适合有一定Python基础的读者阅读, 如果您对Python还不甚了解可以先关注我哦, 我会持续更新Python技术文章 yield详解 yield与return相同每次调用都会返 ...

  10. hdu 1695: GCD 【莫比乌斯反演】

    题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...