struct SuperBlockCommon { uint8_t jmp[3]; uint8_t oemName[8]; uint16_t bytesPerSector; uint8_t sectorsPerCluster; uint16_t reservedSectors; uint8_t fatCount; uint16_t rootDirectoryEntries; uint16_t totalSectors; uint8_t mediaDescriptor; uint16_t sectorsPerFAT16; uint16_t sectorsPerTrack; uint16_t heads; uint32_t hiddenSectors; uint32_t largeSectorCount; } ES_STRUCT_PACKED; struct SuperBlock16 : SuperBlockCommon { uint8_t deviceID; uint8_t flags; uint8_t signature; uint32_t serial; uint8_t label[11]; uint64_t systemIdentifier; uint8_t _unused1[450]; } ES_STRUCT_PACKED; struct SuperBlock32 : SuperBlockCommon { uint32_t sectorsPerFAT32; uint16_t flags; uint16_t version; uint32_t rootDirectoryCluster; uint16_t fsInfoSector; uint16_t backupBootSector; uint8_t _unused0[12]; uint8_t deviceID; uint8_t flags2; uint8_t signature; uint32_t serial; uint8_t label[11]; uint64_t systemIdentifier; uint8_t _unused1[422]; } ES_STRUCT_PACKED; struct FATDirectoryEntry { uint8_t name[11]; uint8_t attributes; uint8_t _reserved0; uint8_t creationTimeSeconds; uint16_t creationTime; uint16_t creationDate; uint16_t accessedDate; uint16_t firstClusterHigh; uint16_t modificationTime; uint16_t modificationDate; uint16_t firstClusterLow; uint32_t fileSizeBytes; } ES_STRUCT_PACKED;