150477Speter/* $FreeBSD$ */ 233548Sjkh/* $NetBSD: bpb.h,v 1.7 1997/11/17 15:36:24 ws Exp $ */ 32893Sdfr 4139776Simp/*- 52893Sdfr * Written by Paul Popelka (paulp@uts.amdahl.com) 68876Srgrimes * 72893Sdfr * You can do anything you want with this software, just don't say you wrote 82893Sdfr * it, and don't remove this notice. 98876Srgrimes * 102893Sdfr * This software is provided "as is". 118876Srgrimes * 122893Sdfr * The author supplies this software to be publicly redistributed on the 132893Sdfr * understanding that the author is not responsible for the correct 142893Sdfr * functioning of this software in any circumstances and is not liable for 152893Sdfr * any damages caused by this software. 168876Srgrimes * 172893Sdfr * October 1992 182893Sdfr */ 192893Sdfr 20203827Skib#ifndef _FS_MSDOSFS_BPB_H_ 21203827Skib#define _FS_MSDOSFS_BPB_H_ 22203827Skib 232893Sdfr/* 242893Sdfr * BIOS Parameter Block (BPB) for DOS 3.3 252893Sdfr */ 262893Sdfrstruct bpb33 { 2733548Sjkh u_int16_t bpbBytesPerSec; /* bytes per sector */ 2833548Sjkh u_int8_t bpbSecPerClust; /* sectors per cluster */ 2933548Sjkh u_int16_t bpbResSectors; /* number of reserved sectors */ 3033548Sjkh u_int8_t bpbFATs; /* number of FATs */ 3133548Sjkh u_int16_t bpbRootDirEnts; /* number of root directory entries */ 3233548Sjkh u_int16_t bpbSectors; /* total number of sectors */ 3333548Sjkh u_int8_t bpbMedia; /* media descriptor */ 3433548Sjkh u_int16_t bpbFATsecs; /* number of sectors per FAT */ 3533548Sjkh u_int16_t bpbSecPerTrack; /* sectors per track */ 3633548Sjkh u_int16_t bpbHeads; /* number of heads */ 3733548Sjkh u_int16_t bpbHiddenSecs; /* number of hidden sectors */ 382893Sdfr}; 392893Sdfr 402893Sdfr/* 412893Sdfr * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, 422893Sdfr * and bpbHugeSectors is not in the 3.3 bpb. 432893Sdfr */ 442893Sdfrstruct bpb50 { 4533548Sjkh u_int16_t bpbBytesPerSec; /* bytes per sector */ 4633548Sjkh u_int8_t bpbSecPerClust; /* sectors per cluster */ 4733548Sjkh u_int16_t bpbResSectors; /* number of reserved sectors */ 4833548Sjkh u_int8_t bpbFATs; /* number of FATs */ 4933548Sjkh u_int16_t bpbRootDirEnts; /* number of root directory entries */ 5033548Sjkh u_int16_t bpbSectors; /* total number of sectors */ 5133548Sjkh u_int8_t bpbMedia; /* media descriptor */ 5233548Sjkh u_int16_t bpbFATsecs; /* number of sectors per FAT */ 5333548Sjkh u_int16_t bpbSecPerTrack; /* sectors per track */ 5433548Sjkh u_int16_t bpbHeads; /* number of heads */ 5533548Sjkh u_int32_t bpbHiddenSecs; /* # of hidden sectors */ 5633548Sjkh u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ 572893Sdfr}; 582893Sdfr 592893Sdfr/* 6033548Sjkh * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. 6133548Sjkh */ 6233548Sjkhstruct bpb710 { 6333548Sjkh u_int16_t bpbBytesPerSec; /* bytes per sector */ 6433548Sjkh u_int8_t bpbSecPerClust; /* sectors per cluster */ 6533548Sjkh u_int16_t bpbResSectors; /* number of reserved sectors */ 6633548Sjkh u_int8_t bpbFATs; /* number of FATs */ 6733548Sjkh u_int16_t bpbRootDirEnts; /* number of root directory entries */ 6833548Sjkh u_int16_t bpbSectors; /* total number of sectors */ 6933548Sjkh u_int8_t bpbMedia; /* media descriptor */ 7033548Sjkh u_int16_t bpbFATsecs; /* number of sectors per FAT */ 7133548Sjkh u_int16_t bpbSecPerTrack; /* sectors per track */ 7233548Sjkh u_int16_t bpbHeads; /* number of heads */ 7333548Sjkh u_int32_t bpbHiddenSecs; /* # of hidden sectors */ 7433548Sjkh u_int32_t bpbHugeSectors; /* # of sectors if bpbSectors == 0 */ 7533548Sjkh u_int32_t bpbBigFATsecs; /* like bpbFATsecs for FAT32 */ 7633548Sjkh u_int16_t bpbExtFlags; /* extended flags: */ 7733548Sjkh#define FATNUM 0xf /* mask for numbering active FAT */ 7833548Sjkh#define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */ 7933548Sjkh u_int16_t bpbFSVers; /* filesystem version */ 8033548Sjkh#define FSVERS 0 /* currently only 0 is understood */ 8133548Sjkh u_int32_t bpbRootClust; /* start cluster for root directory */ 8233548Sjkh u_int16_t bpbFSInfo; /* filesystem info structure sector */ 8333548Sjkh u_int16_t bpbBackup; /* backup boot sector */ 84203827Skib u_int8_t bpbReserved[12]; /* reserved for future expansion */ 8533548Sjkh}; 8633548Sjkh 8733548Sjkh/* 882893Sdfr * The following structures represent how the bpb's look on disk. shorts 892893Sdfr * and longs are just character arrays of the appropriate length. This is 902893Sdfr * because the compiler forces shorts and longs to align on word or 912893Sdfr * halfword boundaries. 922893Sdfr */ 9365075Sbde 94165431Smarcel#include <sys/endian.h> 9565075Sbde 96165431Smarcel#define getushort(x) le16dec(x) 97165431Smarcel#define getulong(x) le32dec(x) 98165431Smarcel#define putushort(p, v) le16enc(p, v) 99165431Smarcel#define putulong(p, v) le32enc(p, v) 1002893Sdfr 1012893Sdfr/* 1022893Sdfr * BIOS Parameter Block (BPB) for DOS 3.3 1032893Sdfr */ 1042893Sdfrstruct byte_bpb33 { 10533548Sjkh int8_t bpbBytesPerSec[2]; /* bytes per sector */ 10633548Sjkh int8_t bpbSecPerClust; /* sectors per cluster */ 10733548Sjkh int8_t bpbResSectors[2]; /* number of reserved sectors */ 10833548Sjkh int8_t bpbFATs; /* number of FATs */ 10933548Sjkh int8_t bpbRootDirEnts[2]; /* number of root directory entries */ 11033548Sjkh int8_t bpbSectors[2]; /* total number of sectors */ 11133548Sjkh int8_t bpbMedia; /* media descriptor */ 11233548Sjkh int8_t bpbFATsecs[2]; /* number of sectors per FAT */ 11333548Sjkh int8_t bpbSecPerTrack[2]; /* sectors per track */ 11433548Sjkh int8_t bpbHeads[2]; /* number of heads */ 11533548Sjkh int8_t bpbHiddenSecs[2]; /* number of hidden sectors */ 1162893Sdfr}; 1172893Sdfr 1182893Sdfr/* 1192893Sdfr * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3, 1202893Sdfr * and bpbHugeSectors is not in the 3.3 bpb. 1212893Sdfr */ 1222893Sdfrstruct byte_bpb50 { 12333548Sjkh int8_t bpbBytesPerSec[2]; /* bytes per sector */ 12433548Sjkh int8_t bpbSecPerClust; /* sectors per cluster */ 12533548Sjkh int8_t bpbResSectors[2]; /* number of reserved sectors */ 12633548Sjkh int8_t bpbFATs; /* number of FATs */ 12733548Sjkh int8_t bpbRootDirEnts[2]; /* number of root directory entries */ 12833548Sjkh int8_t bpbSectors[2]; /* total number of sectors */ 12933548Sjkh int8_t bpbMedia; /* media descriptor */ 13033548Sjkh int8_t bpbFATsecs[2]; /* number of sectors per FAT */ 13133548Sjkh int8_t bpbSecPerTrack[2]; /* sectors per track */ 13233548Sjkh int8_t bpbHeads[2]; /* number of heads */ 13333548Sjkh int8_t bpbHiddenSecs[4]; /* number of hidden sectors */ 13433548Sjkh int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ 1352893Sdfr}; 13633548Sjkh 13733548Sjkh/* 13833548Sjkh * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50. 13933548Sjkh */ 14033548Sjkhstruct byte_bpb710 { 14133548Sjkh u_int8_t bpbBytesPerSec[2]; /* bytes per sector */ 14233548Sjkh u_int8_t bpbSecPerClust; /* sectors per cluster */ 14333548Sjkh u_int8_t bpbResSectors[2]; /* number of reserved sectors */ 14433548Sjkh u_int8_t bpbFATs; /* number of FATs */ 14533548Sjkh u_int8_t bpbRootDirEnts[2]; /* number of root directory entries */ 14633548Sjkh u_int8_t bpbSectors[2]; /* total number of sectors */ 14733548Sjkh u_int8_t bpbMedia; /* media descriptor */ 14833548Sjkh u_int8_t bpbFATsecs[2]; /* number of sectors per FAT */ 14933548Sjkh u_int8_t bpbSecPerTrack[2]; /* sectors per track */ 15033548Sjkh u_int8_t bpbHeads[2]; /* number of heads */ 15133548Sjkh u_int8_t bpbHiddenSecs[4]; /* # of hidden sectors */ 15233548Sjkh u_int8_t bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */ 15333548Sjkh u_int8_t bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */ 15433548Sjkh u_int8_t bpbExtFlags[2]; /* extended flags: */ 15533548Sjkh u_int8_t bpbFSVers[2]; /* filesystem version */ 15633548Sjkh u_int8_t bpbRootClust[4]; /* start cluster for root directory */ 15733548Sjkh u_int8_t bpbFSInfo[2]; /* filesystem info structure sector */ 15833548Sjkh u_int8_t bpbBackup[2]; /* backup boot sector */ 159203827Skib u_int8_t bpbReserved[12]; /* reserved for future expansion */ 16033548Sjkh}; 16133548Sjkh 16233548Sjkh/* 16333548Sjkh * FAT32 FSInfo block. 16433548Sjkh */ 16533548Sjkhstruct fsinfo { 16633548Sjkh u_int8_t fsisig1[4]; 16733548Sjkh u_int8_t fsifill1[480]; 16833548Sjkh u_int8_t fsisig2[4]; 16933548Sjkh u_int8_t fsinfree[4]; 17033548Sjkh u_int8_t fsinxtfree[4]; 17133548Sjkh u_int8_t fsifill2[12]; 17233548Sjkh u_int8_t fsisig3[4]; 17333548Sjkh}; 174203827Skib#endif /* !_FS_MSDOSFS_BPB_H_ */ 175