1 /* $FreeBSD$ */ 2 /* $NetBSD: bpb.h,v 1.7 1997/11/17 15:36:24 ws Exp $ */ 3 4 /*- 5 * Written by Paul Popelka (paulp@uts.amdahl.com) 6 * 7 * You can do anything you want with this software, just don't say you wrote 8 * it, and don't remove this notice. 9 * 10 * This software is provided "as is". 11 * 12 * The author supplies this software to be publicly redistributed on the 13 * understanding that the author is not responsible for the correct 14 * functioning of this software in any circumstances and is not liable for 15 * any damages caused by this software. 16 * 17 * October 1992 18 */ 19 20 #ifndef _FS_MSDOSFS_BPB_H_ 21 #define _FS_MSDOSFS_BPB_H_ 22 23 /* 24 * BIOS Parameter Block (BPB) for DOS 3.3 25 */ 26 struct bpb33 { 27 uint16_t bpbBytesPerSec; /* bytes per sector */ 28 uint8_t bpbSecPerClust; /* sectors per cluster */ 29 uint16_t bpbResSectors; /* number of reserved sectors */ 30 uint8_t bpbFATs; /* number of FATs */ 31 uint16_t bpbRootDirEnts; /* number of root directory entries */ 32 uint16_t bpbSectors; /* total number of sectors */ 33 uint8_t bpbMedia; /* media descriptor */ 34 uint16_t bpbFATsecs; /* number of sectors per FAT */ 35 uint16_t bpbSecPerTrack; /* sectors per track */ 36 uint16_t bpbHeads; /* number of heads */ 37 uint16_t bpbHiddenSecs; /* number of hidden sectors */ 38 }; 39 40 /* 41 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, 42 * and bpbHugeSectors is not in the 3.3 bpb. 43 */ 44 struct bpb50 { 45 uint16_t bpbBytesPerSec; /* bytes per sector */ 46 uint8_t bpbSecPerClust; /* sectors per cluster */ 47 uint16_t bpbResSectors; /* number of reserved sectors */ 48 uint8_t bpbFATs; /* number of FATs */ 49 uint16_t bpbRootDirEnts; /* number of root directory entries */ 50 uint16_t bpbSectors; /* total number of sectors */ 51 uint8_t bpbMedia; /* media descriptor */ 52 uint16_t bpbFATsecs; /* number of sectors per FAT */ 53 uint16_t bpbSecPerTrack; /* sectors per track */ 54 uint16_t bpbHeads; /* number of heads */ 55 uint32_t bpbHiddenSecs; /* # of hidden sectors */ 56 uint32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ 57 }; 58 59 /* 60 * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. 61 */ 62 struct bpb710 { 63 uint16_t bpbBytesPerSec; /* bytes per sector */ 64 uint8_t bpbSecPerClust; /* sectors per cluster */ 65 uint16_t bpbResSectors; /* number of reserved sectors */ 66 uint8_t bpbFATs; /* number of FATs */ 67 uint16_t bpbRootDirEnts; /* number of root directory entries */ 68 uint16_t bpbSectors; /* total number of sectors */ 69 uint8_t bpbMedia; /* media descriptor */ 70 uint16_t bpbFATsecs; /* number of sectors per FAT */ 71 uint16_t bpbSecPerTrack; /* sectors per track */ 72 uint16_t bpbHeads; /* number of heads */ 73 uint32_t bpbHiddenSecs; /* # of hidden sectors */ 74 uint32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ 75 uint32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */ 76 uint16_t bpbExtFlags; /* extended flags: */ 77 #define FATNUM 0xf /* mask for numbering active FAT */ 78 #define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */ 79 uint16_t bpbFSVers; /* filesystem version */ 80 #define FSVERS 0 /* currently only 0 is understood */ 81 uint32_t bpbRootClust; /* start cluster for root directory */ 82 uint16_t bpbFSInfo; /* filesystem info structure sector */ 83 uint16_t bpbBackup; /* backup boot sector */ 84 uint8_t bpbReserved[12]; /* reserved for future expansion */ 85 }; 86 87 /* 88 * The following structures represent how the bpb's look on disk. shorts 89 * and longs are just character arrays of the appropriate length. This is 90 * because the compiler forces shorts and longs to align on word or 91 * halfword boundaries. 92 */ 93 94 #include <sys/endian.h> 95 96 #define getushort(x) le16dec(x) 97 #define getulong(x) le32dec(x) 98 #define putushort(p, v) le16enc(p, v) 99 #define putulong(p, v) le32enc(p, v) 100 101 /* 102 * BIOS Parameter Block (BPB) for DOS 3.3 103 */ 104 struct byte_bpb33 { 105 int8_t bpbBytesPerSec[2]; /* bytes per sector */ 106 int8_t bpbSecPerClust; /* sectors per cluster */ 107 int8_t bpbResSectors[2]; /* number of reserved sectors */ 108 int8_t bpbFATs; /* number of FATs */ 109 int8_t bpbRootDirEnts[2]; /* number of root directory entries */ 110 int8_t bpbSectors[2]; /* total number of sectors */ 111 int8_t bpbMedia; /* media descriptor */ 112 int8_t bpbFATsecs[2]; /* number of sectors per FAT */ 113 int8_t bpbSecPerTrack[2]; /* sectors per track */ 114 int8_t bpbHeads[2]; /* number of heads */ 115 int8_t bpbHiddenSecs[2]; /* number of hidden sectors */ 116 }; 117 118 /* 119 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, 120 * and bpbHugeSectors is not in the 3.3 bpb. 121 */ 122 struct byte_bpb50 { 123 int8_t bpbBytesPerSec[2]; /* bytes per sector */ 124 int8_t bpbSecPerClust; /* sectors per cluster */ 125 int8_t bpbResSectors[2]; /* number of reserved sectors */ 126 int8_t bpbFATs; /* number of FATs */ 127 int8_t bpbRootDirEnts[2]; /* number of root directory entries */ 128 int8_t bpbSectors[2]; /* total number of sectors */ 129 int8_t bpbMedia; /* media descriptor */ 130 int8_t bpbFATsecs[2]; /* number of sectors per FAT */ 131 int8_t bpbSecPerTrack[2]; /* sectors per track */ 132 int8_t bpbHeads[2]; /* number of heads */ 133 int8_t bpbHiddenSecs[4]; /* number of hidden sectors */ 134 int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ 135 }; 136 137 /* 138 * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. 139 */ 140 struct byte_bpb710 { 141 uint8_t bpbBytesPerSec[2]; /* bytes per sector */ 142 uint8_t bpbSecPerClust; /* sectors per cluster */ 143 uint8_t bpbResSectors[2]; /* number of reserved sectors */ 144 uint8_t bpbFATs; /* number of FATs */ 145 uint8_t bpbRootDirEnts[2]; /* number of root directory entries */ 146 uint8_t bpbSectors[2]; /* total number of sectors */ 147 uint8_t bpbMedia; /* media descriptor */ 148 uint8_t bpbFATsecs[2]; /* number of sectors per FAT */ 149 uint8_t bpbSecPerTrack[2]; /* sectors per track */ 150 uint8_t bpbHeads[2]; /* number of heads */ 151 uint8_t bpbHiddenSecs[4]; /* # of hidden sectors */ 152 uint8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ 153 uint8_t bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */ 154 uint8_t bpbExtFlags[2]; /* extended flags: */ 155 uint8_t bpbFSVers[2]; /* filesystem version */ 156 uint8_t bpbRootClust[4]; /* start cluster for root directory */ 157 uint8_t bpbFSInfo[2]; /* filesystem info structure sector */ 158 uint8_t bpbBackup[2]; /* backup boot sector */ 159 uint8_t bpbReserved[12]; /* reserved for future expansion */ 160 }; 161 162 /* 163 * FAT32 FSInfo block. 164 */ 165 struct fsinfo { 166 uint8_t fsisig1[4]; 167 uint8_t fsifill1[480]; 168 uint8_t fsisig2[4]; 169 uint8_t fsinfree[4]; 170 uint8_t fsinxtfree[4]; 171 uint8_t fsifill2[12]; 172 uint8_t fsisig3[4]; 173 }; 174 #endif /* !_FS_MSDOSFS_BPB_H_ */ 175