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