#ifndef _FAT_H #define _FAT_H typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; /** * FAT12 and FAT16 bootsector */ typedef struct __FAT_BOOTSECTOR /* MUST be packed */ { uint8_t jump[3]; /* 16-bit JMP to boot code, or 8-bit JMP + NOP */ uint8_t oem_id[8]; /* e.g., 'MSWIN4.0' */ uint16_t bytes_per_sector; /* typically 512 */ uint8_t sectors_per_cluster; uint16_t num_boot_sectors; /* typically 1 */ uint8_t num_fats; /* typically 2 */ uint16_t num_root_dir_ents; uint16_t total_sectors; /* 16-bit; 0 if num sectors > 65535 */ uint8_t media_ID_byte; /* typically 0F0h */ uint16_t sectors_per_fat; uint16_t sectors_per_track; uint16_t heads; uint32_t hidden_sectors; /* LBA partition start */ uint32_t total_sectors_large; /* 32-bit; 0 if num sectors < 65536 */ uint8_t boot_code[474]; uint8_t magic[2]; /* 55h, 0AAh */ } FAT_BOOTSECTOR; /* 512 bytes total */ /** * FAT directory entries * * As far as I know, this should be valid for FAT12/16/32 * Entries are 32 bytes long */ typedef struct __FAT_DIRSTRUCT /* MUST be packed */ { uint8_t name[8]; /* all caps, pad right with spaces */ uint8_t ext[3]; /* all caps, pad right with spaces */ uint8_t attrib; /* attribute byte */ uint8_t reserved; /* 0 */ uint8_t ctime_ms; /* file creation time, 10ms units */ uint16_t ctime; /* file creation time, in DOS format */ uint16_t cdate; /* file creation date, in DOS format */ uint16_t adate; /* DOS date of last file access */ uint16_t st_clust_msw; /* high 16 bits of starting cluster (FAT32) */ uint16_t mtime; /* DOS time of last file modification */ uint16_t mdate; /* DOS date of last file modification */ uint16_t st_clust; /* starting cluster */ uint32_t file_size; /* in bytes */ } FAT_DIRSTRUCT; /* 32 bytes total */ /** * DOS time and date structs */ typedef struct __DOS_TIME /* MUST be packed */ { unsigned two_secs : 5; /* low 5 bits: 2-second increments */ unsigned minutes : 6; /* middle 6 bits: minutes */ unsigned hours : 5; /* high 5 bits: hours (0-23) */ } DOS_TIME; /* 2 bytes total */ typedef struct __DOS_DATE /* MUST be packed */ { unsigned date : 5; /* low 5 bits: date (1-31) */ unsigned month : 4; /* middle 4 bits: month (1-12) */ unsigned year : 7; /* high 7 bits: year - 1980 */ } DOS_DATE; /* 2 bytes total */ /** * DOS File attributes */ typedef struct __DOS_ATTRIB /* MUST be packed */ { int read_only : 1; /* b0 */ int hidden : 1; int system : 1; int volume_label : 1; int directory : 1; int reserved : 2; /* b6, b7 */ } DOS_ATTRIB; /* 1 byte total */ #endif /* ! _FAT_H */