| package fat32 |
| |
| const ( |
| // FAT32 entries are only 28 bits |
| fatMask = 0x0fffffff |
| // Free entries are 0 |
| fatFree = 0x0 |
| // Entry at the end of a cluster chain |
| fatEOF = 0x0ffffff8 |
| ) |
| |
| // FAT32 Boot Sector and BIOS Parameter Block. This structure is 512 bytes long, |
| // even if the logical block size is longer. The rest should be filled up with |
| // zeroes. |
| type bootSector struct { |
| // Jump instruction to boot code. |
| JmpInstruction [3]byte |
| // Creator name. "MSWIN4.1" recommended for compatibility. |
| OEMName [8]byte |
| // Count of bytes per block (i.e. logical block size) |
| // Must be one of 512, 1024, 2048 or 4096 |
| BlockSize uint16 |
| // Number of blocks per allocation unit (cluster). |
| // Must be a power of 2 that is greater than 0. |
| BlocksPerCluster uint8 |
| // Number of reserved blocks in the reserved region of the volume starting |
| // at the first block of the volume. This field must not be 0. |
| ReservedBlocks uint16 |
| // The count of FAT data structures on the volume. This field should always |
| // contain the value of 2 for any FAT volume of any type. |
| NumFATs uint8 |
| _ [4]byte |
| // Legacy value for media determination, must be 0xf8. |
| MediaCode uint8 |
| _ [2]byte |
| // Number of sectors per track for 0x13 interrupts. |
| SectorsPerTrack uint16 |
| // Number of heads for 0x13 interrupts. |
| NumHeads uint16 |
| // Count of hidden blocks preceding the partition that contains this FAT |
| // volume. |
| HiddenBlocks uint32 |
| // Total count of blocks on the volume. |
| TotalBlocks uint32 |
| // Count of blocks per FAT. |
| BlocksPerFAT uint32 |
| // Flags for FAT32 |
| Flags uint16 |
| _ [2]byte |
| // Cluster number of the first cluster of the root directory. Usually 2. |
| RootClusterNumber uint32 |
| // Block number of the FSINFO structure in the reserved area. |
| FSInfoBlock uint16 |
| // Block number of the copy of the boot record in the reserved area. |
| BackupStartBlock uint16 |
| _ [12]byte |
| // Drive number for 0x13 interrupts. |
| DriveNumber uint8 |
| _ [1]byte |
| BootSignature uint8 |
| // ID of this filesystem |
| ID uint32 |
| // Human-readable label of this filesystem, padded with spaces (0x20) |
| Label [11]byte |
| // Always set to ASCII "FAT32 " |
| Type [8]byte |
| _ [420]byte |
| // Always 0x55, 0xAA |
| Signature [2]byte |
| } |
| |
| // Special block (usually at block 1) containing additional metadata, |
| // specifically the number of free clusters and the next free cluster. |
| // Always 512 bytes, rest of the block should be padded with zeroes. |
| type fsinfo struct { |
| // Validates that this is an FSINFO block. Always 0x52, 0x52, 0x61, 0x41 |
| LeadSignature [4]byte |
| _ [480]byte |
| // Another signature. Always 0x72, 0x72, 0x41, 0x61 |
| StructSignature [4]byte |
| // Last known number of free clusters on the volume. |
| FreeCount uint32 |
| // Next free cluster hint. All 1's is interpreted as undefined. |
| NextFreeCluster uint32 |
| _ [14]byte |
| // One more signature. Always 0x55, 0xAA. |
| TrailingSignature [2]byte |
| } |
| |
| // Directory entry |
| type dirEntry struct { |
| // DOS 8.3 file name. |
| DOSName [11]byte |
| // Attribtes of the file or directory, 0x0f reserved to mark entry as a |
| // LFN entry (see lfnEntry below) |
| Attributes uint8 |
| _ byte |
| CreationTenMilli uint8 // Actually 10ms units, 0-199 range |
| CreationTime uint16 |
| CreationDate uint16 |
| _ [2]byte |
| FirstClusterHigh uint16 |
| LastWrittenToTime uint16 |
| LastWrittenToDate uint16 |
| FirstClusterLow uint16 |
| FileSize uint32 |
| } |
| |
| const ( |
| // lastSequenceNumberFlag is logically-ORed with the sequence number of the |
| // last Long File Name entry to mark it as such. |
| lastSequenceNumberFlag = 0x40 |
| // codepointsPerEntry is the number of UTF-16 codepoints that fit into a |
| // single Long File Name entry. |
| codepointsPerEntry = 5 + 6 + 2 |
| ) |
| |
| // VFAT long file name prepended entry |
| type lfnEntry struct { |
| SequenceNumber uint8 |
| // First 5 UTF-16 code units |
| NamePart1 [5]uint16 |
| // Attributes (must be 0x0f) |
| Attributes uint8 |
| _ byte |
| // Checksum of the 8.3 name. |
| Checksum uint8 |
| // Next 6 UTF-16 code units |
| NamePart2 [6]uint16 |
| _ [2]byte |
| // Next 2 UTF-16 code units |
| NamePart3 [2]uint16 |
| } |