扩展int 13H/调用规范 /大硬盘读写中断/FAT NTFS文件结构

第一部分 简 介

一. 硬盘结构简介

1. 硬盘参数释疑

到目前为止,人们常说的硬盘参数还是古老的 CHS (Cylinder/Head/Sector)参数。那么为什么要使用这些参数,它们的意义是什么?它们的取值范围是什么?
很久以前(long long ago ...),硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘。也就是硬盘盘片的每一条磁道都具有相同的扇区数。由此产生了所谓的3D参数 (Disk Geometry)。即磁头数(Heads),柱面数(Cylinders),扇区数(Sectors),以及相应的寻址方式。
其中:

磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片,最大为 255 (用 8 个二进制位存储);
柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道,最大为 1023(用 10 个二进制位存储);
扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为 63 (用 6个二进制位存储)。
每个扇区一般是 512个字节,理论上讲这不是必须的,但好象没有取别的值的。

所以磁盘最大容量为:
255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes ) 或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )

在 CHS 寻址方式中,磁头,柱面,扇区的取值范围分别为 0到 Heads - 1, 0到 Cylinders - 1,1到 Sectors (注意是从1开始)。

2. 基本 Int 13H 调用简介

BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用,它可以完成磁盘(包括硬盘和软盘)的复位,读写,校验,定位,诊断,格式化等功能。它使用的就是 CHS 寻址方式,因此最大识能访问 8 GB 左右的硬盘( 本文中如不作特殊说明,均以 1M = 1048576 字节为单位)。

3. 现代硬盘结构简介

在老式硬盘中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费很多磁盘空间 (与软盘一样)。为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址。
为了与使用3D寻址的老软件兼容 (如使用BIOS Int13H接口的软件),在硬盘控制器内部安装了一个地址翻译器,由它负责将老式3D参数翻译成新的线性参数。这也是为什么现在硬盘的3D参数可以有多种选择的原因 (不同的工作模式,对应不同的3D参数,如 LBA,LARGE,NORMAL)。

4. 扩展 Int 13H 简介

虽然现代硬盘都已经采用了线性寻址,但是由于基本 Int 13H 的制约,使用 BIOS Int 13H 接口的程序,如 DOS 等还只能访问 8 G 以内的硬盘空间。为了打破这一限制,Microsoft 等几家公司制定了扩展 Int 13H 标准(Extended Int13H),采用线性寻址方式存取硬盘,所以突破了 8 G 的限制,而且还加入了对可拆卸介质 (如活动硬盘) 的支持。


二. Boot Sector 结构简介

1. Boot Sector 的组成

Boot Sector 也就是硬盘的第一个扇区,它由 MBR (Master Boot Record),DPT (Disk Partition Table) 和 Boot Record ID 三部分组成。
MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ),存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序)。
DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD),记录了磁盘的基本分区信息。主分区表分为四个分区项,每项 16 字节,分别记录了每个主分区的信息(因此最多可以有四个主分区)。
Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF),对于合法引导区,它等于 0xAA55,这是判别引导区是否合法的标志。
Boot Sector 的具体结构如下图所示:


Offset 0000H

 

 


Offset 01BDH

Offset 01BEH

Offset 01CDH
Offset 01CEH

Offset 01DDH
Offset 01DEH

Offset 01EDH
Offset 01EEH

Offset 01FDH
Offset 01FEH

Offset 01FFH


Master Boot Record


主引导记录(446字节)

 


分区信息1

 

分区信息2

 

分区信息3

 

分区信息4

 

校验字0xAA55

 

 

2. 分区表结构简介

分区表由四个分区项构成,每一项的结构如下:

BYTE State : 分区状态,0 = 未激活,0x80 = 激活 (注意此项)
BYTE StartHead : 分区起始磁头号
WORD StartSC : 分区起始扇区和柱面号,底字节的低6位为扇区号,高2位为柱面号的第 9,10位,高字节为柱面号的低 8位
BYTE Type : 分区类型,如 0x0B = FAT32,0x83 = Linux 等,00表示此项未用(注1)
BYTE EndHead : 分区结束磁头号
WORD EndSC : 分区结束扇区和柱面号,定义同前
DWORD Relative : 在线性寻址方式下的分区相对扇区地址 (对于基本分区即为绝对地址)
DWORD Sectors : 分区大小 (总扇区数)
注意:在 DOS / Windows 系统下,基本分区必须以柱面为单位划分( Sectors * Heads 个扇区),如对于 CHS 为 764/255/63 的硬盘,分区的最小尺寸为 255 * 63 * 512 / 1048576 = 7.844 MB。

3. 扩展分区简介

由于主分区表中只能分四个分区,无法满足需求,因此设计了一种扩展分区格式。基本上说,扩展分区的信息是以链表形式存放的,但也有一些特别的地方。
首先,主分区表中要有一个基本扩展分区项,所有扩展分区都隶属于它,也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中。对于DOS / Windows 来说,扩展分区的类型为 0x05。
除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,后一个扩展分区的数据项记录在前一个扩展分区的分区表中,但两个扩展分区的空间并不重叠。
扩展分区类似于一个完整的硬盘,必须进一步分区才能使用。但每个扩展分区中只能存在一个其他分区。此分区在 DOS/Windows 环境中即为逻辑盘。因此每一个扩展分区的分区表 (同样存储在扩展分区的第一个扇区中)中最多只能有两个分区数据项(包括下一个扩展分区的数据项)。
扩展分区和逻辑盘关系请参考 注1。

 


第二部分 技术资料

第一章 扩展 Int13H 技术资料

一. 简介

设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能,使其支持多于1024柱面的硬盘,以及可移动介质的锁定,解锁及弹出等功能。

二. 数据结构

1. 数据类型约定
BYTE 1 字节整型 ( 8 位 )
WORD 2 字节整型 ( 16 位 )
DWORD 4 字节整型 ( 32 位 )
QWORD 8 字节整型 ( 64 位 )

2. 磁盘地址数据包 Disk Address Packet (DAP)
DAP 是基于绝对扇区地址的,因此利用 DAP,Int13H 可以轻松地逾越 1024 柱面的限制,因为它根本就不需要 CHS 的概念。

DAP 的结构如下:
struct DiskAddressPacket
{
BYTE PacketSize; // 数据包尺寸(16字节)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset)
QWORD BlockNum; // 磁盘起始绝对块地址
};

PacketSize 保存了 DAP 结构的尺寸,以便将来对其进行扩充。在目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16。如果它小于16,扩展 Int13H 将返回错误码( AH=01,CF=1 )。
BlockCount 对于输入来说是需要传输的数据块总数,对于输出来说是实际传输的数据块个数。BlockCount = 0 表示不传输任何数据块。
BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量)。数据缓冲区必须位于常规内存以内(1M)。
BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位),与分区无关。第一个块地址为 0。一般来说,BlockNum 与 CHS 地址的关系是:

BlockNum = ( cylinder * NumberOfHeads + head ) * SectorsPerTrack + sector - 1;

其中 cylinder,head,sector 是 CHS 地址,NumberOfHeads 是磁盘的磁头数,SectorsPerTrack 是磁盘每磁道的扇区数。
也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的。这一顺序是由磁盘控制器虚拟的,磁盘表面数据块的实际排列顺序可能与此不同(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序)。

3. 驱动器参数数据包 Drive Parameters Packet
驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中使用的数据包。格式如下:

struct DriveParametersPacket
{
WORD InfoSize; // 数据包尺寸 (26 字节)
WORD Flags; // 信息标志
DWORD Cylinders; // 磁盘柱面数
DWORD Heads; // 磁盘磁头数
DWORD SectorsPerTrack; // 每磁道扇区数
QWORD Sectors; // 磁盘总扇区数
WORD SectorSize; // 扇区尺寸 (以字节为单位)
};

信息标志用于返回磁盘的附加信息,每一位的定义如下:

0 位:
0 = 可能发生 DMA 边界错误
1 = DMA 边界错误将被透明处理
如果这位置 1,表示 BIOS 将自动处理 DMA 边界错误,也就是说错误代码 09H 永远也不会出现.

1 位:
0 = 未提供 CHS 信息
1 = CHS 信息合法
如果块设备的传统 CHS 几何信息不适当的话,该位将置 0.

2 位:
0 = 驱动器不可移动
1 = 驱动器可移动

3 位: 表示该驱动器是否支持写入时校验.

4 位:
0 = 驱动器不具备介质更换检测线
1 = 驱动器具备介质更换检测线

5 位:
0 = 驱动器不可锁定
1 = 驱动器可以锁定
要存取驱动器号大于 0x80 的可移动驱动器,该位必须置 1(某些驱动器号为 0 到 0x7F 的设备也需要置位)

6 位:
0 = CHS 值是当前存储介质的值 (仅对于可移动介质),如果驱动器中有存储介质,CHS 值将被返回.
1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).

7 - 15 位: 保留,必须置 0.

三. 接口规范

1. 寄存器约定
在扩展 Int13H 调用中一般使用如下寄存器约定:

ds:si ==> 磁盘地址数据包( disk address packet )
dl ==> 驱动器号
ah ==> 功能代码 / 返回码

在基本 Int13H 调用中,0 - 0x7F 之间的驱动器号代表可移动驱动器0x80 - 0xFF 之间的驱动器号代表固定驱动器。但在扩展 Int13H 调用中0x80 - 0xFF 之间还包括一些新出现的可移动驱动器,比如活动硬盘等。这些驱动器支持先进的锁定,解锁等功能。
ah 返回的错误码除了标准 Int13H 调用规定的基本错误码以外,又增加了以下错误码:

B0h 驱动器中的介质未被锁定
B1h 驱动器中的介质已经锁定
B2h 介质是可移动的
B3h 介质正在被使用
B4h 锁定记数溢出
B5h 合法的弹出请求失败

2. API 子集介绍
1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集。

 

第一个子集提供了访问大硬盘所必须的功能,包括 检查扩展 In13H是否存在( 41h ),扩展读( 42h ),扩展写( 43h ),校验扇区( 44h ),扩展定位( 47h ) 和 取得驱动器参数( 48h )。
第二个子集提供了对软件控制驱动器锁定和弹出的支持,包括 检查扩展Int13H 是否存在( 41h ),锁定/解锁驱动器( 45h ),弹出驱动器( 46h ),取得驱动器参数( 48h ),取得扩展驱动器改变状态( 49h ),int 15h。
如果使用了调用规范中不支持的功能,BIOS 将返回错误码 ah = 01h,CF = 1。


3. API 详解

 

1) 检验扩展功能是否存在
入口:
AH = 41h
BX = 55AAh
DL = 驱动器号
返回:
CF = 0
AH = 扩展功能的主版本号
AL = 内部使用
BX = AA55h
CX = API 子集支持位图
CF = 1
AH = 错误码 01h,无效命令

这个调用检验对特定的驱动器是否存在扩展功能。如果进位标志置 1则此驱动器不支持扩展功能。如果进位标志为 0,同时 BX = AA55h,则存在扩展功能。此时 CX 的 0 位表示是否支持第一个子集,1位表示是否支持第二个子集.
对于 1.x 版的扩展 Int13H 来说,主版本号 AH = 1。AL 是副版本号,但这仅限于 BIOS 内部使用,任何软件不得检查 AL 的值。

2) 扩展读
入口:
AH = 42h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)

注意:实际使用应当是ds:si ==> 磁盘地址数据包( disk address packet ),以下各子功能同此。

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用将磁盘上的数据读入内存。如果出现错误,DAP 的 BlockCount项中则记录了出错前实际读取的数据块个数。

3) 扩展写
入口:
AH = 43h
AL
0 位 = 0 关闭写校验
1 打开写校验
1 - 7 位保留,置 0
DL = 驱动器号
DS:DI = 磁盘地址数据包(DAP)
返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用将内存中的数据写入磁盘。如果打开了写校验选项,但 BIOS不支持,则会返回错误码 AH = 01h,CF = 1。功能 48h 可以检测BIOS是否支持写校验。
如果出现错误,DAP 的 BlockCount 项中则记录了出错前实际写入的数据块个数。

4) 校验扇区
入口:
AH = 44h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码
这个调用校验磁盘数据,但并不将数据读入内存.如果出现错误,DAP 的BlockCount 项中则记录了出错前实际校验的数据块个数。

5) 锁定/解锁驱动器
入口:
AH = 45h
AL
= 0 锁定驱动器
= 1 驱动器解锁
= 02 返回锁定/解锁状态
= 03h-FFh - 保留
DL = 驱动器号

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用用来缩定指定驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能。如果在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,将会成功返回。
驱动器必须支持最大255次锁定,在所有锁定被解锁之前,不能在物理上将驱动器解锁。解锁一个未锁定的驱动器,将返回错误码 AH= B0h。如果锁定一个已锁定了255次的驱动器,将返回错误码 AH = B4h。
锁定一个没有介质的驱动器是合法的。

6) 弹出可移动驱动器中的介质
入口:
AH = 46h
AL = 0 保留
DL = 驱动器号

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用用来弹出指定的可移动驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能。如果在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,将会返回错误码 AH = B2h (介质不可移动)。如果试图弹出一个被锁定的介质将返回错误码 AH = B1h (介质被锁定)。
如果试图弹出一个没有介质的驱动器,则返回错误码 Ah = 31h (驱动器中没有介质)。
如果试图弹出一个未锁定的可移动驱动器中的介质,Int13h会调用 Int15h(AH = 52h) 来检查弹出请求能否执行。如果弹出请求被拒绝则返回错误码(同Int15h)。如果弹出请求被接受,但出现了其他错误,则返回错误码 AH = B5h。

7) 扩展定位
入口:
AH = 47h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用将磁头定位到指定扇区。

8) 取得驱动器参数
入口:
AH = 48h
DL = 驱动器号
DS:DI = 返回数据缓冲区地址

返回:
CF = 0,AH = 0 成功
CF = 1,AH = 错误码

这个调用返回指定驱动器的参数。

9) 取得扩展驱动器介质更换检测线状态
入口:
AH = 49h
DL = 驱动器号

返回:
CF = 0,AH = 0 介质未更换
CF = 1,AH = 06h 介质可能已更换

这个调用返回指定驱动器的介质更换状态.
这个调用与 Int13h AH = 16h 子功能调用相同,只是允许任何驱动器标号。如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远返回 CF = 0,AH = 0。
简单地将可移动介质锁定再解锁就可以激活检测线,而无须真正更换介质。

10) Int 15h 可移动介质弹出支持
入口:
AH = 52h
DL = 驱动器号

返回:
CF = 0,AH = 0 弹出请求可能可以执行
CF = 1,AH = 错误码 B1h 或 B3h 弹出请求不能执行

这个调用是由 Int13h AH=46h 弹出介质功能调用内部使用的。

 

 

'==================

FAT文件系统的结构:

3.1 FAT12,FAT16:
DBR--FAT1--FAT2--DFT--DATA
DBR只占1个扇区,DFT为根目录表,根目录下的DIR项数固定,一般为512项,每项占32字节,即DIR占32个扇区
则一个文件的逻辑扇区号:

逻辑扇区号=1+2*FAT占用的扇区数+DIR占用的扇区数+(起始簇号-2)*每簇扇区数


3.2FAT32:
DBR和其后的保留扇区--FAT1--FAT2-DATA
在DBR使用3个扇区,实际只使用第1个扇区,2,3扇区也写入55AA标志,之后有保留扇区,一般为20h或21h,其中第6扇区是DBR的备份。同时DIR当作文件处理,不在固定位置,也没有固定大小
则文件的逻辑扇区号:

逻辑扇区号=保留扇区数+2*FAT占用扇区数+(起始簇号-2)*每簇扇区数
此时因为DIR不固定,要在BPB中读出DIR的入口簇。

对于一个确定的分区,可通过逻辑地址来访问该分区中的扇区。逻辑地址从0开始。

在98和dos下可用debug的L命令来访问:
L [address] [drive] [firstsector] [number]
读逻辑盘的扇区,扇区号为逻辑地址,0为DBR即BOOT区
drive按A,B,C,D排序,对应0,1,2,3...
对应W命令:
W [address] [drive] [firstsector] [number]
W若不带参数,或只有地址参数,则按BX:CX寄存器指出的字节,从内
         存向磁盘写入数据。此时的文件名是此命令前最后一个使用过的文件名
         ,或者是N命令中指定的文件,如果没有使用过N命令,则使用Debug命
        令行中指定的文件。


DBR(dos boot record)操作系统可访问的第一个扇区。包括一个引导程序和BPB(bios parameter block)的本分区参数记录表。

FAT(file allocation table)fat中的记录和磁盘上的簇对应。FAT2为FAT1的备份。FAT的格式有多种,其中FAT16是指文件分配表使用16位表示一个簇,FAT12,FAT32同理。可知FAT16最多能管理65536个簇,而每簇最大32kb,所以FAT16每个分区最大2GB。
(注:FAT的0,1簇保留,0字节表示磁盘类型,簇号从2开始。)


DFT(文件目录表)根目录区,只存在FAT12和FAT16中,紧跟在FAT2后。根目录下的文件和子目录在DFT中都有一个‘目录登记项'每个项占32字节,项数在BPB中说明。FAT32中DFT无固定位置,把DFT当作一个普通文件处理,在BPB中指出DFT首簇地址。

长文件名规则:
目录项保存该文件的短文件名,长文件名用若干个长文件名目录向保存,长文件名目录项倒序排列在文件短目录项前面,采用双字节unicode内码保存,每项最多13个内码,首字节是顺序字节,指明是长文件名的第几项,11字节为0F,12字节指明类型,13字节为校验和,26,27字节为0。
--------------------------------------------------------------------------
3.3 FAT文件系统的的一些参数:

3.3.1 FAT16的BPB:
偏移
 长度
 说明
 
00
 3
 JMP指令;跳转到引导程序。后随一个空操作。(不属BPB)
 
03
 8
 OEM标志(FAT16为MSWIN4.0)
 
0B
 2
 每扇区字节数
 
0D
 1
 每簇扇区数
 
0E
 2
 dos保留扇区数
 
10
 1
 FAT数
 
11
 2
 根目录项数,如512
 
13
 2
 扇区数(小于32M的分区)
15
 1
 介质描述符
 
16
 2
 每FAT扇区数
18
 2
 每磁道扇区数(逻辑参数)
 
1A
 2
 磁头数(逻辑参数
1C
 4
 隐含扇区(即分区表中的8-11字节——本分区之前已用扇区数)***
 
20
 4
 扇区数(即分区表中的12-15字节)
 
24
 1
 BIOS设备号(hex:HD=8x)
 
25
 1
 未使用
 
26
 1
 扩展引导标记
 
27
 4
 卷序列号(随机)
 
2B
 11
 卷标,分区标识,如:WIN98
 
36
 8
 文件系统格式:FAT16
 
3.3.2 FAT32的BPB:
偏移 长度 说明
00
 3
 JMP指令
 
03
 8
 OEM标志(FAT32为MSWIN4.1)
 
0B
 2
 每字节扇区数
 
0D
 1
 每簇扇区数
 
0E
 2
 dos保留扇区数,FAT32中一般是32
 
10
 1
 FAT数
 
11
 2
 根目录项数,一般为0,未使用
 
13
 2
 扇区数(小于32M的分区,FAT32中不再使用)
 
15
 1
 介质描述符
 
16
 2
 每FAT扇区数(FAT32下不用)
 
18
 2
 每磁道扇区数(逻辑参数)
 
1A
 2
 磁头数(逻辑参数)
 
1C
 4
 隐含扇区(即分区表中的8-11字节——本分区之前已用扇区数)***
 
20
 4
 扇区数(即分区表中的12-15字节)
 
24
 4
 每FAT扇区数
 
28
 2
 标记
 
2A
 2
 版本
 
2C
 4
 根目录首簇地址
 
30
 2
 DBR占用的扇区数
 
32
 2
 备份DBR地址
 
34
 12
 保留
 
40
 1
 BIOS设备号(hex:HD=8x)
 
41
 1
 未使用
 
42
 1
 扩展引导标记
 
43
 4
 卷序列号(随机)
 
47
 11
 卷标,分区标识,如:WIN2000
 
52
 8
 文件系统格式:FAT32
3.3.3 磁介质描述符:
十六进制 说明
F8
 硬盘
F9
 双面5in软盘(15扇区高密度)双面3in软盘
FA
 双面3in RAM虚拟盘
FC
 单面5in软盘(9扇区高密度) 双面8in盘
FD
 双面5in盘(9扇区低密度)
FE
 单面8in盘(单、双密度)单面5in盘(8扇区低密度)
FF
 双面5in盘(8扇区低密)
3.3.4 FAT中每个簇号可取的表项值及含义:
表项值(12位)
 表项值(16位)
 表项值(32位)
 簇描述含义
 
000H
 0000H
 00000000H
 未使用的簇
 
002H-FEFH
 0002H-FFEFH
 00000002H-FFFFFFEFH
 已分配的簇(可见簇号从2开始)
 
FF0H-FF6H
 FFF0H-FFF6H
 FFFFFFF0H-FFFFFFF6H
 保留
 
FF7H
 FFF7H
 FFFFFFF7H
 坏簇
 
FF8H-FFFH
 FFF8H-FFFFH
 FFFFFFF8H-FFFFFFFFH
 文件结束簇
 
3.3.5 FAT16的FDT字段含义:
偏移
 长度
 说明
 
0-7
 8
 文件名
 
8-10
 3
 扩展名
 
11
 1
 属性字节(00000000读写,00000001只读,00000010隐藏,00000100系统,00001000卷标,00010000子目录,00100000档案)
 
12-21
 10
 保留未用
 
22-23
 2
 文件创建时间(hhhhh mmmmmm sssss)
 
24-25
 2
 文件创建时间(yyyyyyy mmmm ddddd)
 
26-27
 2
 表示文件的首簇号
 
28-31
 4
 文件长度
3.3.6 FAT32的FDT字段含义:
偏移
 长度
 说明
 
0-7
 8
 文件名
 
8-10
 3
 扩展名
 
11
 1
 属性字节(同FAT16,但为0FH时,表示该项为长文件名记录项)
 
12-13
 2
 种类、校验和
 
13-15
 3
 文件创建时间(hhhhh mmmmmm sssss,后8位为毫秒数)
 
16-17
 2
 文件创建时间(yyyyyyy mmmm ddddd)
 
18-19
 2
 最新访问日期,定义同16-17
 
20-21
 2
 起始簇的高16位
 
22-23
 2
 最新修改时间(hhhhh mmmmmm sssss)
 
24-25
 2
 最新修改日期,定义同16-17
 
26-27
 2
 起始簇的低16位
 
28-31
 4
 文件长度
 


通过以上信息,经过debug的L命令即可读出FAT系统中任意文件的内容。
--------------------------------------------------------------------------
4.NTFS文件系统的结构:

分区引导扇区——MFT(主文件表)——系统文件——文件区域

在NTFS中,磁盘上的任何事物都为文件。
文件通过MFT来确定其在磁盘上的存储位置。主文件表是一个与文件相对应的数据库,由一系列文件记录组成——卷中每个文件都有一个文件记录(对于大型文件可能有多个记录与之对应)。主文件表自身也有它自己的记录。MFT的文件记录大小一般是固定的,不管簇的大小是多少,均为1k。MFT仅供系统本身组织架构文件系统使用,被称为元数据,不能被应用程序访问。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些文件都以‘$'开始,是隐藏文件,不能用dir命令列出。不过有个工具nfi.exe可以转储重要的元数据文件。

NTFS使用逻辑簇号LCN和虚拟簇号VCN来对簇进行定位。LCN是对整个卷从头到尾的编号,相当于FAT系统的逻辑簇号。VCN是对特定文件的簇从头到尾进行编号。VCN可以映射成LCN。

 

NTFS把磁盘分成两大部分,大约12%分配给MFT,余下的用来存储文件。

NTFS通过MFT访问卷的过程如下:

首先必须装载该卷——查看引导文件($Boot元数据文件),找到MFT的物理地址;
然后从文件记录的数据属性中获得VCN到LCN的映射信息,并存储在内存中。这个映射信息定位了MFT的运行(run或extent,见常驻属性与非常驻属性)在磁盘上的位置;
接着再打开几个元数据文件的MFT记录,并打开这些文件。此后,用户就可以访问该卷了。
NTFS将文件作为‘属性/属性值'的集合来处理。文件数据就是未命名属性的值。一个文件通常占用一个文件记录。但当一个文件具有很多项属性值或很零碎的时候,就可能需要占用一个以上的文件记录。这种情况下,第一个文件记录是其基本的文件记录,存储有该文件需要的其他文件记录的位置。小文件和文件夹将全部存储在文件的MFT记录里。
NTFS的文件夹只是一个简单的文件名和文件引用号的索引,如果目录列表小于一个记录的长度,那么,该文件夹的所有信息都存储在主文件表的记录中。对于大于记录的文件夹则使用B+树进行管理,并用一个指针指向一个外部簇,该簇用来存储那些MFT内存储不了的文件夹的属性。

 

当一个文件很小时,其所有属性和属性值都可以存放在MFT的文件记录中。当属性值能直接存放在MFT中时,该属性就称为常驻属性(resident attribute)。有些属性总是常驻的,这样NTFS才可以确定其他非常驻属性。

大文件或大目录的所有属性,就不可能常驻在MFT中。如果一个属性太大而不能存放在只有1KB大小的MFT文件记录中,那么NTFS将从MFT之外为之分配区域。这些区域通常称为一个运行(run)或一个盘区(extent),它们可用来存储属性值,如文件数据。如果以后属性值又增加,那么,NTFS将回再分配一个运行,以便用来存储额外的数据。值存储在运行中而不是在MFT文件记录中的属性称为非常驻属性。
在标准属性中,只有可以增长的属性才是非常驻的。对文件来说,可增长属性有数据、属性列表等。

 

4.1 NTFS的BPB:
偏移
 长度
 说明
 
00
 3
 JMP指令
 
03
 8
 OEM标志
0B
 2
 每扇区字节数
0D
 1
 每簇扇区数
 
0E
 2
 保留扇区
 
10
 3
 总为0
13
 2
 NTFS未使用,总为0
 
15
 1
 介质描述
 
16
 2
 总为0
 
18
 2
 每磁道扇区数
 
1A
 2
 磁头数
 
1C
 4
 隐含扇区
 
20
 4
 NTFS未使用,总为0
24
 4
 NTFS未使用,总为0
28
 8
 扇区总数
 
30
 8
 $MFT的逻辑簇号
 
38
 3
 $MFTMirr的逻辑簇号
 
40
 4
 每MFT记录簇数
 
44
 4
 每索引簇数
 
48
 8
 卷标
 
50
 4
 校验和
 
4.2 NTFS元文件:
序号
 元文件
 功能
 
0
 $MFT
 主文件表本身
 
1
 $MFTMirr
 主文件表的部分镜像(内容就是前16个文件记录)
 
2
 $LogFile
 日志文件
 
3
 $Volume
 卷文件
 
4
 $AttrDef
 属性定义列表
 
5
 $Root
 根目录
 
6
 $Bitmap
 位图文件
 
7
 $Boot
 引导文件
 
8
 $BadClus
 坏簇文件
 
9
 $Secure
 安全文件
 
10
 $UpCase
 大写文件
 
11
 $Extend metadata directory
 扩展元数据目录
 
12
 $Extend/$Reparse
 重解析点文件
 
13
 $Extend/$UsnJrnl
 变更日志文件
 
14
 $Extend/Quota
 配额管理文件
 
15
 $Extend/$ObjId
 对象ID文件
 
16-23
 
 保留
 
23+
 
 用户文件和目录
 
4.3 MFT的结构:
偏移
 长度
 属性
 
00
 4
 标志,一定是‘FILE'
 
04
 2
 更新序列US的偏移
06
 2
 更新序列号USN的大小与数组,包括第一个字节
 
08
 8
 日志文件序列号
 
10
 2
 序列号(SN)
 
12
 2
 硬连接数
 
14
 2
 第一个属性的偏移地址
 
16
 2
 标志,1表示记录正在使用,2表示该记录为目录
 
18
 4
 记录头和属性的总长度,即文件记录的实际长度
1C
 4
 总共分配给记录的长度
20
 8
 基本文件记录中的文件索引号
28
 2
 下一属性ID
2A
 2
 Windows XP中使用,边界
 
2C
 4
 Windows XP中使用,文件记录号
 
4.4 标准索引头结构:
偏移
 长度
 属性
 
00
 4
 总是‘INDEX'
 
04
 2
 更新序号偏移
 
06
 2
 更新序列号USN的大小与排列,包括第一个字节
 
08
 8
 日志文件序列号LSN
 
10
 8
 该索引缓冲在索引分配中的索引VCN
 
18
 4
 索引入口偏移(相对18)
 
1C
 4
 索引入口的大小(相对18)
20
 4
 索引入口的分配大小(相对18)
 
24
 1
 非页级接点为1(有子索引)
 
25
 3
 总是0
28
 2
 更新序列号
2A
 2S-2
 更新序列排列
 
4.5 常用索引表:
名称
 索引
 说明
 
$I30
 文件名
 目录使用
 
$SDH
 安全描述
 $Secure
 
$SII
 安全IDS
 $Secure
 
$O
 对象Ids
 $ObjId
 
$O
 所有者
 $Quota
 
$Q
 配额
 $Quota
 
$R
 重解析点
 $Reparse
 
4.6 NTFS卷上常用的属性说明:
属性名
 属性描述
$VOLUME_INFORMATION
 卷信息,仅存在于$Volume元数据文件中
$VOLUME_NAME
 卷名称或标识,仅存在于$Volume元数据文件中
$STANDARD_INFORMATION
 标准信息,包括基本文件属性,如只读、存档;时间标记;有多少目录指向本文件(即硬连接数)
$FILE_NAME
 文件名,以Unicode表示
$SECURITY_DESCRIPTOR
 安全描述符。(2000/XP将所有的文件安全描述符放在$Secure元数据文件中,早期版本将它与文件目录放在一起)
$DATA
 文件数据
$INDEX_ROOT
 索引根
$INDEX_ALLOCATION
 索引分配
$BITMAP
 位图
$ATTRIBUTE_LIST
 属性列表
$OBJECT_ID
 对象ID:一个具有64个字节的标识符,其中最低16字节对卷来说是唯一的
$REPARSE_POINT
 重解析点
$EA
 扩充属性
$EA_INFORMATION
 扩充属性信息
$LOGGED_UTILITY_STREAM
 EFS加密属性

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiaguoxinzhi/archive/2008/09/19/2949304.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值