xref: /minix3/sys/fs/msdosfs/bpb.h (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: bpb.h,v 1.7 2012/11/04 17:57:59 jakllsch Exp $	*/
27f2d47d8SEvgeniy Ivanov 
37f2d47d8SEvgeniy Ivanov /*
47f2d47d8SEvgeniy Ivanov  * Written by Paul Popelka (paulp@uts.amdahl.com)
57f2d47d8SEvgeniy Ivanov  *
67f2d47d8SEvgeniy Ivanov  * You can do anything you want with this software, just don't say you wrote
77f2d47d8SEvgeniy Ivanov  * it, and don't remove this notice.
87f2d47d8SEvgeniy Ivanov  *
97f2d47d8SEvgeniy Ivanov  * This software is provided "as is".
107f2d47d8SEvgeniy Ivanov  *
117f2d47d8SEvgeniy Ivanov  * The author supplies this software to be publicly redistributed on the
127f2d47d8SEvgeniy Ivanov  * understanding that the author is not responsible for the correct
137f2d47d8SEvgeniy Ivanov  * functioning of this software in any circumstances and is not liable for
147f2d47d8SEvgeniy Ivanov  * any damages caused by this software.
157f2d47d8SEvgeniy Ivanov  *
167f2d47d8SEvgeniy Ivanov  * October 1992
177f2d47d8SEvgeniy Ivanov  */
187f2d47d8SEvgeniy Ivanov 
197f2d47d8SEvgeniy Ivanov #ifndef _MSDOSFS_BPB_H_
207f2d47d8SEvgeniy Ivanov #define _MSDOSFS_BPB_H_
217f2d47d8SEvgeniy Ivanov 
227f2d47d8SEvgeniy Ivanov /*
237f2d47d8SEvgeniy Ivanov  * BIOS Parameter Block (BPB) for DOS 3.3
247f2d47d8SEvgeniy Ivanov  */
257f2d47d8SEvgeniy Ivanov struct bpb33 {
267f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbBytesPerSec;	/* bytes per sector */
277f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbSecPerClust;	/* sectors per cluster */
287f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbResSectors;	/* number of reserved sectors */
297f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbFATs;	/* number of FATs */
307f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbRootDirEnts;	/* number of root directory entries */
317f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSectors;	/* total number of sectors */
327f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbMedia;	/* media descriptor */
337f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFATsecs;	/* number of sectors per FAT */
347f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSecPerTrack;	/* sectors per track */
357f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbHeads;	/* number of heads */
367f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbHiddenSecs;	/* number of hidden sectors */
377f2d47d8SEvgeniy Ivanov };
387f2d47d8SEvgeniy Ivanov 
397f2d47d8SEvgeniy Ivanov /*
407f2d47d8SEvgeniy Ivanov  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
417f2d47d8SEvgeniy Ivanov  * and bpbHugeSectors is not in the 3.3 bpb.
427f2d47d8SEvgeniy Ivanov  */
437f2d47d8SEvgeniy Ivanov struct bpb50 {
447f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbBytesPerSec;	/* bytes per sector */
457f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbSecPerClust;	/* sectors per cluster */
467f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbResSectors;	/* number of reserved sectors */
477f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbFATs;	/* number of FATs */
487f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbRootDirEnts;	/* number of root directory entries */
497f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSectors;	/* total number of sectors */
507f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbMedia;	/* media descriptor */
517f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFATsecs;	/* number of sectors per FAT */
527f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSecPerTrack;	/* sectors per track */
537f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbHeads;	/* number of heads */
547f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbHiddenSecs;	/* # of hidden sectors */
557f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbHugeSectors;	/* # of sectors if bpbSectors == 0 */
567f2d47d8SEvgeniy Ivanov };
577f2d47d8SEvgeniy Ivanov 
587f2d47d8SEvgeniy Ivanov /*
597f2d47d8SEvgeniy Ivanov  * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
607f2d47d8SEvgeniy Ivanov  */
617f2d47d8SEvgeniy Ivanov struct bpb710 {
627f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbBytesPerSec;	/* bytes per sector */
637f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbSecPerClust;	/* sectors per cluster */
647f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbResSectors;	/* number of reserved sectors */
657f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbFATs;	/* number of FATs */
667f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbRootDirEnts;	/* number of root directory entries */
677f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSectors;	/* total number of sectors */
687f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbMedia;	/* media descriptor */
697f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFATsecs;	/* number of sectors per FAT */
707f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSecPerTrack;	/* sectors per track */
717f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbHeads;	/* number of heads */
727f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbHiddenSecs;	/* # of hidden sectors */
737f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbHugeSectors;	/* # of sectors if bpbSectors == 0 */
747f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbBigFATsecs;	/* like bpbFATsecs for FAT32 */
757f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbExtFlags;	/* extended flags: */
767f2d47d8SEvgeniy Ivanov #define	FATNUM		0xf		/* mask for numbering active FAT */
777f2d47d8SEvgeniy Ivanov #define	FATMIRROR	0x80		/* FAT is mirrored (like it always was) */
787f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFSVers;	/* filesystem version */
797f2d47d8SEvgeniy Ivanov #define	FSVERS		0		/* currently only 0 is understood */
807f2d47d8SEvgeniy Ivanov 	u_int32_t	bpbRootClust;	/* start cluster for root directory */
817f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFSInfo;	/* filesystem info structure sector */
827f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbBackup;	/* backup boot sector */
837f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbReserved[12]; /* Reserved for future expansion */
847f2d47d8SEvgeniy Ivanov };
857f2d47d8SEvgeniy Ivanov 
867f2d47d8SEvgeniy Ivanov #ifdef	atari
877f2d47d8SEvgeniy Ivanov /*
88*84d9c625SLionel Sambuc  * BPB for GEMDOS filesystems. Atari leaves the obsolete stuff undefined.
897f2d47d8SEvgeniy Ivanov  * Currently there is no need for a separate BPB structure.
907f2d47d8SEvgeniy Ivanov  */
917f2d47d8SEvgeniy Ivanov #if 0
927f2d47d8SEvgeniy Ivanov struct bpb_a {
937f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbBytesPerSec;	/* bytes per sector		*/
947f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbSecPerClust;	/* sectors per cluster		*/
957f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbResSectors;	/* number of reserved sectors	*/
967f2d47d8SEvgeniy Ivanov 	u_int8_t	bpbFATs;	/* number of FATs		*/
977f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbRootDirEnts;	/* number of root directory entries */
987f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbSectors;	/* total number of sectors	*/
99*84d9c625SLionel Sambuc 	u_int8_t	bpbUseless1;	/* meaningless on GEMDOS FS	*/
1007f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbFATsecs;	/* number of sectors per FAT	*/
1017f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbUseless2;	/* meaningless for harddisk fs	*/
1027f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbUseless3;	/* meaningless for harddisk fs	*/
1037f2d47d8SEvgeniy Ivanov 	u_int16_t	bpbHiddenSecs;	/* the TOS-BIOS ignores this	*/
1047f2d47d8SEvgeniy Ivanov };
1057f2d47d8SEvgeniy Ivanov #endif
1067f2d47d8SEvgeniy Ivanov #endif	/* atari */
1077f2d47d8SEvgeniy Ivanov 
1087f2d47d8SEvgeniy Ivanov /*
1097f2d47d8SEvgeniy Ivanov  * The following structures represent how the bpb's look on disk.  shorts
1107f2d47d8SEvgeniy Ivanov  * and longs are just character arrays of the appropriate length.  This is
1117f2d47d8SEvgeniy Ivanov  * because the compiler forces shorts and longs to align on word or
1127f2d47d8SEvgeniy Ivanov  * halfword boundaries.
1137f2d47d8SEvgeniy Ivanov  */
1147f2d47d8SEvgeniy Ivanov 
1157f2d47d8SEvgeniy Ivanov #include <sys/endian.h>
1167f2d47d8SEvgeniy Ivanov 
1177f2d47d8SEvgeniy Ivanov #define	getushort(p)	le16dec(p)
1187f2d47d8SEvgeniy Ivanov #define	getulong(p)	le32dec(p)
1197f2d47d8SEvgeniy Ivanov #define	putushort(p, v) le16enc((p), (v))
1207f2d47d8SEvgeniy Ivanov #define	putulong(p, v)	le32enc((p), (v))
1217f2d47d8SEvgeniy Ivanov 
1227f2d47d8SEvgeniy Ivanov /*
1237f2d47d8SEvgeniy Ivanov  * BIOS Parameter Block (BPB) for DOS 3.3
1247f2d47d8SEvgeniy Ivanov  */
1257f2d47d8SEvgeniy Ivanov struct byte_bpb33 {
1267f2d47d8SEvgeniy Ivanov 	int8_t bpbBytesPerSec[2];	/* bytes per sector */
1277f2d47d8SEvgeniy Ivanov 	int8_t bpbSecPerClust;		/* sectors per cluster */
1287f2d47d8SEvgeniy Ivanov 	int8_t bpbResSectors[2];	/* number of reserved sectors */
1297f2d47d8SEvgeniy Ivanov 	int8_t bpbFATs;			/* number of FATs */
1307f2d47d8SEvgeniy Ivanov 	int8_t bpbRootDirEnts[2];	/* number of root directory entries */
1317f2d47d8SEvgeniy Ivanov 	int8_t bpbSectors[2];		/* total number of sectors */
1327f2d47d8SEvgeniy Ivanov 	int8_t bpbMedia;		/* media descriptor */
1337f2d47d8SEvgeniy Ivanov 	int8_t bpbFATsecs[2];		/* number of sectors per FAT */
1347f2d47d8SEvgeniy Ivanov 	int8_t bpbSecPerTrack[2];	/* sectors per track */
1357f2d47d8SEvgeniy Ivanov 	int8_t bpbHeads[2];		/* number of heads */
1367f2d47d8SEvgeniy Ivanov 	int8_t bpbHiddenSecs[2];	/* number of hidden sectors */
1377f2d47d8SEvgeniy Ivanov };
1387f2d47d8SEvgeniy Ivanov 
1397f2d47d8SEvgeniy Ivanov /*
1407f2d47d8SEvgeniy Ivanov  * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
1417f2d47d8SEvgeniy Ivanov  * and bpbHugeSectors is not in the 3.3 bpb.
1427f2d47d8SEvgeniy Ivanov  */
1437f2d47d8SEvgeniy Ivanov struct byte_bpb50 {
1447f2d47d8SEvgeniy Ivanov 	int8_t bpbBytesPerSec[2];	/* bytes per sector */
1457f2d47d8SEvgeniy Ivanov 	int8_t bpbSecPerClust;		/* sectors per cluster */
1467f2d47d8SEvgeniy Ivanov 	int8_t bpbResSectors[2];	/* number of reserved sectors */
1477f2d47d8SEvgeniy Ivanov 	int8_t bpbFATs;			/* number of FATs */
1487f2d47d8SEvgeniy Ivanov 	int8_t bpbRootDirEnts[2];	/* number of root directory entries */
1497f2d47d8SEvgeniy Ivanov 	int8_t bpbSectors[2];		/* total number of sectors */
1507f2d47d8SEvgeniy Ivanov 	int8_t bpbMedia;		/* media descriptor */
1517f2d47d8SEvgeniy Ivanov 	int8_t bpbFATsecs[2];		/* number of sectors per FAT */
1527f2d47d8SEvgeniy Ivanov 	int8_t bpbSecPerTrack[2];	/* sectors per track */
1537f2d47d8SEvgeniy Ivanov 	int8_t bpbHeads[2];		/* number of heads */
1547f2d47d8SEvgeniy Ivanov 	int8_t bpbHiddenSecs[4];	/* number of hidden sectors */
1557f2d47d8SEvgeniy Ivanov 	int8_t bpbHugeSectors[4];	/* # of sectors if bpbSectors == 0 */
1567f2d47d8SEvgeniy Ivanov };
1577f2d47d8SEvgeniy Ivanov 
1587f2d47d8SEvgeniy Ivanov /*
1597f2d47d8SEvgeniy Ivanov  * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
1607f2d47d8SEvgeniy Ivanov  */
1617f2d47d8SEvgeniy Ivanov struct byte_bpb710 {
1627f2d47d8SEvgeniy Ivanov 	u_int8_t bpbBytesPerSec[2];	/* bytes per sector */
1637f2d47d8SEvgeniy Ivanov 	u_int8_t bpbSecPerClust;	/* sectors per cluster */
1647f2d47d8SEvgeniy Ivanov 	u_int8_t bpbResSectors[2];	/* number of reserved sectors */
1657f2d47d8SEvgeniy Ivanov 	u_int8_t bpbFATs;		/* number of FATs */
1667f2d47d8SEvgeniy Ivanov 	u_int8_t bpbRootDirEnts[2];	/* number of root directory entries */
1677f2d47d8SEvgeniy Ivanov 	u_int8_t bpbSectors[2];		/* total number of sectors */
1687f2d47d8SEvgeniy Ivanov 	u_int8_t bpbMedia;		/* media descriptor */
1697f2d47d8SEvgeniy Ivanov 	u_int8_t bpbFATsecs[2];		/* number of sectors per FAT */
1707f2d47d8SEvgeniy Ivanov 	u_int8_t bpbSecPerTrack[2];	/* sectors per track */
1717f2d47d8SEvgeniy Ivanov 	u_int8_t bpbHeads[2];		/* number of heads */
1727f2d47d8SEvgeniy Ivanov 	u_int8_t bpbHiddenSecs[4];	/* # of hidden sectors */
1737f2d47d8SEvgeniy Ivanov 	u_int8_t bpbHugeSectors[4];	/* # of sectors if bpbSectors == 0 */
1747f2d47d8SEvgeniy Ivanov 	u_int8_t bpbBigFATsecs[4];	/* like bpbFATsecs for FAT32 */
1757f2d47d8SEvgeniy Ivanov 	u_int8_t bpbExtFlags[2];	/* extended flags: */
1767f2d47d8SEvgeniy Ivanov 	u_int8_t bpbFSVers[2];		/* filesystem version */
1777f2d47d8SEvgeniy Ivanov 	u_int8_t bpbRootClust[4];	/* start cluster for root directory */
1787f2d47d8SEvgeniy Ivanov 	u_int8_t bpbFSInfo[2];		/* filesystem info structure sector */
1797f2d47d8SEvgeniy Ivanov 	u_int8_t bpbBackup[2];		/* backup boot sector */
1807f2d47d8SEvgeniy Ivanov 	u_int8_t bpbReserved[12];	/* Reserved for future expansion */
1817f2d47d8SEvgeniy Ivanov };
1827f2d47d8SEvgeniy Ivanov 
1837f2d47d8SEvgeniy Ivanov /*
1847f2d47d8SEvgeniy Ivanov  * FAT32 FSInfo block.
1857f2d47d8SEvgeniy Ivanov  */
1867f2d47d8SEvgeniy Ivanov struct fsinfo {
1877f2d47d8SEvgeniy Ivanov 	u_int8_t fsisig1[4];
1887f2d47d8SEvgeniy Ivanov 	u_int8_t fsifill1[480];
1897f2d47d8SEvgeniy Ivanov 	u_int8_t fsisig2[4];
1907f2d47d8SEvgeniy Ivanov 	u_int8_t fsinfree[4];
1917f2d47d8SEvgeniy Ivanov 	u_int8_t fsinxtfree[4];
1927f2d47d8SEvgeniy Ivanov 	u_int8_t fsifill2[12];
1937f2d47d8SEvgeniy Ivanov 	u_int8_t fsisig3[4];
1947f2d47d8SEvgeniy Ivanov 	u_int8_t fsifill3[508];
1957f2d47d8SEvgeniy Ivanov 	u_int8_t fsisig4[4];
1967f2d47d8SEvgeniy Ivanov };
1977f2d47d8SEvgeniy Ivanov #endif /* _MSDOSFS_BPB_H_ */
198