1 /** @file 2 FAT format data structures 3 4 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR> 5 6 This program and the accompanying materials are licensed and made available 7 under the terms and conditions of the BSD License which accompanies this 8 distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #ifndef _FAT_FMT_H_ 17 #define _FAT_FMT_H_ 18 19 // 20 // Definitions 21 // 22 #define FAT_ATTR_READ_ONLY 0x01 23 #define FAT_ATTR_HIDDEN 0x02 24 #define FAT_ATTR_SYSTEM 0x04 25 #define FAT_ATTR_VOLUME_ID 0x08 26 #define FAT_ATTR_DIRECTORY 0x10 27 #define FAT_ATTR_ARCHIVE 0x20 28 #define FAT_ATTR_LFN (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID) 29 30 #define FAT_CLUSTER_SPECIAL ((-1 &~0xF) | 0x7) 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 36 #define DELETE_ENTRY_MARK 0xE5 37 #define EMPTY_ENTRY_MARK 0x00 38 39 #define FAT_CLUSTER_FUNCTIONAL(Cluster) (((Cluster) == 0) || ((Cluster) >= FAT_CLUSTER_SPECIAL)) 40 #define FAT_CLUSTER_END_OF_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL)) 41 42 // 43 // Directory Entry 44 // 45 #pragma pack(1) 46 47 typedef struct { 48 UINT16 Day : 5; 49 UINT16 Month : 4; 50 UINT16 Year : 7; // From 1980 51 } FAT_DATE; 52 53 typedef struct { 54 UINT16 DoubleSecond : 5; 55 UINT16 Minute : 6; 56 UINT16 Hour : 5; 57 } FAT_TIME; 58 59 typedef struct { 60 FAT_TIME Time; 61 FAT_DATE Date; 62 } FAT_DATE_TIME; 63 64 typedef struct { 65 CHAR8 FileName[11]; // 8.3 filename 66 UINT8 Attributes; 67 UINT8 CaseFlag; 68 UINT8 CreateMillisecond; // (creation milliseconds - ignored) 69 FAT_DATE_TIME FileCreateTime; 70 FAT_DATE FileLastAccess; 71 UINT16 FileClusterHigh; // >= FAT32 72 FAT_DATE_TIME FileModificationTime; 73 UINT16 FileCluster; 74 UINT32 FileSize; 75 } FAT_DIRECTORY_ENTRY; 76 77 #pragma pack() 78 // 79 // Boot Sector 80 // 81 #pragma pack(1) 82 83 typedef struct { 84 85 UINT8 Ia32Jump[3]; 86 CHAR8 OemId[8]; 87 88 UINT16 SectorSize; 89 UINT8 SectorsPerCluster; 90 UINT16 ReservedSectors; 91 UINT8 NoFats; 92 UINT16 RootEntries; // < FAT32, root dir is fixed size 93 UINT16 Sectors; 94 UINT8 Media; // (ignored) 95 UINT16 SectorsPerFat; // < FAT32 96 UINT16 SectorsPerTrack; // (ignored) 97 UINT16 Heads; // (ignored) 98 UINT32 HiddenSectors; // (ignored) 99 UINT32 LargeSectors; // => FAT32 100 UINT8 PhysicalDriveNumber; // (ignored) 101 UINT8 CurrentHead; // holds boot_sector_dirty bit 102 UINT8 Signature; // (ignored) 103 CHAR8 Id[4]; 104 CHAR8 FatLabel[11]; 105 CHAR8 SystemId[8]; 106 107 } PEI_FAT_BOOT_SECTOR; 108 109 typedef struct { 110 111 UINT8 Ia32Jump[3]; 112 CHAR8 OemId[8]; 113 114 UINT16 SectorSize; 115 UINT8 SectorsPerCluster; 116 UINT16 ReservedSectors; 117 UINT8 NoFats; 118 UINT16 RootEntries; // < FAT32, root dir is fixed size 119 UINT16 Sectors; 120 UINT8 Media; // (ignored) 121 UINT16 SectorsPerFat; // < FAT32 122 UINT16 SectorsPerTrack; // (ignored) 123 UINT16 Heads; // (ignored) 124 UINT32 HiddenSectors; // (ignored) 125 UINT32 LargeSectors; // Used if Sectors==0 126 UINT32 LargeSectorsPerFat; // FAT32 127 UINT16 ExtendedFlags; // FAT32 (ignored) 128 UINT16 FsVersion; // FAT32 (ignored) 129 UINT32 RootDirFirstCluster; // FAT32 130 UINT16 FsInfoSector; // FAT32 131 UINT16 BackupBootSector; // FAT32 132 UINT8 Reserved[12]; // FAT32 (ignored) 133 UINT8 PhysicalDriveNumber; // (ignored) 134 UINT8 CurrentHead; // holds boot_sector_dirty bit 135 UINT8 Signature; // (ignored) 136 CHAR8 Id[4]; 137 CHAR8 FatLabel[11]; 138 CHAR8 SystemId[8]; 139 140 } PEI_FAT_BOOT_SECTOR_EX; 141 142 #pragma pack() 143 144 #endif 145