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