// FAT on-disk layout definitions shared by the FAT driver. #pragma once #include #pragma pack(push, 1) typedef struct { uint8_t Jump[3]; char OemId[8]; uint16_t BytesPerSector; uint8_t SectorsPerCluster; uint16_t ReservedSectors; uint8_t NumFats; uint16_t RootEntryCount; uint16_t TotalSectors16; uint8_t MediaType; uint16_t FatSize16; uint16_t SectorsPerTrack; uint16_t NumHeads; uint32_t HiddenSectors; uint32_t TotalSectors32; uint32_t FatSize32; uint16_t ExtFlags; uint16_t FsVersion; uint32_t RootCluster; uint16_t FsInfoSector; uint16_t BackupBootSector; uint8_t Reserved[12]; uint8_t DriveNumber; uint8_t Reserved1; uint8_t BootSignature; uint32_t VolumeId; char VolumeLabel[11]; char FsType[8]; } BPB; typedef struct { char Name[8]; char Ext[3]; uint8_t Attr; uint8_t Reserved; uint8_t CrtTimeTenth; uint16_t CrtTime; uint16_t CrtDate; uint16_t LastAccDate; uint16_t FirstClusterHi; uint16_t WrtTime; uint16_t WrtDate; uint16_t FirstClusterLo; uint32_t FileSize; } DIRENT; typedef struct { uint8_t Order; uint16_t Name1[5]; uint8_t Attr; uint8_t Type; uint8_t Checksum; uint16_t Name2[6]; uint16_t FirstCluster; uint16_t Name3[2]; } LFN_ENTRY; #pragma pack(pop) #define ATTR_VOLUME_ID 0x08 #define ATTR_DIRECTORY 0x10 #define ATTR_ARCHIVE 0x20 #define ATTR_LFN 0x0F #define FAT_NTRES_BASE_LOWER 0x08u #define FAT_NTRES_EXT_LOWER 0x10u #define FAT_FREE 0x00000000u #define FAT16_EOC 0x0000FFF8u #define FAT16_EOC_MARK 0x0000FFFFu #define FAT32_EOC 0x0FFFFFF8u #define FAT32_EOC_MARK 0x0FFFFFFFu #define FAT_FIXED_ROOT_CLUSTER 0xFFFFFFFEu typedef enum FAT_VARIANT { FatVariantUnsupported = 0, FatVariant12, FatVariant16, FatVariant32, } FAT_VARIANT;