[e16e8f2] | 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 */ |
---|