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 215