summaryrefslogtreecommitdiffstats
path: root/sys/msdosfs/bpb.h
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1998-02-18 09:28:47 +0000
committerjkh <jkh@FreeBSD.org>1998-02-18 09:28:47 +0000
commit90f90fc3470f6725b317b359c1b3149995b822b7 (patch)
treea41d30021bc38cb8b60af8e616a1a634111adecc /sys/msdosfs/bpb.h
parent4430df5b848751ab6f0d04b584f8c0921f47d494 (diff)
downloadFreeBSD-src-90f90fc3470f6725b317b359c1b3149995b822b7.zip
FreeBSD-src-90f90fc3470f6725b317b359c1b3149995b822b7.tar.gz
Update MSDOSFS code using NetBSD's msdosfs as a guide to support
FAT32 partitions. Unfortunately, we looked around here at Walnut Creek CDROM for any newer FAT32-supporting versions of Win95 and we were unsuccessful; only the older stuff here. So this is untested beyond simply making sure it compiles and someone with access to an actual FAT32 fs will have to let us know how well it actually works. Submitted by: Dmitrij Tejblum <dima@tejblum.dnttm.rssi.ru> Obtained from: NetBSD
Diffstat (limited to 'sys/msdosfs/bpb.h')
-rw-r--r--sys/msdosfs/bpb.h217
1 files changed, 153 insertions, 64 deletions
diff --git a/sys/msdosfs/bpb.h b/sys/msdosfs/bpb.h
index 33e1eb6..bc00a75 100644
--- a/sys/msdosfs/bpb.h
+++ b/sys/msdosfs/bpb.h
@@ -1,5 +1,5 @@
-/* $Id$ */
-/* $NetBSD: bpb.h,v 1.3 1994/06/29 06:35:29 cgd Exp $ */
+/* $Id: bpb.h,v 1.5 1997/02/22 09:40:44 peter Exp $ */
+/* $NetBSD: bpb.h,v 1.7 1997/11/17 15:36:24 ws Exp $ */
/*
* Written by Paul Popelka (paulp@uts.amdahl.com)
@@ -21,17 +21,17 @@
* BIOS Parameter Block (BPB) for DOS 3.3
*/
struct bpb33 {
- u_short bpbBytesPerSec; /* bytes per sector */
- u_char bpbSecPerClust; /* sectors per cluster */
- u_short bpbResSectors; /* number of reserved sectors */
- u_char bpbFATs; /* number of FATs */
- u_short bpbRootDirEnts; /* number of root directory entries */
- u_short bpbSectors; /* total number of sectors */
- u_char bpbMedia; /* media descriptor */
- u_short bpbFATsecs; /* number of sectors per FAT */
- u_short bpbSecPerTrack; /* sectors per track */
- u_short bpbHeads; /* number of heads */
- u_short bpbHiddenSecs; /* number of hidden sectors */
+ u_int16_t bpbBytesPerSec; /* bytes per sector */
+ u_int8_t bpbSecPerClust; /* sectors per cluster */
+ u_int16_t bpbResSectors; /* number of reserved sectors */
+ u_int8_t bpbFATs; /* number of FATs */
+ u_int16_t bpbRootDirEnts; /* number of root directory entries */
+ u_int16_t bpbSectors; /* total number of sectors */
+ u_int8_t bpbMedia; /* media descriptor */
+ u_int16_t bpbFATsecs; /* number of sectors per FAT */
+ u_int16_t bpbSecPerTrack; /* sectors per track */
+ u_int16_t bpbHeads; /* number of heads */
+ u_int16_t bpbHiddenSecs; /* number of hidden sectors */
};
/*
@@ -39,21 +39,71 @@ struct bpb33 {
* and bpbHugeSectors is not in the 3.3 bpb.
*/
struct bpb50 {
- u_short bpbBytesPerSec; /* bytes per sector */
- u_char bpbSecPerClust; /* sectors per cluster */
- u_short bpbResSectors; /* number of reserved sectors */
- u_char bpbFATs; /* number of FATs */
- u_short bpbRootDirEnts; /* number of root directory entries */
- u_short bpbSectors; /* total number of sectors */
- u_char bpbMedia; /* media descriptor */
- u_short bpbFATsecs; /* number of sectors per FAT */
- u_short bpbSecPerTrack; /* sectors per track */
- u_short bpbHeads; /* number of heads */
- u_long bpbHiddenSecs; /* number of hidden sectors */
- u_long bpbHugeSectors; /* number of sectors if bpbSectors == 0 */
+ u_int16_t bpbBytesPerSec; /* bytes per sector */
+ u_int8_t bpbSecPerClust; /* sectors per cluster */
+ u_int16_t bpbResSectors; /* number of reserved sectors */
+ u_int8_t bpbFATs; /* number of FATs */
+ u_int16_t bpbRootDirEnts; /* number of root directory entries */
+ u_int16_t bpbSectors; /* total number of sectors */
+ u_int8_t bpbMedia; /* media descriptor */
+ u_int16_t bpbFATsecs; /* number of sectors per FAT */
+ u_int16_t bpbSecPerTrack; /* sectors per track */
+ u_int16_t bpbHeads; /* number of heads */
+ u_int32_t bpbHiddenSecs; /* # of hidden sectors */
+ u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
};
/*
+ * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
+ */
+struct bpb710 {
+ u_int16_t bpbBytesPerSec; /* bytes per sector */
+ u_int8_t bpbSecPerClust; /* sectors per cluster */
+ u_int16_t bpbResSectors; /* number of reserved sectors */
+ u_int8_t bpbFATs; /* number of FATs */
+ u_int16_t bpbRootDirEnts; /* number of root directory entries */
+ u_int16_t bpbSectors; /* total number of sectors */
+ u_int8_t bpbMedia; /* media descriptor */
+ u_int16_t bpbFATsecs; /* number of sectors per FAT */
+ u_int16_t bpbSecPerTrack; /* sectors per track */
+ u_int16_t bpbHeads; /* number of heads */
+ u_int32_t bpbHiddenSecs; /* # of hidden sectors */
+ u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
+ u_int32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */
+ u_int16_t bpbExtFlags; /* extended flags: */
+#define FATNUM 0xf /* mask for numbering active FAT */
+#define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */
+ u_int16_t bpbFSVers; /* filesystem version */
+#define FSVERS 0 /* currently only 0 is understood */
+ u_int32_t bpbRootClust; /* start cluster for root directory */
+ u_int16_t bpbFSInfo; /* filesystem info structure sector */
+ u_int16_t bpbBackup; /* backup boot sector */
+ /* There is a 12 byte filler here, but we ignore it */
+};
+
+#ifdef atari
+/*
+ * BPB for gemdos filesystems. Atari leaves the obsolete stuff undefined.
+ * Currently there is no need for a separate BPB structure.
+ */
+#if 0
+struct bpb_a {
+ u_int16_t bpbBytesPerSec; /* bytes per sector */
+ u_int8_t bpbSecPerClust; /* sectors per cluster */
+ u_int16_t bpbResSectors; /* number of reserved sectors */
+ u_int8_t bpbFATs; /* number of FATs */
+ u_int16_t bpbRootDirEnts; /* number of root directory entries */
+ u_int16_t bpbSectors; /* total number of sectors */
+ u_int8_t bpbUseless1; /* meaningless on gemdos fs */
+ u_int16_t bpbFATsecs; /* number of sectors per FAT */
+ u_int16_t bpbUseless2; /* meaningless for harddisk fs */
+ u_int16_t bpbUseless3; /* meaningless for harddisk fs */
+ u_int16_t bpbHiddenSecs; /* the TOS-BIOS ignores this */
+};
+#endif
+#endif /* atari */
+
+/*
* The following structures represent how the bpb's look on disk. shorts
* and longs are just character arrays of the appropriate length. This is
* because the compiler forces shorts and longs to align on word or
@@ -64,40 +114,39 @@ struct bpb50 {
* use the macros for the big-endian case.
*/
#include <machine/endian.h>
-#if BYTE_ORDER == LITTLE_ENDIAN /* && can do unaligned accesses */
-#define getushort(x) *((u_short *)(x))
-#define getulong(x) *((u_long *)(x))
-#define putushort(p, v) (*((u_short *)(p)) = (v))
-#define putulong(p, v) (*((u_long *)(p)) = (v))
-
+#if (BYTE_ORDER == LITTLE_ENDIAN) /* && defined(UNALIGNED_ACCESS) */
+#define getushort(x) *((u_int16_t *)(x))
+#define getulong(x) *((u_int32_t *)(x))
+#define putushort(p, v) (*((u_int16_t *)(p)) = (v))
+#define putulong(p, v) (*((u_int32_t *)(p)) = (v))
#else
-#define getushort(x) (((u_char *)(x))[0] + (((u_char *)(x))[1] << 8))
-#define getulong(x) (((u_char *)(x))[0] + (((u_char *)(x))[1] << 8) \
- + (((u_char *)(x))[2] << 16) \
- + (((u_char *)(x))[3] << 24))
-#define putushort(p, v) (((u_char *)(p))[0] = (v), \
- ((u_char *)(p))[1] = (v) >> 8)
-#define putulong(p, v) (((u_char *)(p))[0] = (v), \
- ((u_char *)(p))[1] = (v) >> 8, \
- ((u_char *)(p))[2] = (v) >> 16,\
- ((u_char *)(p))[3] = (v) >> 24)
+#define getushort(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8))
+#define getulong(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8) \
+ + (((u_int8_t *)(x))[2] << 16) \
+ + (((u_int8_t *)(x))[3] << 24))
+#define putushort(p, v) (((u_int8_t *)(p))[0] = (v), \
+ ((u_int8_t *)(p))[1] = (v) >> 8)
+#define putulong(p, v) (((u_int8_t *)(p))[0] = (v), \
+ ((u_int8_t *)(p))[1] = (v) >> 8, \
+ ((u_int8_t *)(p))[2] = (v) >> 16,\
+ ((u_int8_t *)(p))[3] = (v) >> 24)
#endif
/*
* BIOS Parameter Block (BPB) for DOS 3.3
*/
struct byte_bpb33 {
- char bpbBytesPerSec[2]; /* bytes per sector */
- char bpbSecPerClust; /* sectors per cluster */
- char bpbResSectors[2]; /* number of reserved sectors */
- char bpbFATs; /* number of FATs */
- char bpbRootDirEnts[2]; /* number of root directory entries */
- char bpbSectors[2]; /* total number of sectors */
- char bpbMedia; /* media descriptor */
- char bpbFATsecs[2]; /* number of sectors per FAT */
- char bpbSecPerTrack[2]; /* sectors per track */
- char bpbHeads[2]; /* number of heads */
- char bpbHiddenSecs[2]; /* number of hidden sectors */
+ int8_t bpbBytesPerSec[2]; /* bytes per sector */
+ int8_t bpbSecPerClust; /* sectors per cluster */
+ int8_t bpbResSectors[2]; /* number of reserved sectors */
+ int8_t bpbFATs; /* number of FATs */
+ int8_t bpbRootDirEnts[2]; /* number of root directory entries */
+ int8_t bpbSectors[2]; /* total number of sectors */
+ int8_t bpbMedia; /* media descriptor */
+ int8_t bpbFATsecs[2]; /* number of sectors per FAT */
+ int8_t bpbSecPerTrack[2]; /* sectors per track */
+ int8_t bpbHeads[2]; /* number of heads */
+ int8_t bpbHiddenSecs[2]; /* number of hidden sectors */
};
/*
@@ -105,16 +154,56 @@ struct byte_bpb33 {
* and bpbHugeSectors is not in the 3.3 bpb.
*/
struct byte_bpb50 {
- char bpbBytesPerSec[2]; /* bytes per sector */
- char bpbSecPerClust; /* sectors per cluster */
- char bpbResSectors[2]; /* number of reserved sectors */
- char bpbFATs; /* number of FATs */
- char bpbRootDirEnts[2]; /* number of root directory entries */
- char bpbSectors[2]; /* total number of sectors */
- char bpbMedia; /* media descriptor */
- char bpbFATsecs[2]; /* number of sectors per FAT */
- char bpbSecPerTrack[2]; /* sectors per track */
- char bpbHeads[2]; /* number of heads */
- char bpbHiddenSecs[4]; /* number of hidden sectors */
- char bpbHugeSectors[4]; /* number of sectors if bpbSectors == 0 */
+ int8_t bpbBytesPerSec[2]; /* bytes per sector */
+ int8_t bpbSecPerClust; /* sectors per cluster */
+ int8_t bpbResSectors[2]; /* number of reserved sectors */
+ int8_t bpbFATs; /* number of FATs */
+ int8_t bpbRootDirEnts[2]; /* number of root directory entries */
+ int8_t bpbSectors[2]; /* total number of sectors */
+ int8_t bpbMedia; /* media descriptor */
+ int8_t bpbFATsecs[2]; /* number of sectors per FAT */
+ int8_t bpbSecPerTrack[2]; /* sectors per track */
+ int8_t bpbHeads[2]; /* number of heads */
+ int8_t bpbHiddenSecs[4]; /* number of hidden sectors */
+ int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
+};
+
+/*
+ * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
+ */
+struct byte_bpb710 {
+ u_int8_t bpbBytesPerSec[2]; /* bytes per sector */
+ u_int8_t bpbSecPerClust; /* sectors per cluster */
+ u_int8_t bpbResSectors[2]; /* number of reserved sectors */
+ u_int8_t bpbFATs; /* number of FATs */
+ u_int8_t bpbRootDirEnts[2]; /* number of root directory entries */
+ u_int8_t bpbSectors[2]; /* total number of sectors */
+ u_int8_t bpbMedia; /* media descriptor */
+ u_int8_t bpbFATsecs[2]; /* number of sectors per FAT */
+ u_int8_t bpbSecPerTrack[2]; /* sectors per track */
+ u_int8_t bpbHeads[2]; /* number of heads */
+ u_int8_t bpbHiddenSecs[4]; /* # of hidden sectors */
+ u_int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
+ u_int8_t bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */
+ u_int8_t bpbExtFlags[2]; /* extended flags: */
+ u_int8_t bpbFSVers[2]; /* filesystem version */
+ u_int8_t bpbRootClust[4]; /* start cluster for root directory */
+ u_int8_t bpbFSInfo[2]; /* filesystem info structure sector */
+ u_int8_t bpbBackup[2]; /* backup boot sector */
+ /* There is a 12 byte filler here, but we ignore it */
+};
+
+/*
+ * FAT32 FSInfo block.
+ */
+struct fsinfo {
+ u_int8_t fsisig1[4];
+ u_int8_t fsifill1[480];
+ u_int8_t fsisig2[4];
+ u_int8_t fsinfree[4];
+ u_int8_t fsinxtfree[4];
+ u_int8_t fsifill2[12];
+ u_int8_t fsisig3[4];
+ u_int8_t fsifill3[508];
+ u_int8_t fsisig4[4];
};
OpenPOWER on IntegriCloud