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