mirror of
https://github.com/acidanthera/audk.git
synced 2025-08-19 08:38:10 +02:00
This reverts commit 58766a472932c485d41163b1746fb1d9e7984f07. In edk2 commit 58766a4, validation of the two reserved FAT entries was added. However, it also checked the return of FatGetFatEntry to MAX_UINT32, which is what FatGetFatEntry returns when it encounters an error, e.g. not being able to read the disk. However, MAX_UINT32 is also a valid value for the reserved FAT entries and under some conditions these will be returned in the success case. A FAT volume formatted with these valid values of the reserved FAT entries will fail to boot an OS because the opening of the volume will fail. However, the reason FatGetFatEntry returns MAX_UINT32 is that most other uses of the function are comparing it against the END_OF_CHAIN mark, which MAX_UINT32 will trip and those functions will fail out. Because this is a critical bug that can prevent OS booting and the bug the original commit was solving was accounting for a bad FAT filesystem formatting tool, this commit is reverted for now. Future work will clean up FatGetFatEntry so that it returns an EFI_STATUS, but that involves more work and this bug needs to be resolved in the meantime. Signed-off-by: Oliver Smith-Denny <osde@microsoft.com>
135 lines
3.8 KiB
C
135 lines
3.8 KiB
C
/** @file
|
|
FAT format data structures
|
|
|
|
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
|
|
|
|
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
|