Annotation of sys/msdosfs/bpb.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bpb.h,v 1.5 2006/12/15 03:04:24 krw Exp $ */
! 2: /* $NetBSD: bpb.h,v 1.6 1997/10/17 11:23:35 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: /*
! 21: * BIOS Parameter Block (BPB) for DOS 3.3
! 22: */
! 23: struct bpb33 {
! 24: u_int16_t bpbBytesPerSec; /* bytes per sector */
! 25: u_int8_t bpbSecPerClust; /* sectors per cluster */
! 26: u_int16_t bpbResSectors; /* number of reserved sectors */
! 27: u_int8_t bpbFATs; /* number of FATs */
! 28: u_int16_t bpbRootDirEnts; /* number of root directory entries */
! 29: u_int16_t bpbSectors; /* total number of sectors */
! 30: u_int8_t bpbMedia; /* media descriptor */
! 31: u_int16_t bpbFATsecs; /* number of sectors per FAT */
! 32: u_int16_t bpbSecPerTrack; /* sectors per track */
! 33: u_int16_t bpbHeads; /* number of heads */
! 34: u_int16_t bpbHiddenSecs; /* number of hidden sectors */
! 35: };
! 36:
! 37: /*
! 38: * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
! 39: * and bpbHugeSectors is not in the 3.3 bpb.
! 40: */
! 41: struct bpb50 {
! 42: u_int16_t bpbBytesPerSec; /* bytes per sector */
! 43: u_int8_t bpbSecPerClust; /* sectors per cluster */
! 44: u_int16_t bpbResSectors; /* number of reserved sectors */
! 45: u_int8_t bpbFATs; /* number of FATs */
! 46: u_int16_t bpbRootDirEnts; /* number of root directory entries */
! 47: u_int16_t bpbSectors; /* total number of sectors */
! 48: u_int8_t bpbMedia; /* media descriptor */
! 49: u_int16_t bpbFATsecs; /* number of sectors per FAT */
! 50: u_int16_t bpbSecPerTrack; /* sectors per track */
! 51: u_int16_t bpbHeads; /* number of heads */
! 52: u_int32_t bpbHiddenSecs; /* # of hidden sectors */
! 53: u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
! 54: };
! 55:
! 56: /*
! 57: * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
! 58: */
! 59: struct bpb710 {
! 60: u_int16_t bpbBytesPerSec; /* bytes per sector */
! 61: u_int8_t bpbSecPerClust; /* sectors per cluster */
! 62: u_int16_t bpbResSectors; /* number of reserved sectors */
! 63: u_int8_t bpbFATs; /* number of FATs */
! 64: u_int16_t bpbRootDirEnts; /* number of root directory entries */
! 65: u_int16_t bpbSectors; /* total number of sectors */
! 66: u_int8_t bpbMedia; /* media descriptor */
! 67: u_int16_t bpbFATsecs; /* number of sectors per FAT */
! 68: u_int16_t bpbSecPerTrack; /* sectors per track */
! 69: u_int16_t bpbHeads; /* number of heads */
! 70: u_int32_t bpbHiddenSecs; /* # of hidden sectors */
! 71: u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
! 72: u_int32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */
! 73: u_int16_t bpbExtFlags; /* extended flags: */
! 74: #define FATNUM 0xf /* mask for numbering active FAT */
! 75: #define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */
! 76: u_int16_t bpbFSVers; /* filesystem version */
! 77: #define FSVERS 0 /* currently only 0 is understood */
! 78: u_int32_t bpbRootClust; /* start cluster for root directory */
! 79: u_int16_t bpbFSInfo; /* filesystem info structure sector */
! 80: u_int16_t bpbBackup; /* backup boot sector */
! 81: /* There is a 12 byte filler here, but we ignore it */
! 82: };
! 83:
! 84: /*
! 85: * The following structures represent how the bpb's look on disk. shorts
! 86: * and longs are just character arrays of the appropriate length. This is
! 87: * because the compiler forces shorts and longs to align on word or
! 88: * halfword boundaries.
! 89: *
! 90: * XXX The little-endian code here assumes that the processor can access
! 91: * 16-bit and 32-bit quantities on byte boundaries. If this is not true,
! 92: * use the macros for the big-endian case.
! 93: */
! 94: #include <machine/endian.h>
! 95: #if (BYTE_ORDER == LITTLE_ENDIAN) && !defined(__STRICT_ALIGNMENT)
! 96: #define getushort(x) *((u_int16_t *)(x))
! 97: #define getulong(x) *((u_int32_t *)(x))
! 98: #define putushort(p, v) (*((u_int16_t *)(p)) = (v))
! 99: #define putulong(p, v) (*((u_int32_t *)(p)) = (v))
! 100: #else
! 101: #define getushort(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8))
! 102: #define getulong(x) (((u_int8_t *)(x))[0] + (((u_int8_t *)(x))[1] << 8) \
! 103: + (((u_int8_t *)(x))[2] << 16) \
! 104: + (((u_int8_t *)(x))[3] << 24))
! 105: #define putushort(p, v) (((u_int8_t *)(p))[0] = (v), \
! 106: ((u_int8_t *)(p))[1] = (v) >> 8)
! 107: #define putulong(p, v) (((u_int8_t *)(p))[0] = (v), \
! 108: ((u_int8_t *)(p))[1] = (v) >> 8, \
! 109: ((u_int8_t *)(p))[2] = (v) >> 16,\
! 110: ((u_int8_t *)(p))[3] = (v) >> 24)
! 111: #endif
! 112:
! 113: /*
! 114: * BIOS Parameter Block (BPB) for DOS 3.3
! 115: */
! 116: struct byte_bpb33 {
! 117: int8_t bpbBytesPerSec[2]; /* bytes per sector */
! 118: int8_t bpbSecPerClust; /* sectors per cluster */
! 119: int8_t bpbResSectors[2]; /* number of reserved sectors */
! 120: int8_t bpbFATs; /* number of FATs */
! 121: int8_t bpbRootDirEnts[2]; /* number of root directory entries */
! 122: int8_t bpbSectors[2]; /* total number of sectors */
! 123: int8_t bpbMedia; /* media descriptor */
! 124: int8_t bpbFATsecs[2]; /* number of sectors per FAT */
! 125: int8_t bpbSecPerTrack[2]; /* sectors per track */
! 126: int8_t bpbHeads[2]; /* number of heads */
! 127: int8_t bpbHiddenSecs[2]; /* number of hidden sectors */
! 128: };
! 129:
! 130: /*
! 131: * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
! 132: * and bpbHugeSectors is not in the 3.3 bpb.
! 133: */
! 134: struct byte_bpb50 {
! 135: int8_t bpbBytesPerSec[2]; /* bytes per sector */
! 136: int8_t bpbSecPerClust; /* sectors per cluster */
! 137: int8_t bpbResSectors[2]; /* number of reserved sectors */
! 138: int8_t bpbFATs; /* number of FATs */
! 139: int8_t bpbRootDirEnts[2]; /* number of root directory entries */
! 140: int8_t bpbSectors[2]; /* total number of sectors */
! 141: int8_t bpbMedia; /* media descriptor */
! 142: int8_t bpbFATsecs[2]; /* number of sectors per FAT */
! 143: int8_t bpbSecPerTrack[2]; /* sectors per track */
! 144: int8_t bpbHeads[2]; /* number of heads */
! 145: int8_t bpbHiddenSecs[4]; /* number of hidden sectors */
! 146: int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
! 147: };
! 148:
! 149: /*
! 150: * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
! 151: */
! 152: struct byte_bpb710 {
! 153: u_int8_t bpbBytesPerSec[2]; /* bytes per sector */
! 154: u_int8_t bpbSecPerClust; /* sectors per cluster */
! 155: u_int8_t bpbResSectors[2]; /* number of reserved sectors */
! 156: u_int8_t bpbFATs; /* number of FATs */
! 157: u_int8_t bpbRootDirEnts[2]; /* number of root directory entries */
! 158: u_int8_t bpbSectors[2]; /* total number of sectors */
! 159: u_int8_t bpbMedia; /* media descriptor */
! 160: u_int8_t bpbFATsecs[2]; /* number of sectors per FAT */
! 161: u_int8_t bpbSecPerTrack[2]; /* sectors per track */
! 162: u_int8_t bpbHeads[2]; /* number of heads */
! 163: u_int8_t bpbHiddenSecs[4]; /* # of hidden sectors */
! 164: u_int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
! 165: u_int8_t bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */
! 166: u_int8_t bpbExtFlags[2]; /* extended flags: */
! 167: u_int8_t bpbFSVers[2]; /* filesystem version */
! 168: u_int8_t bpbRootClust[4]; /* start cluster for root directory */
! 169: u_int8_t bpbFSInfo[2]; /* filesystem info structure sector */
! 170: u_int8_t bpbBackup[2]; /* backup boot sector */
! 171: /* There is a 12 byte filler here, but we ignore it */
! 172: };
! 173:
! 174: /*
! 175: * FAT32 FSInfo block.
! 176: */
! 177: struct fsinfo {
! 178: u_int8_t fsisig1[4];
! 179: u_int8_t fsifill1[480];
! 180: u_int8_t fsisig2[4];
! 181: u_int8_t fsinfree[4];
! 182: u_int8_t fsinxtfree[4];
! 183: u_int8_t fsifill2[12];
! 184: u_int8_t fsisig3[4];
! 185: u_int8_t fsifill3[508];
! 186: u_int8_t fsisig4[4];
! 187: };
CVSweb