NTFS文件系统的UsnJrnl对于FileReference的处理
1. 背景
http://stackoverflow.com/q/20418694/941650
这里面临的一个核心问题是,如果MFT Reference相等,能够表明这些记录代表的是同一个文件吗?
对于这个问题,我们可以采取实验的方式来验证。
2. 实验环境
在实验设备Windows 7操作系统下,D盘是NTFS格式,而且打开了UsnJrnl功能。
使用fsutil usn工具来获取到关于UsnJrnl的信息:
1: C:\Windows\system32>fsutil usn
2: ---- USN Commands Supported ----
3:
4: createjournal Create a USN journal
5: deletejournal Delete a USN journal
6: enumdata Enumerate USN data
7: queryjournal Query the USN data for a volume
8: readdata Read the USN data for a file
1: C:\Windows\system32>fsutil usn queryjournal D:
2: Usn Journal ID : 0x01cd6ad7d5cd624e
3: First Usn : 0x0000000028100000
4: Next Usn : 0x000000002a38bc50
5: Lowest Valid Usn : 0x0000000000000000
6: Max Usn : 0x7fffffffffff0000
7: Maximum Size : 0x0000000002000000
8: Allocation Delta : 0x0000000000400000
1: fsutil usn readdata 1 0 0x7fffffffffff0000 D:
3. 实验
1. 创建一个文档daniel.txt
1: File Ref# : 0x00050000000c6c3f
2: ParentFile Ref# : 0x0005000000000005
3: Usn : 0x000000002a38a7c8
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (020) : daniel.txt
可以看到它的File Ref为
File Ref# : 0x00050000000c6c3f
里面分解为更新号0x0005以及Mft Reference号0x0000000c6c3f
将daniel.txt文件删除后,
1: File Ref# : 0x00050000000c6c3f
2: ParentFile Ref# : 0x003c00000000002a
3: Usn : 0x000000002a38afa0
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (024) : $R2QW90X.txt
仍然可以找到这个文件的记录,因为只是放到了回收站而已。
再在相同的位置创建一个同名的文件
1: File Ref# : 0x00040000000c6c43
2: ParentFile Ref# : 0x0005000000000005
3: Usn : 0x000000002a38b050
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (020) : daniel.txt
可以看到这时文件名和位置虽然一致,但是File Reference号已经不同了。
我们到回收站里将daniel.txt复原,

选择覆盖,
1: File Ref# : 0x00050000000c6c3f
2: ParentFile Ref# : 0x0005000000000005
3: Usn : 0x000000002a38b3c0
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (020) : daniel.txt
这时的记录就和刚刚创建的时候一致了。
我们这次将daniel.txt完成删除(不放到回收站里),再创建一个同名的文件
1: File Ref# : 0x00040000000c6c48
2: ParentFile Ref# : 0x0005000000000005
3: Usn : 0x000000002a38cf48
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (020) : daniel.txt
这回记录不一样了,但是我们发现了下面的一条记录
1: File Ref# : 0x00060000000c6c3f
2: ParentFile Ref# : 0x0005000000000005
3: Usn : 0x000000002a38bbf0
4: SecurityId : 0x00000000
5: Reason : 0x00000000
6: Name (034) : journal_dump4.txt
可见,MFT表里的位置是很珍贵的,不能随便浪费,因此会不断地复用。
所以添加了一个更新号来区分究竟是不是同一个文件,只有当File Reference整体都相同时,才有可能是同一个文件。
NTFS文件系统的UsnJrnl对于FileReference的处理的更多相关文章
- NTFS文件系统详细分析
NTFS文件系统详细分析 第一部分 什么是NTFS文件系统 想要了解NTFS,我们首先应该认识一下FAT.FAT(File Allocation Table)是“文件分配表”的意思.对我们来说 ...
- linux如何编译安装新内核支持NTFS文件系统?(以redhat7.2x64为例)
内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核 ...
- 详解NTFS文件系统
一.分析NTFS文件系统的结构 当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统.NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个 ...
- linux权限及ntfs文件系统权限的知识
关于ntfs权限的问题 文件的权限: [-dcbps][u:rwx][g:rwx][a:rwx] 当中: r=4, w=2, x=1, u=owner, g=group, a=all user ...
- NTFS 文件系统解析
1. windows 下磁盘文件读写 下面是读取D:\磁盘上的第0扇区 512 Bytes CreateFile()打开磁盘,获取文件句柄: SetFilePointer()设置读写的位置: Read ...
- Linux系统挂载NTFS文件系统
今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其他同学们会有类似经历,于是尽量细致的记录于此. 无论是一块安装了Windows/Linu ...
- 1-18 编译安装内核支持ntfs文件系统
大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =============================== ...
- 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. ...
- 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...
随机推荐
- node egg | 部署报错:server got error:bind EADDRNOTAVAIL
egg框架实现的服务,部署在阿里云服务器上报出以下错误: 解决方案: config.js中 exports.cluster = { "listen": { "path&q ...
- Vue PC端图片预览插件
*手上的项目刚刚搞完了,记录一下项目中遇到的问题,留做笔记: 需求: 在项目中,需要展示用户上传的一些图片,我从后台接口拿到图片url后放在页面上展示,因为被图片我设置了宽度限制(150px),所以图 ...
- C#编程--第一天
C#编程 一. 了解C#: 1. C#的定义及其特点 2.vs的集成开发环境:熟悉了解vs2012 二.C#语言基础 1.C#项目的组成结构: .config----配置文件(存放配置参数文件) .c ...
- webstorm2018
1.安装后修改hosts: windows\system32\drivers\etc 管理员权限修改 0.0.0.0 account.jetbrains.com 2. 选择activation c ...
- 源码分析--LinkedList(JDK1.8)
LinkedList与ArrayList一样都是List接口的实现类,底层用双向链表实现. LinkedList本身用一个内部类实现链表元素. private static class Node< ...
- CS184.1X 计算机图形学导论 HomeWork1
最容易填写的函数就是left.输入为旋转的角度,当前的eye与up这两个三维向量 void Transform::left(float degrees, vec3& eye, vec3& ...
- django项目中账号注册登陆使用JWT的记录
需求分析 1. 注册用JWT做状态保持 1.1 安装jwt pip install djangorestframework-jwt 1.2 去settings里面配置jwt ...
- 非阻塞套接字与IO多路复用(转,python实现版)
非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回.epoll工作在非阻塞模式时,才会发挥作用. 我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个 ...
- 数据库与缓存:3.mongodb的基本知识
1. mongodb是什么? NoSQL 非关系型数据库,主要用于数据的海量存储.分为server数据存储端和client数据操作端. 1.1 关系型与非关系型数据库的区别? 1.sql:数据库--表 ...
- python方法参数:*和**操作符
* def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", ar ...