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