Files
BadBuilder/BadBuilder.Formatter/FAT32BootSector.cs
2025-03-17 03:11:11 -04:00

46 lines
2.0 KiB
C#

using System.Runtime.InteropServices;
namespace BadBuilder.Formatter
{
// Reference: https://cscie92.dce.harvard.edu/spring2024/K70F120M/bootSector.h
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 512)]
internal unsafe struct FAT32BootSector
{
[FieldOffset(0)] public fixed byte JumpCode[3];
[FieldOffset(3)] public fixed char OEMName[8];
[FieldOffset(11)] internal ushort BytesPerSector;
[FieldOffset(13)] internal byte SectorsPerCluster;
[FieldOffset(14)] internal ushort ReservedSectorCount;
[FieldOffset(16)] internal byte NumberOfFATs;
[FieldOffset(17)] internal ushort MaxRootEntries; // Unused in FAT32
[FieldOffset(19)] internal ushort TotalSectors16; // If 0, use TotalSectors
[FieldOffset(21)] internal byte MediaDescriptor;
[FieldOffset(22)] internal ushort SectorsPerFAT16; // Unused in FAT32
[FieldOffset(24)] internal ushort SectorsPerTrack;
[FieldOffset(26)] internal ushort NumberOfHeads;
[FieldOffset(28)] internal uint HiddenSectors;
[FieldOffset(32)] internal uint TotalSectors; // Total sectors (if TotalSectors16 is 0)
// FAT32-specific fields
[FieldOffset(36)] internal uint SectorsPerFAT;
[FieldOffset(40)] internal ushort FATFlags;
[FieldOffset(42)] internal ushort FileSystemVersion;
[FieldOffset(44)] internal uint RootCluster;
[FieldOffset(48)] internal ushort FSInfoSector;
[FieldOffset(50)] internal ushort BackupBootSector;
[FieldOffset(52)] public fixed byte Reserved[12];
[FieldOffset(64)] public byte DriveNumber;
[FieldOffset(65)] public byte Reserved1;
[FieldOffset(66)] public byte BootSignature;
[FieldOffset(67)] public uint VolumeID;
[FieldOffset(71)] public fixed char VolumeLabel[11];
[FieldOffset(82)] public fixed char FileSystemType[8];
[FieldOffset(90)] public fixed byte Reserved2[420];
[FieldOffset(510)] internal ushort Signature;
}
}