|  | 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 | 
|  | } |