]> git.proxmox.com Git - mirror_edk2.git/blob - FatPkg/EnhancedFatDxe/FatFileSystem.h
BaseTools: Library hashing fix and optimization for --hash feature
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / FatFileSystem.h
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