#ifndef BPB_H #define BPB_H #include #include "sassert.h" #define DOS_BPB_OFFSET_ON_DISK 0x0B typedef _Packed struct DOS_BPB_DOS3 { /** Number of bytes per sector. */ uint16_t bytesPerSector; /** Number of sectors per cluster. Must be power of 2. */ uint8_t sectorsPerCluster; /** Number of reserved sectors. */ uint16_t reservedSectors; /** Number of FATs. */ uint8_t numberOfFATs; /** Maximum number of entries in the root directory. */ uint16_t rootDirEntries; /** Total number of sectors on the drive. If drive larger than 32MB, this field is zero, see numberOfSectorsLarge. */ uint16_t numberOfSectors; /** Media descriptor byte. */ uint8_t mediaType; /** Number of sectors used by a FAT. */ uint16_t sectorsPerFAT; /** Number of sectors per track. */ uint16_t sectorsPerTrack; /** Number of heads. */ uint16_t numberOfHeads; /** Number of hidden sectors on the drive, from the start of the drive. */ uint32_t hiddenSectors; /** Number of sectors, only used if drive > 32MB. */ uint32_t numberOfSectorsLarge; } DOS_BPB_DOS3; STATIC_ASSERT(sizeof(DOS_BPB_DOS3) == 25); typedef _Packed struct DOS_BPB_DOS4 { struct DOS_BPB_DOS3; uint8_t physicalDriveNumber; uint8_t flags; uint8_t extendedBootSignature; uint32_t volumeSerialNumber; char volumeLabel[11]; char fsType[8]; } DOS_BPB_DOS4; STATIC_ASSERT(sizeof(DOS_BPB_DOS4) == 25 + 26); typedef _Packed struct DOS_BPB_FAT32 { struct DOS_BPB_DOS3; uint32_t sectorPerFatLarge; uint16_t extendedFlags; uint16_t version; uint32_t rootDirCluster; uint16_t infoSector; uint16_t backupBootSector; char bootFileName[12]; uint8_t physicalDriveNumber; uint8_t flags; uint8_t extendedBootSignature; uint32_t volumeSerialNumber; char volumeLabel[11]; char fsType[8]; } DOS_BPB_FAT32; STATIC_ASSERT(sizeof(DOS_BPB_FAT32) == 25 + 54); /** Union of all BPB types. Default is DOS4 / FAT16. */ typedef union DOS_BPB { struct DOS_BPB_DOS3; struct DOS_BPB_DOS4 fat16; struct DOS_BPB_FAT32 fat32; } DOS_BPB; typedef enum DOS_BPB_MEDIA_TYPE { DOS_BPB_MEDIA_HDD = 0xF8 } DOS_BPB_MEDIA_TYPE; #endif // BPB_H