]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/FatFileSystem.h
BaseTools: Library hashing fix and optimization for --hash feature
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / FatFileSystem.h
CommitLineData
cae7420b
DB
1/** @file\r
2 Definitions for on-disk FAT structures.\r
b9ec9330 3\r
4c5ee6a6 4Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>\r
eb6cb4ce 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
b9ec9330
QH
6\r
7\r
cae7420b 8**/\r
b9ec9330
QH
9\r
10#ifndef _FATFILESYSTEM_H_\r
11#define _FATFILESYSTEM_H_\r
12\r
13#pragma pack(1)\r
14//\r
15// FAT info signature\r
16//\r
17#define FAT_INFO_SIGNATURE 0x41615252\r
18#define FAT_INFO_BEGIN_SIGNATURE 0x61417272\r
19#define FAT_INFO_END_SIGNATURE 0xAA550000\r
20//\r
21// FAT entry values\r
22//\r
4c5ee6a6 23#define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF))\r
b9ec9330
QH
24#define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07)\r
25#define FAT_CLUSTER_FREE 0\r
26#define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL)\r
27#define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL)\r
28#define FAT_CLUSTER_LAST (-1)\r
29#define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))\r
30#define FAT_MIN_CLUSTER 2\r
31#define FAT_MAX_FAT12_CLUSTER 0xFF5\r
32#define FAT_MAX_FAT16_CLUSTER 0xFFF5\r
33#define FAT_CLUSTER_SPECIAL_FAT12 0xFF7\r
34#define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7\r
35#define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7\r
36#define FAT_CLUSTER_MASK_FAT12 0xFFF\r
37#define FAT_CLUSTER_UNMASK_FAT12 0xF000\r
38#define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF\r
39#define FAT_CLUSTER_UNMASK_FAT32 0xF0000000\r
40#define FAT_POS_FAT12(a) ((a) * 3 / 2)\r
41#define FAT_POS_FAT16(a) ((a) * 2)\r
42#define FAT_POS_FAT32(a) ((a) * 4)\r
43#define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0)\r
44\r
45\r
46//\r
47// FAT attribute define\r
48//\r
49#define FAT_ATTRIBUTE_READ_ONLY 0x01\r
50#define FAT_ATTRIBUTE_HIDDEN 0x02\r
51#define FAT_ATTRIBUTE_SYSTEM 0x04\r
52#define FAT_ATTRIBUTE_VOLUME_ID 0x08\r
53#define FAT_ATTRIBUTE_DIRECTORY 0x10\r
54#define FAT_ATTRIBUTE_ARCHIVE 0x20\r
55#define FAT_ATTRIBUTE_DEVICE 0x40\r
56#define FAT_ATTRIBUTE_LFN 0x0F\r
57//\r
58// Some Long File Name definitions\r
59//\r
60#define FAT_LFN_LAST 0x40 // Ordinal field\r
61#define MAX_LFN_ENTRIES 20\r
62#define LFN_CHAR1_LEN 5\r
63#define LFN_CHAR2_LEN 6\r
64#define LFN_CHAR3_LEN 2\r
65#define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN)\r
66#define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL)\r
67//\r
68// Some 8.3 File Name definitions\r
69//\r
70#define FAT_MAIN_NAME_LEN 8\r
71#define FAT_EXTEND_NAME_LEN 3\r
72#define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN)\r
73//\r
74// Some directory entry information\r
75//\r
76#define FAT_ENTRY_INFO_OFFSET 13\r
77#define DELETE_ENTRY_MARK 0xE5\r
78#define EMPTY_ENTRY_MARK 0x00\r
79\r
80//\r
81// Volume dirty Mask\r
82//\r
83#define FAT16_DIRTY_MASK 0x7fff\r
84#define FAT32_DIRTY_MASK 0xf7ffffff\r
85//\r
86// internal flag\r
87//\r
88#define FAT_CASE_MIXED 0x01\r
89#define FAT_CASE_NAME_LOWER 0x08\r
90#define FAT_CASE_EXT_LOWER 0x10\r
91\r
92typedef struct {\r
93 UINT8 Ia32Jump[3];\r
94 CHAR8 OemId[8];\r
95 UINT16 SectorSize;\r
96 UINT8 SectorsPerCluster;\r
97 UINT16 ReservedSectors;\r
98 UINT8 NumFats;\r
99 UINT16 RootEntries; // < FAT32, root dir is fixed size\r
100 UINT16 Sectors;\r
101 UINT8 Media;\r
102 UINT16 SectorsPerFat; // < FAT32\r
103 UINT16 SectorsPerTrack; // (ignored)\r
104 UINT16 Heads; // (ignored)\r
105 UINT32 HiddenSectors; // (ignored)\r
106 UINT32 LargeSectors; // Used if Sectors==0\r
107} FAT_BOOT_SECTOR_BASIC;\r
108\r
109typedef struct {\r
110 UINT8 PhysicalDriveNumber; // (ignored)\r
111 UINT8 CurrentHead; // holds boot_sector_dirty bit\r
112 UINT8 Signature; // (ignored)\r
113 CHAR8 Id[4];\r
114 CHAR8 FatLabel[11];\r
115 CHAR8 SystemId[8];\r
116} FAT_BOOT_SECTOR_EXT;\r
117\r
118typedef struct {\r
119 UINT32 LargeSectorsPerFat; // FAT32\r
120 UINT16 ExtendedFlags; // FAT32 (ignored)\r
121 UINT16 FsVersion; // FAT32 (ignored)\r
122 UINT32 RootDirFirstCluster; // FAT32\r
123 UINT16 FsInfoSector; // FAT32\r
124 UINT16 BackupBootSector; // FAT32\r
125 UINT8 Reserved[12]; // FAT32 (ignored)\r
126 UINT8 PhysicalDriveNumber; // (ignored)\r
127 UINT8 CurrentHead; // holds boot_sector_dirty bit\r
128 UINT8 Signature; // (ignored)\r
129 CHAR8 Id[4];\r
130 CHAR8 FatLabel[11];\r
131 CHAR8 SystemId[8];\r
132} FAT32_BOOT_SECTOR_EXT;\r
133\r
6b7e4498 134typedef union {\r
b9ec9330
QH
135 FAT_BOOT_SECTOR_EXT FatBse;\r
136 FAT32_BOOT_SECTOR_EXT Fat32Bse;\r
6b7e4498
DB
137 } FAT_BSE;\r
138\r
139typedef struct {\r
140 FAT_BOOT_SECTOR_BASIC FatBsb;\r
141 FAT_BSE FatBse;\r
b9ec9330
QH
142} FAT_BOOT_SECTOR;\r
143\r
144//\r
145// FAT Info Structure\r
146//\r
147typedef struct {\r
148 UINT32 ClusterCount;\r
149 UINT32 NextCluster;\r
150} FAT_FREE_INFO;\r
151\r
152typedef struct {\r
153 UINT32 Signature;\r
154 UINT8 ExtraBootCode[480];\r
155 UINT32 InfoBeginSignature;\r
156 FAT_FREE_INFO FreeInfo;\r
157 UINT8 Reserved[12];\r
158 UINT32 InfoEndSignature;\r
159} FAT_INFO_SECTOR;\r
160\r
161//\r
162// Directory Entry\r
163//\r
164#define FAT_MAX_YEAR_FROM_1980 0x7f\r
165typedef struct {\r
166 UINT16 Day : 5;\r
167 UINT16 Month : 4;\r
168 UINT16 Year : 7; // From 1980\r
169} FAT_DATE;\r
170\r
171typedef struct {\r
172 UINT16 DoubleSecond : 5;\r
173 UINT16 Minute : 6;\r
174 UINT16 Hour : 5;\r
175} FAT_TIME;\r
176\r
177typedef struct {\r
178 FAT_TIME Time;\r
179 FAT_DATE Date;\r
180} FAT_DATE_TIME;\r
181\r
182typedef struct {\r
183 CHAR8 FileName[11]; // 8.3 filename\r
184 UINT8 Attributes;\r
185 UINT8 CaseFlag;\r
186 UINT8 CreateMillisecond; // (creation milliseconds - ignored)\r
187 FAT_DATE_TIME FileCreateTime;\r
188 FAT_DATE FileLastAccess;\r
189 UINT16 FileClusterHigh; // >= FAT32\r
190 FAT_DATE_TIME FileModificationTime;\r
191 UINT16 FileCluster;\r
192 UINT32 FileSize;\r
193} FAT_DIRECTORY_ENTRY;\r
194\r
195typedef struct {\r
196 UINT8 Ordinal;\r
197 CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned)\r
198 UINT8 Attributes;\r
199 UINT8 Type;\r
200 UINT8 Checksum;\r
201 CHAR16 Name2[6];\r
202 UINT16 MustBeZero;\r
203 CHAR16 Name3[2];\r
204} FAT_DIRECTORY_LFN;\r
205\r
206#pragma pack()\r
207\r
208#endif\r