2 Definitions for on-disk FAT structures.
4 Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #ifndef _FATFILESYSTEM_H_
11 #define _FATFILESYSTEM_H_
17 #define FAT_INFO_SIGNATURE 0x41615252
18 #define FAT_INFO_BEGIN_SIGNATURE 0x61417272
19 #define FAT_INFO_END_SIGNATURE 0xAA550000
23 #define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF))
24 #define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07)
25 #define FAT_CLUSTER_FREE 0
26 #define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL)
27 #define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL)
28 #define FAT_CLUSTER_LAST (-1)
29 #define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))
30 #define FAT_MIN_CLUSTER 2
31 #define FAT_MAX_FAT12_CLUSTER 0xFF5
32 #define FAT_MAX_FAT16_CLUSTER 0xFFF5
33 #define FAT_CLUSTER_SPECIAL_FAT12 0xFF7
34 #define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7
35 #define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7
36 #define FAT_CLUSTER_MASK_FAT12 0xFFF
37 #define FAT_CLUSTER_UNMASK_FAT12 0xF000
38 #define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF
39 #define FAT_CLUSTER_UNMASK_FAT32 0xF0000000
40 #define FAT_POS_FAT12(a) ((a) * 3 / 2)
41 #define FAT_POS_FAT16(a) ((a) * 2)
42 #define FAT_POS_FAT32(a) ((a) * 4)
43 #define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0)
47 // FAT attribute define
49 #define FAT_ATTRIBUTE_READ_ONLY 0x01
50 #define FAT_ATTRIBUTE_HIDDEN 0x02
51 #define FAT_ATTRIBUTE_SYSTEM 0x04
52 #define FAT_ATTRIBUTE_VOLUME_ID 0x08
53 #define FAT_ATTRIBUTE_DIRECTORY 0x10
54 #define FAT_ATTRIBUTE_ARCHIVE 0x20
55 #define FAT_ATTRIBUTE_DEVICE 0x40
56 #define FAT_ATTRIBUTE_LFN 0x0F
58 // Some Long File Name definitions
60 #define FAT_LFN_LAST 0x40 // Ordinal field
61 #define MAX_LFN_ENTRIES 20
62 #define LFN_CHAR1_LEN 5
63 #define LFN_CHAR2_LEN 6
64 #define LFN_CHAR3_LEN 2
65 #define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN)
66 #define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL)
68 // Some 8.3 File Name definitions
70 #define FAT_MAIN_NAME_LEN 8
71 #define FAT_EXTEND_NAME_LEN 3
72 #define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN)
74 // Some directory entry information
76 #define FAT_ENTRY_INFO_OFFSET 13
77 #define DELETE_ENTRY_MARK 0xE5
78 #define EMPTY_ENTRY_MARK 0x00
83 #define FAT16_DIRTY_MASK 0x7fff
84 #define FAT32_DIRTY_MASK 0xf7ffffff
88 #define FAT_CASE_MIXED 0x01
89 #define FAT_CASE_NAME_LOWER 0x08
90 #define FAT_CASE_EXT_LOWER 0x10
96 UINT8 SectorsPerCluster
;
97 UINT16 ReservedSectors
;
99 UINT16 RootEntries
; // < FAT32, root dir is fixed size
102 UINT16 SectorsPerFat
; // < FAT32
103 UINT16 SectorsPerTrack
; // (ignored)
104 UINT16 Heads
; // (ignored)
105 UINT32 HiddenSectors
; // (ignored)
106 UINT32 LargeSectors
; // Used if Sectors==0
107 } FAT_BOOT_SECTOR_BASIC
;
110 UINT8 PhysicalDriveNumber
; // (ignored)
111 UINT8 CurrentHead
; // holds boot_sector_dirty bit
112 UINT8 Signature
; // (ignored)
116 } FAT_BOOT_SECTOR_EXT
;
119 UINT32 LargeSectorsPerFat
; // FAT32
120 UINT16 ExtendedFlags
; // FAT32 (ignored)
121 UINT16 FsVersion
; // FAT32 (ignored)
122 UINT32 RootDirFirstCluster
; // FAT32
123 UINT16 FsInfoSector
; // FAT32
124 UINT16 BackupBootSector
; // FAT32
125 UINT8 Reserved
[12]; // FAT32 (ignored)
126 UINT8 PhysicalDriveNumber
; // (ignored)
127 UINT8 CurrentHead
; // holds boot_sector_dirty bit
128 UINT8 Signature
; // (ignored)
132 } FAT32_BOOT_SECTOR_EXT
;
135 FAT_BOOT_SECTOR_EXT FatBse
;
136 FAT32_BOOT_SECTOR_EXT Fat32Bse
;
140 FAT_BOOT_SECTOR_BASIC FatBsb
;
145 // FAT Info Structure
154 UINT8 ExtraBootCode
[480];
155 UINT32 InfoBeginSignature
;
156 FAT_FREE_INFO FreeInfo
;
158 UINT32 InfoEndSignature
;
164 #define FAT_MAX_YEAR_FROM_1980 0x7f
168 UINT16 Year
: 7; // From 1980
172 UINT16 DoubleSecond
: 5;
183 CHAR8 FileName
[11]; // 8.3 filename
186 UINT8 CreateMillisecond
; // (creation milliseconds - ignored)
187 FAT_DATE_TIME FileCreateTime
;
188 FAT_DATE FileLastAccess
;
189 UINT16 FileClusterHigh
; // >= FAT32
190 FAT_DATE_TIME FileModificationTime
;
193 } FAT_DIRECTORY_ENTRY
;
197 CHAR8 Name1
[10]; // (Really 5 chars, but not WCHAR aligned)