📄 ntfs文件系统启动扇区代码(简化版).shtm.htm
字号:
EQU
0xFFFFFFFF ; 表明属性结束<br><br>; 属性名称最大长度<br>NTFS_ATTRIBUTE_NAME_LENGTH
EQU 64
; UNICODE字符长度<br><br>; 属性标志<br>NTFS_ATTRIBUTE_FLAG_COMPRESSED
EQU 0x0001
; 压缩标志<br>NTFS_ATTRIBUTE_FLAG_ENCRYPTED
EQU 0x4000
; 加密标志<br>NTFS_ATTRIBUTE_FLAG_SPARSE
EQU 0x8000
; 稀疏文件<br>NTFS_ATTRIBUTE_RESIDENT_FLAG_INDEXED
EQU 0x0001
; 驻留属性被索引<br><br>;============================================================<br>; 文件属性<br>;=============================================================<br>NTFS_FILE_FLAG_READONLY
EQU
0x00000001 ; 只读标志<br>NTFS_FILE_FLAG_HIDDEN
EQU
0x00000002 ; 隐藏标志<br>NTFS_FILE_FLAG_SYSTEM
EQU
0x00000004 ; 系统标志<br>NTFS_FILE_FLAG_VOLUME
EQU
0x00000008 ; 卷标标准(NTFS不使用)<br>NTFS_FILE_FLAG_DIRECTORY
EQU 0x00000010
; 目录属性(NTFS不使用)<br>NTFS_FILE_FLAG_ARCHIVE
EQU
0x00000020 ; 归档标志<br>NTFS_FILE_FLAG_DEVICE
EQU
0x00000040 ; 设备<br>NTFS_FILE_FLAG_NORMAL
EQU
0x00000080 ; 普通属性<br>NTFS_FILE_FLAG_TEMPORARY
EQU 0x00000100
; 临时文件<br>NTFS_FILE_FLAG_SPARSE_FILE
EQU 0x00000200
; 稀疏文件<br>NTFS_FILE_FLAG_REPARSE_POINT
EQU 0x00000400
; 重解析点<br>NTFS_FILE_FLAG_COMPRESSED
EQU 0x00000800
; 压缩标志<br>NTFS_FILE_FLAG_OFFLINE
EQU
0x00001000 ; 离线<br>NTFS_FILE_FLAG_NOT_CONTENT_INDEXED
EQU
0x00002000 ; 内容没有索引<br>NTFS_FILE_FLAG_ENCRYPTED
EQU 0x00004000
; 加密文件<br>NTFS_FILE_FLAG_INDEX_ROOT_PRESENT
EQU
0x10000000 ;
拷贝自MFT记录,是否目录(存在IndexRoot)<br>NTFS_FILE_FLAG_VIEW_INDEX_PRESENT
EQU
0x20000000 ;
拷贝自MFT记录,是否存在视图索引(ObjId索引、配额索引等)<br><br>;==============================================================================<br>; 文件名相关常量<br>;==============================================================================<br>; 最大允许的文件名长度<br>NTFS_FILE_NAME_MAXLENGTH EQU 255<br><br>; 可能的名字空间<br><br>; 最大的命名空间,大小写敏感,除了'\0'和'/'之外的所有Unicode字符都可以作为文件名;<br>NTFS_FILE_NAME_POSIX EQU 0 <br><br>; 大小写不敏感,'\0', '"', '*', '/', ':', '<',>', '?', '\' ,'|'都不能用于文件名;<br>; 并且名字不能以句点(.)和空格结尾;<br>NTFS_FILE_NAME_WIN32 EQU 1 <br>
<br>; 传统的8.3名字,大写字母<br>NTFS_FILE_NAME_DOS
EQU 2<br><br>; 兼顾Win32和DOS名字<br>NTFS_FILE_NAME_WIN32_AND_DOS EQU 3<br><br>;==============================================================================<br>; 卷标志<br>;==============================================================================<br>NTFS_VOLUME_FLAG_DIRTY
EQU
0x0001 ; 脏标志<br>NTFS_VOLUME_FLAG_RESIZE_LOG_FILE
EQU
0x0002 ; 重设日志文件<br>NTFS_VOLUME_FLAG_UPGRADE_ON_MOUNT
EQU
0x0004 ; 装配时升级<br>NTFS_VOLUME_FLAG_MOUNTED_ON_NT4
EQU
0x0008 ; 装配标志<br>NTFS_VOLUME_FLAG_DELETE_USN_UNDERWAY EQU 0x0010 ; 删除USN<br>NTFS_VOLUME_FLAG_REPAIR_OBJECT_ID
EQU
0x0020 ; 修复对象ID<br>NTFS_VOLUME_FLAG_MODIFIED_BY_CHKDSK
EQU
0x8000 ; CHKDSK修改标志<br><br>;==============================================================================<br>; 索引标志<br>;==============================================================================<br><br>; 用于IndexRoot的属性标志<br>NTFS_INDEX_FLAG_LARGE_INDEX
EQU
1 ; 索引存在IndexAllocation属性<br><br>; 用于IndexAllocation的属性标志<br>; 用于IndexEntry的属性标志<br>NTFS_INDEX_FLAG_INDEX_NODE
EQU
1 ; 索引节点(存在子节点)<br><br>; 用于IndexEntry的属性标志<br>NTFS_INDEX_FLAG_INDEX_END
EQU
2 ; 指明是最后一个项(结束标志)<br><br>;==============================================================================<br>; <br>; MFT文件记录引用<br>;<br>; 当需要指向MFT中的一个记录时,就需要使用MFT文件记录引用,这是一个64位的数值, <br>; 由48位的MFT索引号和16位的序列号(用于一致性检查)组成。为了便于报告错误,我<br>; 们将48位的索引号看成是有符号数;而16位的序列号是一个循环计时器(跳过0),指<br>; 明被引用的MFT记录被使用的次数;如果该序列号数值位0,则指明不进行序列号一致性<br>; 检查。<br>; <br>;==============================================================================<br>; NTFS_MFT_REF_MASK 0x0000FFFFFFFFFFFFULL<br>; NTFS_MAKE_MFT_REF( I,S ) ( (((ULONGLONG)(S)) << 48 ) | (((ULONGLONG)(I)) & NTFS_MFT_REF_MASK) ) <br>; NTFS_MFT_REF_INDEX( R ) ((ULONGLONG)((R) & NTFS_MFT_REF_MASK ))<br>; NTFS_MFT_REF_SEQUENCE(R) ((USHORT)(((R) >> 48) & 0xFFFF))<br>; NTFS_IS_MFT_REF_ERR( R ) (((R) & 0x000080000000ULL ) ? 1:0)<br><br><br><br>;====================================================================<br>; 结构定义<br>;====================================================================<br><br>;====================================================================<br>; 带Fixup(TornBits)的记录头,包括FileRecord,IndexAllocation,重启日志等<br>;====================================================================<br>STRUC NTFS_RECORD_HEADER<br>
.RecordType
RESD 01H
; 记录类型<br> .UsaOffset
RESW
01H ; 更新序列号数组的偏移(相对于记录开始)<br>
.UsaCount
RESW 01H ;
更新序列号数组的大小<br> .RecordLsn
RESQ
01H ; 该记录的日志序列号,每次修改时更新<br> ; <br> ; 更新序列号数组( USA: Update Sequence Array )是一个USHORT值数组,该<br> ; 值属于每个由该数组保护的更新序列记录所保护的扇区的末尾信息。<br> ; 注意:该数组的第一个元素是USN( Update Sequence Number ),一个表示<br> ; 记录被写入磁盘的次数的循环计数器。注意值0和-1( 0xFFFF )没有<br> ; 被使用。余下的每个扇区对应的值必须与USN相等(在读取时检查),<br> ; 在写入时设置。<br> ; <br>ENDSTRUC<br><br>;====================================================================<br>; MFT文件记录<br>;====================================================================<br>STRUC NTFS_FILE_RECORD<br><br> ; 公共记录头<br>
.RecordType
RESD 01H
; 记录类型<br>
.UsaOffset
RESW 01H
; 更新序列号数组的偏移(相对于记录开始)<br>
.UsaCount
RESW 01H
; 更新序列号数组的大小<br>
.RecordLsn
RESQ 01H
; 该记录的日志序列号,每次修改时更新<br> <br> ; 文件记录特有属性<br>
.SequenceNumber
RESW 01H ;
该记录被使用的序列号(循环计数器,跳过0)<br> .LinkCount
RESW 01H ;
硬连接数,及目录中引用该记录的次数,只在MFT基文件记录中使用;<br>
.AttributesOffset
RESW 01H
;第一个属性的偏移,相对于记录开始,必须8字节对齐<br>
.RecordFlags
RESW 01H ;
记录属性 NTFS_FILE_RECORD_FLAG_xxx<br>
.BytesInUse
RESD 01H
; 记录头和属性的总长度(文件记录的实际长度),8字节对齐<br>
.BytesAllocated
RESD 01H ;
总共分配给文件记录的长度(应该与BytesPerFileRecord一致)<br>
.BaseFileRecord
RESQ 01H ;
基本文件记录中的文件索引号(对于基本文件记录,其值为0)<br>
.NextAttributeNumber RESW
01H ;
下一个属性ID,注意第一个属性ID为0;每次增1并在重用是复位为0;<br> <br> ; 以下两项出现在NTFS 3.1+ ( Windows XP及以上版本 _<br>
.Reserved
RESW 01H
; 保留字节用于对齐<br>
.FileRecordNumber
RESD 01H ;
本记录的索引号<br> <br> ;<br> ; 当使用MFT记录时,将USA(更新序列号数组)放在这个位置,即在第一个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -