/* * Copyright (c) 2008 Jakub Jermar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup liblabel * @{ */ #ifndef FAT_FAT_H_ #define FAT_FAT_H_ #include <stdint.h> #define BS_BLOCK 0 #define BS_SIZE 512 #define DIRENT_SIZE 32 #define FAT12_CLST_MAX 4085 #define FAT16_CLST_MAX 65525 #define FATAUTO 0 #define FAT12 12 #define FAT16 16 #define FAT32 32 #define FAT_CLUSTER_DOUBLE_SIZE(a) ((a) / 4) typedef struct fat_bs { /** Jump instruction */ uint8_t ji[3]; uint8_t oem_name[8]; /* BIOS Parameter Block */ /** Bytes per sector */ uint16_t bps; /** Sectors per cluster */ uint8_t spc; /** Reserved sector count */ uint16_t rscnt; /** Number of FATs */ uint8_t fatcnt; /** Maximum number of root directory entries */ uint16_t root_ent_max; /** Total sectors. 16-bit version */ uint16_t totsec16; /** Media descriptor */ uint8_t mdesc; /** Sectors per FAT12/FAT16 */ uint16_t sec_per_fat; /** Sectors per track */ uint16_t sec_per_track; /** Number of heads */ uint16_t headcnt; /** Hidden sectors */ uint32_t hidden_sec; /** Total sectors. 32-bit version */ uint32_t totsec32; union { struct { /* FAT12/FAT16 only: Extended BIOS Parameter Block */ /** Physical drive number. */ uint8_t pdn; uint8_t reserved; /** Extended boot signature. */ uint8_t ebs; /** Serial number. */ uint32_t id; /** Volume label. */ uint8_t label[11]; /** FAT type. */ uint8_t type[8]; /** Boot code. */ uint8_t boot_code[448]; /** Boot sector signature. */ uint16_t signature; } __attribute__((packed)); struct { /* FAT32 only */ /** Sectors per FAT. */ uint32_t sectors_per_fat; /** FAT flags. */ uint16_t flags; /** Version. */ uint16_t version; /** Cluster number of root directory. */ uint32_t root_cluster; /** Sector number of file system information sector. */ uint16_t fsinfo_sec; /** Sector number of boot sector copy. */ uint16_t bscopy_sec; uint8_t reserved1[12]; /** Physical drive number. */ uint8_t pdn; uint8_t reserved2; /** Extended boot signature. */ uint8_t ebs; /** Serial number. */ uint32_t id; /** Volume label. */ uint8_t label[11]; /** FAT type. */ uint8_t type[8]; /** Boot code. */ uint8_t boot_code[420]; /** Signature. */ uint16_t signature; } __attribute__((packed)) fat32; }; } __attribute__((packed)) fat_bs_t; #endif /** * @} */