/** @file FAT format data structures Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _FAT_FMT_H_ #define _FAT_FMT_H_ // // Definitions // #define FAT_ATTR_READ_ONLY 0x01 #define FAT_ATTR_HIDDEN 0x02 #define FAT_ATTR_SYSTEM 0x04 #define FAT_ATTR_VOLUME_ID 0x08 #define FAT_ATTR_DIRECTORY 0x10 #define FAT_ATTR_ARCHIVE 0x20 #define FAT_ATTR_LFN (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID) #define FAT_CLUSTER_SPECIAL ((MAX_UINT32 &~0xF) | 0x7) #define FAT_CLUSTER_FREE 0 #define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL) #define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL) #define FAT_CLUSTER_LAST (-1) #define DELETE_ENTRY_MARK 0xE5 #define EMPTY_ENTRY_MARK 0x00 #define FAT_CLUSTER_FUNCTIONAL(Cluster) (((Cluster) == 0) || ((Cluster) >= FAT_CLUSTER_SPECIAL)) #define FAT_CLUSTER_END_OF_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL)) // // Directory Entry // #pragma pack(1) typedef struct { UINT16 Day : 5; UINT16 Month : 4; UINT16 Year : 7; // From 1980 } FAT_DATE; typedef struct { UINT16 DoubleSecond : 5; UINT16 Minute : 6; UINT16 Hour : 5; } FAT_TIME; typedef struct { FAT_TIME Time; FAT_DATE Date; } FAT_DATE_TIME; typedef struct { CHAR8 FileName[11]; // 8.3 filename UINT8 Attributes; UINT8 CaseFlag; UINT8 CreateMillisecond; // (creation milliseconds - ignored) FAT_DATE_TIME FileCreateTime; FAT_DATE FileLastAccess; UINT16 FileClusterHigh; // >= FAT32 FAT_DATE_TIME FileModificationTime; UINT16 FileCluster; UINT32 FileSize; } FAT_DIRECTORY_ENTRY; #pragma pack() // // Boot Sector // #pragma pack(1) typedef struct { UINT8 Ia32Jump[3]; CHAR8 OemId[8]; UINT16 SectorSize; UINT8 SectorsPerCluster; UINT16 ReservedSectors; UINT8 NoFats; UINT16 RootEntries; // < FAT32, root dir is fixed size UINT16 Sectors; UINT8 Media; // (ignored) UINT16 SectorsPerFat; // < FAT32 UINT16 SectorsPerTrack; // (ignored) UINT16 Heads; // (ignored) UINT32 HiddenSectors; // (ignored) UINT32 LargeSectors; // => FAT32 UINT8 PhysicalDriveNumber; // (ignored) UINT8 CurrentHead; // holds boot_sector_dirty bit UINT8 Signature; // (ignored) CHAR8 Id[4]; CHAR8 FatLabel[11]; CHAR8 SystemId[8]; } PEI_FAT_BOOT_SECTOR; typedef struct { UINT8 Ia32Jump[3]; CHAR8 OemId[8]; UINT16 SectorSize; UINT8 SectorsPerCluster; UINT16 ReservedSectors; UINT8 NoFats; UINT16 RootEntries; // < FAT32, root dir is fixed size UINT16 Sectors; UINT8 Media; // (ignored) UINT16 SectorsPerFat; // < FAT32 UINT16 SectorsPerTrack; // (ignored) UINT16 Heads; // (ignored) UINT32 HiddenSectors; // (ignored) UINT32 LargeSectors; // Used if Sectors==0 UINT32 LargeSectorsPerFat; // FAT32 UINT16 ExtendedFlags; // FAT32 (ignored) UINT16 FsVersion; // FAT32 (ignored) UINT32 RootDirFirstCluster; // FAT32 UINT16 FsInfoSector; // FAT32 UINT16 BackupBootSector; // FAT32 UINT8 Reserved[12]; // FAT32 (ignored) UINT8 PhysicalDriveNumber; // (ignored) UINT8 CurrentHead; // holds boot_sector_dirty bit UINT8 Signature; // (ignored) CHAR8 Id[4]; CHAR8 FatLabel[11]; CHAR8 SystemId[8]; } PEI_FAT_BOOT_SECTOR_EX; #pragma pack() #endif