3 Copyright (c) 2005, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials are licensed and made available
5 under the terms and conditions of the BSD License which accompanies this
6 distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 Definitions for on-disk FAT structures
25 #ifndef _FATFILESYSTEM_H_
26 #define _FATFILESYSTEM_H_
32 #define FAT_INFO_SIGNATURE 0x41615252
33 #define FAT_INFO_BEGIN_SIGNATURE 0x61417272
34 #define FAT_INFO_END_SIGNATURE 0xAA550000
38 #define FAT_CLUSTER_SPECIAL_EXT (-1 & (~0xF))
39 #define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07)
40 #define FAT_CLUSTER_FREE 0
41 #define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL)
42 #define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL)
43 #define FAT_CLUSTER_LAST (-1)
44 #define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))
45 #define FAT_MIN_CLUSTER 2
46 #define FAT_MAX_FAT12_CLUSTER 0xFF5
47 #define FAT_MAX_FAT16_CLUSTER 0xFFF5
48 #define FAT_CLUSTER_SPECIAL_FAT12 0xFF7
49 #define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7
50 #define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7
51 #define FAT_CLUSTER_MASK_FAT12 0xFFF
52 #define FAT_CLUSTER_UNMASK_FAT12 0xF000
53 #define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF
54 #define FAT_CLUSTER_UNMASK_FAT32 0xF0000000
55 #define FAT_POS_FAT12(a) ((a) * 3 / 2)
56 #define FAT_POS_FAT16(a) ((a) * 2)
57 #define FAT_POS_FAT32(a) ((a) * 4)
58 #define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0)
62 // FAT attribute define
64 #define FAT_ATTRIBUTE_READ_ONLY 0x01
65 #define FAT_ATTRIBUTE_HIDDEN 0x02
66 #define FAT_ATTRIBUTE_SYSTEM 0x04
67 #define FAT_ATTRIBUTE_VOLUME_ID 0x08
68 #define FAT_ATTRIBUTE_DIRECTORY 0x10
69 #define FAT_ATTRIBUTE_ARCHIVE 0x20
70 #define FAT_ATTRIBUTE_DEVICE 0x40
71 #define FAT_ATTRIBUTE_LFN 0x0F
73 // Some Long File Name definitions
75 #define FAT_LFN_LAST 0x40 // Ordinal field
76 #define MAX_LFN_ENTRIES 20
77 #define LFN_CHAR1_LEN 5
78 #define LFN_CHAR2_LEN 6
79 #define LFN_CHAR3_LEN 2
80 #define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN)
81 #define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL)
83 // Some 8.3 File Name definitions
85 #define FAT_MAIN_NAME_LEN 8
86 #define FAT_EXTEND_NAME_LEN 3
87 #define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN)
89 // Some directory entry information
91 #define FAT_ENTRY_INFO_OFFSET 13
92 #define DELETE_ENTRY_MARK 0xE5
93 #define EMPTY_ENTRY_MARK 0x00
98 #define FAT16_DIRTY_MASK 0x7fff
99 #define FAT32_DIRTY_MASK 0xf7ffffff
103 #define FAT_CASE_MIXED 0x01
104 #define FAT_CASE_NAME_LOWER 0x08
105 #define FAT_CASE_EXT_LOWER 0x10
111 UINT8 SectorsPerCluster
;
112 UINT16 ReservedSectors
;
114 UINT16 RootEntries
; // < FAT32, root dir is fixed size
117 UINT16 SectorsPerFat
; // < FAT32
118 UINT16 SectorsPerTrack
; // (ignored)
119 UINT16 Heads
; // (ignored)
120 UINT32 HiddenSectors
; // (ignored)
121 UINT32 LargeSectors
; // Used if Sectors==0
122 } FAT_BOOT_SECTOR_BASIC
;
125 UINT8 PhysicalDriveNumber
; // (ignored)
126 UINT8 CurrentHead
; // holds boot_sector_dirty bit
127 UINT8 Signature
; // (ignored)
131 } FAT_BOOT_SECTOR_EXT
;
134 UINT32 LargeSectorsPerFat
; // FAT32
135 UINT16 ExtendedFlags
; // FAT32 (ignored)
136 UINT16 FsVersion
; // FAT32 (ignored)
137 UINT32 RootDirFirstCluster
; // FAT32
138 UINT16 FsInfoSector
; // FAT32
139 UINT16 BackupBootSector
; // FAT32
140 UINT8 Reserved
[12]; // FAT32 (ignored)
141 UINT8 PhysicalDriveNumber
; // (ignored)
142 UINT8 CurrentHead
; // holds boot_sector_dirty bit
143 UINT8 Signature
; // (ignored)
147 } FAT32_BOOT_SECTOR_EXT
;
150 FAT_BOOT_SECTOR_BASIC FatBsb
;
152 FAT_BOOT_SECTOR_EXT FatBse
;
153 FAT32_BOOT_SECTOR_EXT Fat32Bse
;
158 // FAT Info Structure
167 UINT8 ExtraBootCode
[480];
168 UINT32 InfoBeginSignature
;
169 FAT_FREE_INFO FreeInfo
;
171 UINT32 InfoEndSignature
;
177 #define FAT_MAX_YEAR_FROM_1980 0x7f
181 UINT16 Year
: 7; // From 1980
185 UINT16 DoubleSecond
: 5;
196 CHAR8 FileName
[11]; // 8.3 filename
199 UINT8 CreateMillisecond
; // (creation milliseconds - ignored)
200 FAT_DATE_TIME FileCreateTime
;
201 FAT_DATE FileLastAccess
;
202 UINT16 FileClusterHigh
; // >= FAT32
203 FAT_DATE_TIME FileModificationTime
;
206 } FAT_DIRECTORY_ENTRY
;
210 CHAR8 Name1
[10]; // (Really 5 chars, but not WCHAR aligned)