/** @file | |
Definitions for on-disk FAT structures. | |
Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _FATFILESYSTEM_H_ | |
#define _FATFILESYSTEM_H_ | |
#pragma pack(1) | |
// | |
// FAT info signature | |
// | |
#define FAT_INFO_SIGNATURE 0x41615252 | |
#define FAT_INFO_BEGIN_SIGNATURE 0x61417272 | |
#define FAT_INFO_END_SIGNATURE 0xAA550000 | |
// | |
// FAT entry values | |
// | |
#define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF)) | |
#define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07) | |
#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 FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL)) | |
#define FAT_MIN_CLUSTER 2 | |
#define FAT_MAX_FAT12_CLUSTER 0xFF5 | |
#define FAT_MAX_FAT16_CLUSTER 0xFFF5 | |
#define FAT_CLUSTER_SPECIAL_FAT12 0xFF7 | |
#define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7 | |
#define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7 | |
#define FAT_CLUSTER_MASK_FAT12 0xFFF | |
#define FAT_CLUSTER_UNMASK_FAT12 0xF000 | |
#define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF | |
#define FAT_CLUSTER_UNMASK_FAT32 0xF0000000 | |
#define FAT_POS_FAT12(a) ((a) * 3 / 2) | |
#define FAT_POS_FAT16(a) ((a) * 2) | |
#define FAT_POS_FAT32(a) ((a) * 4) | |
#define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0) | |
// | |
// FAT attribute define | |
// | |
#define FAT_ATTRIBUTE_READ_ONLY 0x01 | |
#define FAT_ATTRIBUTE_HIDDEN 0x02 | |
#define FAT_ATTRIBUTE_SYSTEM 0x04 | |
#define FAT_ATTRIBUTE_VOLUME_ID 0x08 | |
#define FAT_ATTRIBUTE_DIRECTORY 0x10 | |
#define FAT_ATTRIBUTE_ARCHIVE 0x20 | |
#define FAT_ATTRIBUTE_DEVICE 0x40 | |
#define FAT_ATTRIBUTE_LFN 0x0F | |
// | |
// Some Long File Name definitions | |
// | |
#define FAT_LFN_LAST 0x40 // Ordinal field | |
#define MAX_LFN_ENTRIES 20 | |
#define LFN_CHAR1_LEN 5 | |
#define LFN_CHAR2_LEN 6 | |
#define LFN_CHAR3_LEN 2 | |
#define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN) | |
#define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL) | |
// | |
// Some 8.3 File Name definitions | |
// | |
#define FAT_MAIN_NAME_LEN 8 | |
#define FAT_EXTEND_NAME_LEN 3 | |
#define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN) | |
// | |
// Some directory entry information | |
// | |
#define FAT_ENTRY_INFO_OFFSET 13 | |
#define DELETE_ENTRY_MARK 0xE5 | |
#define EMPTY_ENTRY_MARK 0x00 | |
// | |
// Volume dirty Mask | |
// | |
#define FAT16_DIRTY_MASK 0x7fff | |
#define FAT32_DIRTY_MASK 0xf7ffffff | |
// | |
// internal flag | |
// | |
#define FAT_CASE_MIXED 0x01 | |
#define FAT_CASE_NAME_LOWER 0x08 | |
#define FAT_CASE_EXT_LOWER 0x10 | |
typedef struct { | |
UINT8 Ia32Jump[3]; | |
CHAR8 OemId[8]; | |
UINT16 SectorSize; | |
UINT8 SectorsPerCluster; | |
UINT16 ReservedSectors; | |
UINT8 NumFats; | |
UINT16 RootEntries; // < FAT32, root dir is fixed size | |
UINT16 Sectors; | |
UINT8 Media; | |
UINT16 SectorsPerFat; // < FAT32 | |
UINT16 SectorsPerTrack; // (ignored) | |
UINT16 Heads; // (ignored) | |
UINT32 HiddenSectors; // (ignored) | |
UINT32 LargeSectors; // Used if Sectors==0 | |
} FAT_BOOT_SECTOR_BASIC; | |
typedef struct { | |
UINT8 PhysicalDriveNumber; // (ignored) | |
UINT8 CurrentHead; // holds boot_sector_dirty bit | |
UINT8 Signature; // (ignored) | |
CHAR8 Id[4]; | |
CHAR8 FatLabel[11]; | |
CHAR8 SystemId[8]; | |
} FAT_BOOT_SECTOR_EXT; | |
typedef struct { | |
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]; | |
} FAT32_BOOT_SECTOR_EXT; | |
typedef union { | |
FAT_BOOT_SECTOR_EXT FatBse; | |
FAT32_BOOT_SECTOR_EXT Fat32Bse; | |
} FAT_BSE; | |
typedef struct { | |
FAT_BOOT_SECTOR_BASIC FatBsb; | |
FAT_BSE FatBse; | |
} FAT_BOOT_SECTOR; | |
// | |
// FAT Info Structure | |
// | |
typedef struct { | |
UINT32 ClusterCount; | |
UINT32 NextCluster; | |
} FAT_FREE_INFO; | |
typedef struct { | |
UINT32 Signature; | |
UINT8 ExtraBootCode[480]; | |
UINT32 InfoBeginSignature; | |
FAT_FREE_INFO FreeInfo; | |
UINT8 Reserved[12]; | |
UINT32 InfoEndSignature; | |
} FAT_INFO_SECTOR; | |
// | |
// Directory Entry | |
// | |
#define FAT_MAX_YEAR_FROM_1980 0x7f | |
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; | |
typedef struct { | |
UINT8 Ordinal; | |
CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned) | |
UINT8 Attributes; | |
UINT8 Type; | |
UINT8 Checksum; | |
CHAR16 Name2[6]; | |
UINT16 MustBeZero; | |
CHAR16 Name3[2]; | |
} FAT_DIRECTORY_LFN; | |
#pragma pack() | |
#endif |