1 | /** @file
|
---|
2 | Definitions for on-disk FAT structures.
|
---|
3 |
|
---|
4 | Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
|
---|
5 | SPDX-License-Identifier: BSD-2-Clause-Patent
|
---|
6 |
|
---|
7 |
|
---|
8 | **/
|
---|
9 |
|
---|
10 | #ifndef _FATFILESYSTEM_H_
|
---|
11 | #define _FATFILESYSTEM_H_
|
---|
12 |
|
---|
13 | #pragma pack(1)
|
---|
14 | //
|
---|
15 | // FAT info signature
|
---|
16 | //
|
---|
17 | #define FAT_INFO_SIGNATURE 0x41615252
|
---|
18 | #define FAT_INFO_BEGIN_SIGNATURE 0x61417272
|
---|
19 | #define FAT_INFO_END_SIGNATURE 0xAA550000
|
---|
20 | //
|
---|
21 | // FAT entry values
|
---|
22 | //
|
---|
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)
|
---|
44 |
|
---|
45 |
|
---|
46 | //
|
---|
47 | // FAT attribute define
|
---|
48 | //
|
---|
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
|
---|
57 | //
|
---|
58 | // Some Long File Name definitions
|
---|
59 | //
|
---|
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)
|
---|
67 | //
|
---|
68 | // Some 8.3 File Name definitions
|
---|
69 | //
|
---|
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)
|
---|
73 | //
|
---|
74 | // Some directory entry information
|
---|
75 | //
|
---|
76 | #define FAT_ENTRY_INFO_OFFSET 13
|
---|
77 | #define DELETE_ENTRY_MARK 0xE5
|
---|
78 | #define EMPTY_ENTRY_MARK 0x00
|
---|
79 |
|
---|
80 | //
|
---|
81 | // Volume dirty Mask
|
---|
82 | //
|
---|
83 | #define FAT16_DIRTY_MASK 0x7fff
|
---|
84 | #define FAT32_DIRTY_MASK 0xf7ffffff
|
---|
85 | //
|
---|
86 | // internal flag
|
---|
87 | //
|
---|
88 | #define FAT_CASE_MIXED 0x01
|
---|
89 | #define FAT_CASE_NAME_LOWER 0x08
|
---|
90 | #define FAT_CASE_EXT_LOWER 0x10
|
---|
91 |
|
---|
92 | typedef struct {
|
---|
93 | UINT8 Ia32Jump[3];
|
---|
94 | CHAR8 OemId[8];
|
---|
95 | UINT16 SectorSize;
|
---|
96 | UINT8 SectorsPerCluster;
|
---|
97 | UINT16 ReservedSectors;
|
---|
98 | UINT8 NumFats;
|
---|
99 | UINT16 RootEntries; // < FAT32, root dir is fixed size
|
---|
100 | UINT16 Sectors;
|
---|
101 | UINT8 Media;
|
---|
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;
|
---|
108 |
|
---|
109 | typedef struct {
|
---|
110 | UINT8 PhysicalDriveNumber; // (ignored)
|
---|
111 | UINT8 CurrentHead; // holds boot_sector_dirty bit
|
---|
112 | UINT8 Signature; // (ignored)
|
---|
113 | CHAR8 Id[4];
|
---|
114 | CHAR8 FatLabel[11];
|
---|
115 | CHAR8 SystemId[8];
|
---|
116 | } FAT_BOOT_SECTOR_EXT;
|
---|
117 |
|
---|
118 | typedef struct {
|
---|
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)
|
---|
129 | CHAR8 Id[4];
|
---|
130 | CHAR8 FatLabel[11];
|
---|
131 | CHAR8 SystemId[8];
|
---|
132 | } FAT32_BOOT_SECTOR_EXT;
|
---|
133 |
|
---|
134 | typedef union {
|
---|
135 | FAT_BOOT_SECTOR_EXT FatBse;
|
---|
136 | FAT32_BOOT_SECTOR_EXT Fat32Bse;
|
---|
137 | } FAT_BSE;
|
---|
138 |
|
---|
139 | typedef struct {
|
---|
140 | FAT_BOOT_SECTOR_BASIC FatBsb;
|
---|
141 | FAT_BSE FatBse;
|
---|
142 | } FAT_BOOT_SECTOR;
|
---|
143 |
|
---|
144 | //
|
---|
145 | // FAT Info Structure
|
---|
146 | //
|
---|
147 | typedef struct {
|
---|
148 | UINT32 ClusterCount;
|
---|
149 | UINT32 NextCluster;
|
---|
150 | } FAT_FREE_INFO;
|
---|
151 |
|
---|
152 | typedef struct {
|
---|
153 | UINT32 Signature;
|
---|
154 | UINT8 ExtraBootCode[480];
|
---|
155 | UINT32 InfoBeginSignature;
|
---|
156 | FAT_FREE_INFO FreeInfo;
|
---|
157 | UINT8 Reserved[12];
|
---|
158 | UINT32 InfoEndSignature;
|
---|
159 | } FAT_INFO_SECTOR;
|
---|
160 |
|
---|
161 | //
|
---|
162 | // Directory Entry
|
---|
163 | //
|
---|
164 | #define FAT_MAX_YEAR_FROM_1980 0x7f
|
---|
165 | typedef struct {
|
---|
166 | UINT16 Day : 5;
|
---|
167 | UINT16 Month : 4;
|
---|
168 | UINT16 Year : 7; // From 1980
|
---|
169 | } FAT_DATE;
|
---|
170 |
|
---|
171 | typedef struct {
|
---|
172 | UINT16 DoubleSecond : 5;
|
---|
173 | UINT16 Minute : 6;
|
---|
174 | UINT16 Hour : 5;
|
---|
175 | } FAT_TIME;
|
---|
176 |
|
---|
177 | typedef struct {
|
---|
178 | FAT_TIME Time;
|
---|
179 | FAT_DATE Date;
|
---|
180 | } FAT_DATE_TIME;
|
---|
181 |
|
---|
182 | typedef struct {
|
---|
183 | CHAR8 FileName[11]; // 8.3 filename
|
---|
184 | UINT8 Attributes;
|
---|
185 | UINT8 CaseFlag;
|
---|
186 | UINT8 CreateMillisecond; // (creation milliseconds - ignored)
|
---|
187 | FAT_DATE_TIME FileCreateTime;
|
---|
188 | FAT_DATE FileLastAccess;
|
---|
189 | UINT16 FileClusterHigh; // >= FAT32
|
---|
190 | FAT_DATE_TIME FileModificationTime;
|
---|
191 | UINT16 FileCluster;
|
---|
192 | UINT32 FileSize;
|
---|
193 | } FAT_DIRECTORY_ENTRY;
|
---|
194 |
|
---|
195 | typedef struct {
|
---|
196 | UINT8 Ordinal;
|
---|
197 | CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned)
|
---|
198 | UINT8 Attributes;
|
---|
199 | UINT8 Type;
|
---|
200 | UINT8 Checksum;
|
---|
201 | CHAR16 Name2[6];
|
---|
202 | UINT16 MustBeZero;
|
---|
203 | CHAR16 Name3[2];
|
---|
204 | } FAT_DIRECTORY_LFN;
|
---|
205 |
|
---|
206 | #pragma pack()
|
---|
207 |
|
---|
208 | #endif
|
---|