2022年文件系统简要整理 .pdf

上传人:Q****o 文档编号:28414191 上传时间:2022-07-28 格式:PDF 页数:11 大小:876.88KB
返回 下载 相关 举报
2022年文件系统简要整理 .pdf_第1页
第1页 / 共11页
2022年文件系统简要整理 .pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年文件系统简要整理 .pdf》由会员分享,可在线阅读,更多相关《2022年文件系统简要整理 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、一物理磁盘结构:1.磁道:当磁盘的盘面旋转时。磁头保持在一个位置上。当盘面旋转一圈时。划过的一个圆就为磁道。一条磁道的储存量:一磁道= 63 个扇区。(通常情况)。2.扇区:磁道上被逻辑划分弧段相等的就为扇区,它的编号从1 开始,一扇区大小为512个字节。3.柱面:由一组重叠的盘面组成,每个盘面上都划分为相等的磁道,并从0 开始编号。具有相同编号组成的一个圆柱为柱面,柱面数=于一个盘面上的磁道数,对于每个盘面都有自己的磁头所以有CHS :(Clinder(柱面 ) Head (磁头)Sector(扇区) ),这就是一个寻址方式。物理磁盘结构图以下引用的函数均在WIN32 下二分区表1.主引导扇

2、区 (MBR)分区表的基本信息放在主引导扇区,主引导扇区的地址CHS=柱面0 , 磁头 0, 扇区 1.其大小为一扇区大小512 个字节。这里我把这512 个字节总结为下得一个结构体:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - #pragma pack(1) typedef struct InFoDisk UCHAR BootID; /80h 表示可启动分区,否则为0;对主分区有用;UCHAR SartHead ; /分区

3、的起始磁头号;USHORT SartSectorTrack ;/分区的起始扇区和磁道号UCHAR FileSystemID; /05H 或 0FH 为扩展分区, 06H 或 0EH 为 FAT16,0BH 或 0CH 为 FAT32 ,07 为 NTFS;UCHAR EndHead; /分区结束磁头号;USHORT EndSectorTrack; / 分区结束扇区和磁道号ULONG HeadSecor; /分区前的扇区;ULONG AllSector; /分区的总扇区;InFoDisk,*PInFoDisk; /* 位于磁盘的0 磁头 0 拄面 1 扇区;*/ #pragma pack(1)

4、typedef struct _System_Boot_Sector UCHAR BootCode0 x1be; /引导代码;InFoDisk InFoC; /C 分区的基本信息;InFoDisk InFoD; /D 分区的基本信息InFoDisk InFoE; /E 分区的基本信息一般不用为0;InFoDisk InFoF; /E 分区的基本信息一般不用为0;USHORT LoGo; /AA55; System_Boot_Sector,*PSystem_Boot_Sector; 从结构体可以看出偏移0 x1be 个字节就得到分区表的基本信息,在WINDOWS编程下这么找到:DWORD cbR

5、ead; System_Boot_Sector BootSectorData; HANDLE hFile=CreateFile(.PhysicalDrive0, GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|1, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0); ReadFile(hFile, & BootSectorData,0 x200 , &cbRead, NULL);/读的主引导扇区的数据。WriteFile(hFile, & BootSectorData,0 x200 , &cbRead, NU

6、LL);/向主引导扇区写数据。注意文件的指针;从 System_Boot_Sector.InFoDisk. HeadSecor ( 与第一分区 )可以知道主引导扇区到文件系统的引导扇区中间是相距System_Boot_Sector.InFoDisk. HeadSecor 个扇区。一般情况下大小为一磁道大小63 个扇区;由这里可见这63 个扇区除第一扇区被用来记录引导代码和基本分区表信息外,其他不用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - -

7、- - - - - 一般可将我们的主引导扇区备份一份写到其中了某个扇区中以做后用,这里读写得注意文件指针的移动;使用BOOL SetFilePointerEx( HANDLE hFile ,/ 打开文件获得的句柄LARGE _INTEGERliDistanceToMove ,/ 移动多少个字节PLARGE _INTEGERlpNewFilePointer, / 做返回值用DWORD dwMoveMethod / starting point FILE_BEGIN ,FILE_CURRENT ,FILE_END ;); (一) 。从下面开始怎样找到一个文件的内容:1.文件系统引导扇区(file

8、system boot sector) (先说 FAT32)文件系统引导扇区是对整个分区做详细的描述,位置确定:这里假设为C 盘(也是系统的第一个分区) 。这里可以从System_Boot_Sector.InFoDisk. HeadSecor中得到只需要将当前文件指针做合适的移动,另一方法:HANDLE hFile=CreateFile(.c:, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|1, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0); 根据这个打开的句柄用ReadFile 读出 512 个字

9、节。这512 字节我总结为以下结构:#pragma pack(1) typedef struct File_System_Fat32_Boot_Sector UCHAR HaedInFo0 x3; /3 个字节的跳转代码;UCHAR FileSystemASCII0 x8; /文件系统标志(ASCII 码) ; USHORT SizeSecor; /每扇区的字节数(硬盘一般为512) ;这里一个小技巧可以检查每扇区的道底有多少字节数;用 ReadFile(hFile, & BootSectorData,0 x200 , &cbRead, NULL);/读扇区的数据。cbRead 为返回值: 因

10、为读硬盘基本单位是扇区数。所以 cbRead 的大小就每扇区的字节的多少;UCHAR ClusterSecor; /每簇扇区数;USHORT ReservationsSecor; /保留扇区; /其 FA T 表紧跟在此之后;UCHAR FatTab; /fat 表的个数一般为 2;USHORT Dir; /根目录最多可容纳的目录项FAT32 不用为0,FAT12,16名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 一般为 5

11、12;USHORT AllSecor; /整个分区的扇区总数小于 32MB 放在此;UCHAR Description;/ 介质描述符一般为0 xF8; USHORT FatTabSize; /FAT32 不用;每FAT 表的大小扇区数USHORT TrackSectorSize; / 每磁道扇区数;USHORT Head; /磁头数;ULONG HeadSecor; /分区前的扇区数;ULONG AllSector; /文件系统的总扇区;ULONG FA TSize; /FAT 表的扇区大小值;USHORT FatLoGo; /确定 FAT 表的工作方式bit7 设置为1 表示只有一份FAT

12、表是活动的USHORT Version; /版本号;ULONG BootDirStartCluster;/ 根目录起始簇号一般为 2;USHORT FSINFO; /FSINFO 所在扇区号;1 号;USHORT BackupSector; / 备份扇区号;(6 号扇区)UCHAR Reservations0 xC; UCHAR BIOSint; UCHAR Omitted0 x1b2; USHORT LoGo; /AA55; File_System_Fat32_Boot_Sector ,*PFile_System_Fat32_Boot_Sector;。重要的域ClusterSecor; /

13、为 簇 扇 区 数 , ReservationsSecor; / 保 留 扇 区 ; AllSector; / 文 件 系 统 的 总 扇 区BootDirStartCluster;/ 根目录起始簇号一般为 2;这里的 FSINFO 扇区(512 个字节)FAT32 文件增加的其主要记录偏移 (0 x1E8)4 字节空闲簇数接着为下一个可用簇(4 字节)。有时这里记录的不准只做参考。从文件系统引导扇区偏移6 个扇区就是本分区的文件系统引导扇区的备份区。(此分区的文件系统引导扇区遭到破坏。可从这里恢复)FAT 表与根目录:名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

14、- - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 1. FAT 表接下来就来到非常重要的域ReservationsSecor 和 BootDirStartCluster 根据 ReservationsSecor 域确定 FAT 表。 FAT32 下一般 2 个 FAT 表。第 2 个是对第一个的备份 (因为 FAT 表非常重要破坏之后可以从其2 中恢复过来)。 FAT32 记录什么重要的数据呢?其 FAT 表主要记录文件系统分配的簇。被文件怎么使用的记录图于下:单位以 4 字节为单位。我们可以把FAT

15、 表里面贮存的数据看作是一个ULONG 类型的数组大小由 (FATSize*512 )/4 得到, (刚初始化除了0 号和 1 号被写入数据,其他都为0)然而数组的下标值侧对应每一个簇(由文件系统分配好的簇号从 0 开始编号) 。 0 号簇和 1 号簇被系统做特需用途。设 FAT 表的数组为:ULONG FA TArray (FATSize*512 )/4;现在以一个文件为例:假设文件的大小要占3 个簇,从6 号簇开放数据:那 么相应 的 对应 有:FATArray5= 0X0FFFFFFF;FATArray0 x6=0 x7;FA TArray0 x7=0 x8; FATArray0 x8=

16、0X0FFFFFFF; 从数组中可以知道文件占6,7, 8 号簇。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 很显然记录的是下一个簇号。文件结束的记录很重要也就是说。文件结束的记录在应对的FAT表中的记录被0 x0FFFFFFF; 可见FATArray5 是另一个文件结束的标志;。还有就文件不一定是连续簇存放数据的,也可以从它的数组记录的值就可以知道,另外当某个簇存在坏扇区侧整个簇对FAT表相应的位置被记录为0 x0FFF

17、FFFF7;假设 0XF34 簇坏了即有FATArray0XF34=0 x0FFFFFFF7; 2.根目录其实 0 号和 1 号簇只是逻辑上的实际上是没有真的分配扇区的。所以找到 FAT 表的位置+FAT 表的大小 *2;就得到 2 号簇的位置; 由 BootDirStartCluster 域可以得知根目录的簇号,一般情况下为2 号簇,也就是FAT 表结束就是根目录的起始位置,在WIN32 下根目录被看做是一个文件来存储。所以大小并不固定,FAT 表会做相应的记录,所谓的根目录就 (比如: 我们点击WINDOWS下的 C 盘这时打开一个目录这个目录就为根目录)下面我开始说根目录的结构(在根目录

18、中(C 目录下有文件,有子目录。有的文件名或子目录名大于11 个字节也有小于11 个字节。所以这里就有(短文件名(11)之分) ); 1.短文件名 (下面是结构 ) #pragma pack(1) typedef struct Short_Directory_entry UCHAR Filename0 xb; / 文件名文件第一个ASCII 码,如果为0X00 表示未被使用。0 xE5 使用过,被删除UCHAR FileAttrib; 0 x01表示只读, 0 x02 隐藏, 0 x04 系统文件, 0 x08 卷标,长文件名目录项,0 x10 表示目录, 0 x20 表示存档。UCHAR O

19、mitted1; UCHAR MTen; /精确 1/10 秒;USHORT CreateTime; USHORT CreateDay; USHORT LastAccessTime; /最后访问时间;USHORT SartClusterHigh; /文件内容的起始簇高字;USHORT ChangesTime; /修改时间USHORT ChangesDay; USHORT SartClusterLow; /文件内容的起始簇低字; ULONG FileSize; /文件大小,子目录设为0;Short_Directory_entry , *PShort_Directory_entry; 短文件名很简

20、单结构中的域也易懂,值得注意:Filename 为域的第一个字节的为0 xe5,FileSize(这两个域有问题存在以后谈论),SartClusterHigh|SartClusterLow文件内容的簇号。其实际位置 =2 号簇位置 +( (SartClusterHigh|SartClusterLow )-2)* 每簇扇区数 *每扇区字节数,这样就得到相对的偏移地址。2.长文件名:长文件名的目录结构其有一头部与短文件名一样。只是 Filename 域不能储存文件名的全部 ( 比如 : 1234546565676765.txt文 件名 11 字节 ,那 么Filename 域 就 只能 保 存名师

21、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 1234545txt )这么剩余的怎么办。这样就要求另外分配目录项给它。其分配多少项侧得根据目录项的格式来定。以下为目录项的结构体:#pragma pack(1) typedef struct Long_Directory_entry UCHAR FirstFilename; /目录项的序列号,从1 开始。递增的。如果为目录项的最后一项侧值为项最后一项的序列号的值|40 得到的值,

22、如果该长名目录项文件或文件夹对应的项删除侧这个字节为0Xe5;UWCHAR Filename10 x5;/ 宽字符形式,为长文件名的第15 个字符;UCHAR Logo; /长文件名目录为0 x0F;UCHAR Omitted; UCHAR Checksum; /检查值 ; UWCHAR Filename20 x6; /长文件名的第611 个字符;当未使用先 00 填充 2 个字,然后0 xff ; 如果完全不足全用0 xFF; UCHAR Omitted1; UWCHAR Filename30 x2;/ 长文件名的最后两字符,当未使用时,先填充2 个字用00 ,然后用 0 xff ;如果完全

23、不足全用0 xFF; Long_Directory_entry,*PLong_Directory_entry; 下面给出长文件名目录项的分析:从上面可以知道 文件名 文abcdefghijk.txt. 从 Logo域可以 看出本 项为长 文件名 目录项(Logo=0 xf 在头部结构里的这里域表示文件的属性当为只读 |隐藏 |系统文件 |卷标也 =0 xf(这个留到以后讨论) ) 。3 . “ .” 与 ” .” 目录 :“ .” 目 录 位 于 子 目 录 起 始 簇 的 第 一 个 目 录 项 位 置 , 主 要 记 录 子 目 录 起 始 簇(SartClusterHigh| SartC

24、lusterLow ) 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - “ .” 目录位于子目录起始簇的第二个目录项中。主要记录此子目录的父目录的起始簇。如果父目录为根目录侧SartClusterHigh =0 ,SartClusterLow =0 ;OK,现在该到说文件的建立:假设: C:WINDOWSConfig1.txt;,又假设1.txt 文件要用 3 个簇为例(1)从 System_Boot_Sector.InFo

25、Disk. HeadSecor 找出分区的文件系统引导扇区,而后在根据这个文件系统引导扇区的(2)File_System_Fat32_Boot_Sector.ReservationsSecor+File_System_Fat32_Boot_Sector.FATSize*File_System_Fat32_Boot_Sector.FatTab+(File_System_Fat32_Boot_Sector.BootDirStartCluster-2) *File_System_Fat32_Boot_Sector.ClusterSecor这里我们就找到了C:目录的扇区偏移值。现在就在这个扇区值里找到

26、Config 目录项。(3)根据 Config 目录项里的 Short_Directory_entry .SartClusterHigh| Short_Directory_entry. SartClusterLow 找到 Config 目录的位置。(4)现在开始搜索FAT 表链查看FATArrayn; 数组为 0 的如果 n=9; 那么开始在Config目录下相应的位置建立1.txt 文件名目录项。 并把文件的起始簇和文件的大小写到目录项的相应位置。当文件写入到磁盘一个簇后。系统会搜索下一个空闲的簇。假设为 10.那么 FATArray9=10;,下一个假设为11,FATArray10=11,

27、FA TArray11=0 x0fffffff;3个簇的记录。这样就是系统向FAT32 文件系统磁盘写文件的情景。(很显然如果文件扩大的话将FATArray11 改记录为一下个簇的号)。其目录的建立类似就不描述了。OK 现在该到文件的删除问题了,看看傻傻的操作系统干了什么好事。以上面的C:WINDOWSConfig1.txt;文件为例:(1)从文件系统的0 号扇区(就是我说的文件系统引导扇区)定位FAT 表,数据区和根目录的位置(2)在 Config 目录下定位1.txt 的目录项,并读取1.txt 文件的起始簇为9;(3)搜索 FAT 链表并将 FATArray9=0;FATArray10=

28、0;FATArray11=0;(4)最后将 1.txt 的目录项中的Short_Directory_entry . Filename0 x1 改为 0 xe5;下面将给去从主引导扇区到文件内容的关系图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 4.分配策略1簇的分配策略;2目录项的分配策略;(以后做系统的研究,目前时间有限)分配策略的不同将会影响恢复的可靠性。名师资料总结 - - -精品资料欢迎下载 - - - - -

29、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - NTFS 文件系统( XP 下)下面为 NTFS 文件系统对本分区的一般性布局:简单的说明一下:一般16 扇区用不了的,而真正记录NTFS 文件系统信息只用512 个字节而文件系统引导扇区备份区也只是备份512 个字节。这个备份区不在NTFS 文件系统描述的范围之内。 其刚好比File_System_NTFS_Boot_Sector .AllSecor大一个扇区; ,MFT 的备份只是把 MFT 里的元文件做备份; (元文件后面说)1.文件

30、系统引导扇区(file system boot sector)和 FAT32 文件系统一样, 其对本分区做一个详细的描述。下面是对这个扇区的描述,大小为 512 个字节,位置为文件系统的0 号扇区:#define DOUBLE double unsigned long #pragma pack(1) typedef struct File_System_NTFS_Boot_Sector UCHAR BootJmp0 x3; /3 字节的引导扇区跳转代码UCHAR HaedInFo0 x8; / 为 NTFS 的 ASCII 码USHORT SizeSecor; /硬盘为 512;UCHAR C

31、lusterSecor; /为簇扇区数;USHORT ReservationsSecor;/保留扇区;UCHAR Omitted5; UCHAR Description;/ 介质描述符一般为0 xF8; UCHAR Omitted12; USHORT TrackSectorSize; / 每磁道扇区数;USHORT Head; /磁头数;ULONG HeadSecor; /分区前的扇区数;ULONG Omitted2; ULONG Omitted3; DOUBLE AllSecor; /文件系统扇区总数;DOUBLE SratMFTCluster; /MFT的起始簇号 /NTFS 文件系统簇编

32、号从0 开始DOUBLE BackupSratMFTCluster; /备份 MFT 的起始簇号;UCHAR SizeMFTItem; / 每项 MFT 的大小;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - UCHAR Omitted43; UCHAR SearchSizeCluster; /索引簇大小;UCHAR Omitted53; DOUBLE Serial; /序列号;ULONG Checksum; /校验和;一般

33、为0 UCHAR Omitted6426; / 引导代码;USHORT LoGo; /AA55; File_System_NTFS_Boot_Sector ,*PFile_System_NTFS_Boot_Sector; 从 上 面的 结构 体中 我可 以得 到 对整 个分 区的 详细 描述 。其 重 要域 有: ClusterSecor,ReservationsSecor(由它找出第一簇的位置)SratMFTCluster (非常关键) 。2.MFT( 主文件表 ) 从 NTFS 的一般性布局看MFT 占相当多的空间(大约整个分区的12.5%左右),也是非常 重 要 的。 OK 来 看 看定

34、 位MFT表 的起 始 地址 : File_System_NTFS_Boot_Sector. ReservationsSecor+File_System_NTFS_Boot_Sector.SratMFTCluster*File_System_NTFS_Boot_Sector.ClusterSecor*File_System_NTFS_Boot_Sector. SizeSecor; 现在来看看MFT 表是有一项一项的MFT 项组成(一般情况每一项占2 个扇区):2000和 XP 之分这些 MFT 项都有一个固定的头部如下:#pragma pack(1) typedef struct NTFS_2

35、000_HEAD_INFO ULONG FileSystemName; /FILE USHORT NewSerialOffset; / 更新序列号的偏移USHORT NewSerialSize; /数组个数;DOUBLE LSN; /日志号;USHORT Serial; /序列号;USHORT PLink; /硬连接;表明有多少文件名连接此MFT 项;USHORT OneAbbirOffsetAddr; / 第一个属性偏移地址;USHORT LoGo; /0 x00 文件删除, 0 x01 文件; 0 x02 目录删除; 0 x03 目录;ULONG MFToLenth; /MFT项的逻辑长度

36、;ULONG MFTpLenth; /MFT项的物理长度;DOUBLE FileRecordInxd;/ 文件记录索引;USHORT NextAbbirID; / 下一个属性ID ;UCHAR NewSerialArry6;/ 更新序列号数组;UCHAR AttridGroup976; /属性组; NTFS_2000_HEAD_INFO, *PNTFS_2000_HEAD_INFO; NTFS_2000_HEAD_INFO. FileSystemName这个局有点意思。 。当程序检查某个MFT 项时如果此项出 现错误 。那么 系统会 将它 设置为BAAD的字样 。其 中重要 的域有NTFS_2000_HEAD_INFO. OneAbbirOffsetAddr,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁