VFAT 文件系统结构详解(阿甘译)

VFAT文件系统在Windows NT 3.5和Windows 95中引入,主要增加了对长文件名的支持。它保留了与DOS 6.22及更高版本的FAT文件系统大部分兼容性。文件名长度可达255个字符,包括空格和小写字母。扩展FAT通过插入附加目录入口支持长文件名,这些入口作为传统8.3命名的扩展。每个附加入口包含序列号、名字、属性等信息,并使用特定算法保证与旧版软件兼容。VFAT还涉及UNICODE存储,对某些字符进行了特殊处理以避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.nondot.org/sabre/os/files/FileSystems/VFATInfo.txt

VFAT 文件系统结构详解
------------------------------------------------------------------------------------
(这篇文档是由Galen C. Hunt<gchunt@cs.rochester.edu>提供,并由Gordon Chaffee略加注释)

    这篇文档提供了一个我对在Windows NT 3.5和Windows 95上使用的扩展FAT文件系统,一些粗略的、技术性的概貌上的理解。我并不保证下面的观点是正确的,虽然它显得是正确的。

   扩展FAT文件系统几乎和在DOS 6.223410239847以上版本(包括6.223410239847 版)上使用的FAT文件系统完全相同,最重大的改变就是对长文件名的支持。它使名字长度上升到255个字符,包括空格和小写字母,而传统的只支持8.3名字长度。(8个字符的主文件名,3个字符的扩展文件名)

  下面是对现在的Windows 95文件系统上,传统的FAT接口描述:

   struct directory { // 短 8.3 命名
                              unsigned char name[8];                     // 主文件名
                              unsigned char ext[3];                          // 文件扩展名
                              unsigned char attr;                              // 属性字节
                              unsigned char lcase;                           // 主文件名和扩展名的大小写标志
                              unsigned char ctime_ms;                    // 创建时间(微秒)
                              unsigned char ctime[2];                      // 创建时间
                              unsigned char cdate[2];                      // 创建日期
                              unsigned char adate[2];                      // 最后一次访问日期
                              unsigned char reserved[2];                // 保留字节 (忽略) 
                              unsigned char time[2];                        // 时间戳
                              unsigned char date[2];                        // 日期戳 
                              unsigned char start[2];                        // 开始簇号 
                              unsigned char size[4];                         // 文件的大小
               };


        其中的lcase域描述主文件名和(或者)扩展文件名《基于8.3命名》是否是大写。这个域似乎没有在Windows 95上使用,但是已经在Windows NT上得到应用。名字的大小写从Windows NT 到 Windows 95并不完全兼容,反之也不完全兼容。Windows NT上使用8.3命名空间的、小写的文件名将会在Windows95上变成大写的。

       注意:"start"域和"sized"域的值小端整数值。(关于大端、小端都是数据在内存中存储方式的描述)对这个结构中的域的解释都已经为大家所知晓,能在其他很多地方找到。

       在扩展FAT文件系统中,Microsoft 为任何使用了扩展名字的文件,插入了一些附加目录入口。(任何符合老式的8.3编码规则的名字都不会有附加的项目) 我把这些叫做附加进入接口。基本上,一个接口就是一个特殊格式的目录进入点,这个进入点能够支持13个字符的文件扩展命名。可以把这些接口看作是额外的与文件目录进入点相对应的标签。Microsoft 倾向于把8.3命名作为文件的别名,而把扩展的文件目录进入点做为文件名。
    下面是目录进入点接口的C语言结构:

        struct slot { // 扩充至13个字符的长文件名 
                               unsigned char id                                      // 接口的序列号
                               unsigned char name0_4[10];                  // 名字的前5个字符 
                               unsigned char attr;                                  // 属性字节
                               unsigned char reserved;                         // 总为0 
                               unsigned char alias_checksum;             // 8.3别名的效验码
                               unsigned char name5_10[12];                // 名字接下来的6个字符
                               unsigned char start[2];                            // 开始簇号
                               unsigned char name11_12[4];                // 名字的最后两个字符
          };

          假如接口的实现开起来有点笨拙的话,那是因为Microsoft 想保持对以前的软件的兼容。设计出来的接口必须防止与老软件冲突。下面是一些防止冲突的措施:

          1>目录进入点接口的属性字节总是被设置为0x0f。这与老的文件目录进入点接口相对应,老的文件进入点接口包含“隐藏”、“系统”、“只读”和“存挡”属性。很多老式软件会忽略目录进入点的存档标志位的设置。真实的存档接口并不会将其他三个标志位置位。
          2>簇的开始位总是被设置为0,DOS文件是不可能设置为这个值的。
 
       因为扩展FAT文件系统的兼容性很笨拙,使老式软件可以修改目录进入点。必须采取措施保证目录进入点的有效性。扩展FAT文件系统能够通过以下步骤分辨属于8.3 目录接口:
  
      1>定位(Positioning)。文件的接口总是最先处理他们的8.3目录进入点。另外,每个接口都有一个标识它在扩展文件名结构中位置的标识(id)。下面来简略分析一个8.3目录接口和他所对应的长文件命名接口。这个文件名是:“My Big File.Extension which is long”

                <proceeding files...>
                <slot #3, id = 0x43, characters = "h is long">
                <slot #2, id = 0x02, characters = "xtension whic">
                <slot #1, id = 0x01, characters = "My Big File.E">
                <directory entry, name = "MYBIGFIL.EXT">


         注意:这些接口存储顺序是从后到前,接口被从1到N的数字标识,将第N个接口标识与0x40做或运算,来表示它是最后一个接口。
 

        2>效验和(checksum)。每个接口都有一个"alias_checksum"的值,这个效验和依据下面的算法从8.3名字规则而来:
 
           for (sum = i = 0; i < 11; i++) {
                   sum = (((sum&1)<<7)|((sum&0xfe)>>1)) + name[i]
                 }

        3>假如在最后一个接口中,在最后一个字符的后面存储了一个UNICODE的NULL(0x0000)。则在最后一个接口中所有未使用的字符都被设置为 Unicode 0xFFFF。

        最后,要注意,扩展的名字都是以UNICODE存储的。每个UNICODE字符占用两个字节。

 

一些在VFAT系统中UNICODE形式的细节
///////////////////////////////////////////////////////////////////////////////////////
(Information provided by Steve Searle <steve@mgu.bath.ac.uk>)

Char used as   Char(s) used   Char(s) used in     Entries which have
filename       in shortname   longname slot       been corrected
0x80 (128)     0x80           0xC7                  
0x81 (129)     0x9A           0xFC
0x82 (130)     0x90           0xE9                     E
0x83 (131)     0xB6           0xE2                     E
0x84 (132)     0x8E           0xE4                     E
0x85 (133)     0xB7           0xE0                     E
0x86 (134)     0x8F           0xE5                     E
0x87 (135)     0x80           0xE7                     E
0x88 (136)     0xD2           0xEA                     E
0x89 (137)     0xD3           0xEB                     E
0x8A (138)     0xD4           0xE8                     E
0x8B (139)     0xD8           0xEF                     E
0x8C (140)     0xD7           0xEE                     E
0x8D (141)     0xDE           0xEC                     E
0x8E (142)     0x8E           0xC4                     E
0x8F (143)     0x8F           0xC5                     E
0x90 (144)     0x90           0xC9                     E
0x91 (145)     0x92           0xE6                     E
0x92 (146)     0x92           0xC6                     E
0x93 (147)     0xE2           0xF4                     E
0x94 (148)     0x99           0xF6
0x95 (149)     0xE3           0xF2
0x96 (150)     0xEA           0xFB
0x97 (151)     0xEB           0xF9
0x98 (152)     "_~1"          0xFF
0x99 (153)     0x99           0xD6
0x9A (154)     0x9A           0xDC
0x9B (155)     0x9D           0xF8
0x9C (156)     0x9C           0xA3
0x9D (157)     0x9D           0xD8
0x9E (158)     0x9E           0xD7
0x9F (159)     0x9F           0x92
0xA0 (160)     0xB5           0xE1
0xA1 (161)     0xD6           0xE0
0xA2 (162)     0xE0           0xF3
0xA3 (163)     0xE9           0xFA
0xA4 (164)     0xA5           0xF1
0xA5 (165)     0xA5           0xD1
0xA6 (166)     0xA6           0xAA
0xA7 (167)     0xA7           0xBA
0xA8 (168)     0xA8           0xBF
0xA9 (169)     0xA9           0xAE
0xAA (170)     0xAA           0xAC
0xAB (171)     0xAB           0xBD
0xAC (172)     0xAC           0xBC
0xAD (173)     0xAD           0xA1
0xAE (174)     0xAE           0xAB
0xAF (175)     0xAF           0xBB
0xB0 (176)     0xB0           0x91 0x25
0xB1 (177)     0xB1           0x92 0x25
0xB2 (178)     0xB2           0x93 0x25
0xB3 (179)     0xB3           0x02 0x25
0xB4 (180)     0xB4           0x24 0x25
0xB5 (181)     0xB5           0xC1
0xB6 (182)     0xB6           0xC2
0xB7 (183)     0xB7           0xC0
0xB8 (184)     0xB8           0xA9
0xB9 (185)     0xB9           0x63 0x25
0xBA (186)     0xBA           0x51 0x25
0xBB (187)     0xBB           0x57 0x25
0xBC (188)     0xBC           0x5D 0x25
0xBD (189)     0xBD           0xA2
0xBE (190)     0xBE           0xA5
0xBF (191)     0xBF           0x10 0x25
0xC0 (192)     0xC0           0x14 0x25
0xC1 (193)     0xC1           0x34 0x25
0xC2 (194)     0xC2           0x2C 0x25
0xC3 (195)     0xC3           0x1C 0x25
0xC4 (196)     0xC4           0x00 0x25
0xC5 (197)     0xC5           0x3C 0x25
0xC6 (198)     0xC7           0xE3                     E
0xC7 (199)     0xC7           0xC3
0xC8 (200)     0xC8           0x5A 0x25                E
0xC9 (201)     0xC9           0x54 0x25                E
0xCA (202)     0xCA           0x69 0x25                E
0xCB (203)     0xCB           0x66 0x25                E
0xCC (204)     0xCC           0x60 0x25                E
0xCD (205)     0xCD           0x50 0x25                E
0xCE (206)     0xCE           0x6C 0x25                E
0xCF (207)     0xCF           0xA4                     E
0xD0 (208)     0xD1           0xF0
0xD1 (209)     0xD1           0xD0
0xD2 (210)     0xD2           0xCA
0xD3 (211)     0xD3           0xCB
0xD4 (212)     0xD4           0xC8
0xD5 (213)     0x49           0x31 0x01
0xD6 (214)     0xD6           0xCD
0xD7 (215)     0xD7           0xCE
0xD8 (216)     0xD8           0xCF
0xD9 (217)     0xD9           0x18 0x25
0xDA (218)     0xDA           0x0C 0x25
0xDB (219)     0xDB           0x88 0x25
0xDC (220)     0xDC           0x84 0x25
0xDD (221)     0xDD           0xA6
0xDE (222)     0xDE           0xCC
0xDF (223)     0xDF           0x80 0x25
0xE0 (224)     0xE0           0xD3
0xE1 (225)     0xE1           0xDF
0xE2 (226)     0xE2           0xD4
0xE3 (227)     0xE3           0xD2
0xE4 (228)     0x05           0xF5
0xE5 (229)     0x05           0xD5
0xE6 (230)     0xE6           0xB5
0xE7 (231)     0xE8           0xFE
0xE8 (232)     0xE8           0xDE
0xE9 (233)     0xE9           0xDA
0xEA (234)     0xEA           0xDB
0xEB (235)     0xEB           0xD9
0xEC (236)     0xED           0xFD
0xED (237)     0xED           0xDD
0xEE (238)     0xEE           0xAF
0xEF (239)     0xEF           0xB4
0xF0 (240)     0xF0           0xAD
0xF1 (241)     0xF1           0xB1
0xF2 (242)     0xF2           0x17 0x20
0xF3 (243)     0xF3           0xBE
0xF4 (244)     0xF4           0xB6
0xF5 (245)     0xF5           0xA7
0xF6 (246)     0xF6           0xF7
0xF7 (247)     0xF7           0xB8
0xF8 (248)     0xF8           0xB0
0xF9 (249)     0xF9           0xA8
0xFA (250)     0xFA           0xB7
0xFB (251)     0xFB           0xB9
0xFC (252)     0xFC           0xB3
0xFD (253)     0xFD           0xB2
0xFE (254)     0xFE           0xA0 0x25
0xFF (255)     0xFF           0xA0


Page 0
0x80 (128)     0x00
0x81 (129)     0x00
0x82 (130)     0x00
0x83 (131)     0x00
0x84 (132)     0x00
0x85 (133)     0x00
0x86 (134)     0x00
0x87 (135)     0x00
0x88 (136)     0x00
0x89 (137)     0x00
0x8A (138)     0x00
0x8B (139)     0x00
0x8C (140)     0x00
0x8D (141)     0x00
0x8E (142)     0x00
0x8F (143)     0x00
0x90 (144)     0x00
0x91 (145)     0x00
0x92 (146)     0x00
0x93 (147)     0x00
0x94 (148)     0x00
0x95 (149)     0x00
0x96 (150)     0x00
0x97 (151)     0x00
0x98 (152)     0x00
0x99 (153)     0x00
0x9A (154)     0x00
0x9B (155)     0x00
0x9C (156)     0x00
0x9D (157)     0x00
0x9E (158)     0x00
0x9F (159)     0x92
0xA0 (160)     0xFF
0xA1 (161)     0xAD
0xA2 (162)     0xBD
0xA3 (163)     0x9C
0xA4 (164)     0xCF
0xA5 (165)     0xBE
0xA6 (166)     0xDD
0xA7 (167)     0xF5
0xA8 (168)     0xF9
0xA9 (169)     0xB8
0xAA (170)     0x00
0xAB (171)     0xAE
0xAC (172)     0xAA
0xAD (173)     0xF0
0xAE (174)     0x00
0xAF (175)     0xEE
0xB0 (176)     0xF8
0xB1 (177)     0xF1
0xB2 (178)     0xFD
0xB3 (179)     0xFC
0xB4 (180)     0xEF
0xB5 (181)     0xE6
0xB6 (182)     0xF4
0xB7 (183)     0xFA
0xB8 (184)     0xF7
0xB9 (185)     0xFB
0xBA (186)     0x00
0xBB (187)     0xAF
0xBC (188)     0xAC
0xBD (189)     0xAB
0xBE (190)     0xF3
0xBF (191)     0x00
0xC0 (192)     0xB7
0xC1 (193)     0xB5
0xC2 (194)     0xB6
0xC3 (195)     0xC7
0xC4 (196)     0x8E
0xC5 (197)     0x8F
0xC6 (198)     0x92
0xC7 (199)     0x80
0xC8 (200)     0xD4
0xC9 (201)     0x90
0xCA (202)     0xD2
0xCB (203)     0xD3
0xCC (204)     0xDE
0xCD (205)     0xD6
0xCE (206)     0xD7
0xCF (207)     0xD8
0xD0 (208)     0x00
0xD1 (209)     0xA5
0xD2 (210)     0xE3
0xD3 (211)     0xE0
0xD4 (212)     0xE2
0xD5 (213)     0xE5
0xD6 (214)     0x99
0xD7 (215)     0x9E
0xD8 (216)     0x9D
0xD9 (217)     0xEB
0xDA (218)     0xE9
0xDB (219)     0xEA
0xDC (220)     0x9A
0xDD (221)     0xED
0xDE (222)     0xE8
0xDF (223)     0xE1
0xE0 (224)     0x85, 0xA1
0xE1 (225)     0xA0
0xE2 (226)     0x83
0xE3 (227)     0xC6
0xE4 (228)     0x84
0xE5 (229)     0x86
0xE6 (230)     0x91
0xE7 (231)     0x87
0xE8 (232)     0x8A
0xE9 (233)     0x82
0xEA (234)     0x88
0xEB (235)     0x89
0xEC (236)     0x8D
0xED (237)     0x00
0xEE (238)     0x8C
0xEF (239)     0x8B
0xF0 (240)     0xD0
0xF1 (241)     0xA4
0xF2 (242)     0x95
0xF3 (243)     0xA2
0xF4 (244)     0x93
0xF5 (245)     0xE4
0xF6 (246)     0x94
0xF7 (247)     0xF6
0xF8 (248)     0x9B
0xF9 (249)     0x97
0xFA (250)     0xA3
0xFB (251)     0x96
0xFC (252)     0x81
0xFD (253)     0xEC
0xFE (254)     0xE7
0xFF (255)     0x98




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值