1 /* ----------------------------------------------------------------------- * 2 * 3 * Copyright 2001-2008 H. Peter Anvin - All Rights Reserved 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 8 * Boston MA 02111-1307, USA; either version 2 of the License, or 9 * (at your option) any later version; incorporated herein by reference. 10 * 11 * ----------------------------------------------------------------------- */ 12 13 /* 14 * fat.h 15 * 16 * Basic data structures for a FAT filesystem 17 */ 18 19 #ifndef FAT_H 20 #define FAT_H 21 22 #include "ulint.h" 23 24 /* The poor excuse FAT has for a superblock -- in the boot sector */ 25 struct fat_bootsect { 26 le8_t bsJump[3]; /* Jump to code */ 27 char bsOemName[8]; /* Formatting program */ 28 le16_t bsBytesPerSec; /* Bytes/sector */ 29 le8_t bsSecPerClust; /* Sectors/cluster */ 30 le16_t bsResSectors; /* Reserved sectors */ 31 le8_t bsFATs; /* Number of FATs */ 32 le16_t bsRootDirEnts; /* Number of entries/root directory */ 33 le16_t bsSectors; /* Number of sectors [1] */ 34 le8_t bsMedia; /* Magic media type byte */ 35 le16_t bsFATsecs; /* Sectors/FAT */ 36 le16_t bsSecPerTrack; /* Sectors/track */ 37 le16_t bsHeads; /* Number of heads */ 38 le32_t bsHiddenSecs; /* Number of hidden sectors */ 39 le32_t bsHugeSectors; /* Number of sectors [2] */ 40 union { 41 /* FAT12/16 */ 42 struct { 43 le8_t bsDriveNumber; /* Drive number */ 44 le8_t bsReserved1; /* Reserved */ 45 le8_t bsBootSignature; /* 0x29 */ 46 le32_t bsVolumeID; /* Volume serial number */ 47 char bsVolumeLabel[11]; /* Volume name */ 48 char bsFileSysType[8]; /* File system type */ 49 50 le8_t bsCode[448]; /* Boot sector code */ 51 } fat16; 52 53 /* FAT32 */ 54 struct { 55 le32_t bpb_fatsz32; /* Sectors/FAT */ 56 le16_t bpb_extflags; /* Extended flags */ 57 le16_t bpb_fsver; /* Filesystem version */ 58 le32_t bpb_rootclus; /* Root directory cluster */ 59 le16_t bpb_fsinfo; /* FSINFO sector number */ 60 le16_t bpb_bkbootsec; /* Backup boot sector (superblock) */ 61 char bpb_reserved[12]; 62 63 /* Same shit, different offset! */ 64 le8_t bsDriveNumber; /* Drive number */ 65 le8_t bsReserved1; /* Reserved */ 66 le8_t bsBootSignature; /* 0x29 */ 67 le32_t bsVolumeID; /* Volume serial number */ 68 char bsVolumeLabel[11]; /* Volume name */ 69 char bsFileSysType[8]; /* File system type */ 70 71 le8_t bsCode[420]; /* Boot sector code */ 72 } fat32; 73 } u; 74 75 le16_t bsSignature; /* 0xAA55 */ 76 }; 77 78 #define BS_BOOTSIGNATURE 0x29 79 #define BS_SIGNATURE 0xAA55 80 81 /* A FAT filesystem directory entry */ 82 83 struct fat_dirent { 84 le8_t name[11]; /* Mangled filename */ 85 le8_t attribute; /* File type/attribute */ 86 le8_t caseflags; /* VFAT: case for basis and extension */ 87 le8_t ctime_ms; /* ms of creation time */ 88 le32_t ctime; /* Creation time */ 89 le16_t atime; /* Date portion (high 16 bits) of atime */ 90 le16_t clusthi; /* FAT32: high 16 bits of cluster */ 91 le32_t mtime; /* Modification time */ 92 le16_t clustlo; /* First cluster pointer */ 93 le32_t size; /* File size (bytes) */ 94 }; 95 96 /* A VFAT filesystem continuation entry */ 97 struct fat_vfat_slot { 98 le8_t id; /* Sequence number for slot */ 99 le16_t name0[5]; /* 5 characters */ 100 le8_t attribute; /* Attribute byte */ 101 le8_t reserved; /* Reserved, MBZ */ 102 le8_t alias_csum; /* Short name checksum */ 103 le16_t name5[6]; /* 6 characters */ 104 le16_t firstclust; /* MBZ */ 105 le16_t name11[2]; /* 2 characters */ 106 }; 107 108 #endif /* FAT_H */ 109