Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / msdosfs / bpb.h @ 14

History | View | Annotate | Download (7.24 KB)

1
/*        $NetBSD: bpb.h,v 1.7 2012/11/04 17:57:59 jakllsch Exp $        */
2

    
3
/*
4
 * Written by Paul Popelka (paulp@uts.amdahl.com)
5
 *
6
 * You can do anything you want with this software, just don't say you wrote
7
 * it, and don't remove this notice.
8
 *
9
 * This software is provided "as is".
10
 *
11
 * The author supplies this software to be publicly redistributed on the
12
 * understanding that the author is not responsible for the correct
13
 * functioning of this software in any circumstances and is not liable for
14
 * any damages caused by this software.
15
 *
16
 * October 1992
17
 */
18

    
19
#ifndef _MSDOSFS_BPB_H_
20
#define _MSDOSFS_BPB_H_
21

    
22
/*
23
 * BIOS Parameter Block (BPB) for DOS 3.3
24
 */
25
struct bpb33 {
26
        u_int16_t        bpbBytesPerSec;        /* bytes per sector */
27
        u_int8_t        bpbSecPerClust;        /* sectors per cluster */
28
        u_int16_t        bpbResSectors;        /* number of reserved sectors */
29
        u_int8_t        bpbFATs;        /* number of FATs */
30
        u_int16_t        bpbRootDirEnts;        /* number of root directory entries */
31
        u_int16_t        bpbSectors;        /* total number of sectors */
32
        u_int8_t        bpbMedia;        /* media descriptor */
33
        u_int16_t        bpbFATsecs;        /* number of sectors per FAT */
34
        u_int16_t        bpbSecPerTrack;        /* sectors per track */
35
        u_int16_t        bpbHeads;        /* number of heads */
36
        u_int16_t        bpbHiddenSecs;        /* number of hidden sectors */
37
};
38

    
39
/*
40
 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
41
 * and bpbHugeSectors is not in the 3.3 bpb.
42
 */
43
struct bpb50 {
44
        u_int16_t        bpbBytesPerSec;        /* bytes per sector */
45
        u_int8_t        bpbSecPerClust;        /* sectors per cluster */
46
        u_int16_t        bpbResSectors;        /* number of reserved sectors */
47
        u_int8_t        bpbFATs;        /* number of FATs */
48
        u_int16_t        bpbRootDirEnts;        /* number of root directory entries */
49
        u_int16_t        bpbSectors;        /* total number of sectors */
50
        u_int8_t        bpbMedia;        /* media descriptor */
51
        u_int16_t        bpbFATsecs;        /* number of sectors per FAT */
52
        u_int16_t        bpbSecPerTrack;        /* sectors per track */
53
        u_int16_t        bpbHeads;        /* number of heads */
54
        u_int32_t        bpbHiddenSecs;        /* # of hidden sectors */
55
        u_int32_t        bpbHugeSectors;        /* # of sectors if bpbSectors == 0 */
56
};
57

    
58
/*
59
 * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
60
 */
61
struct bpb710 {
62
        u_int16_t        bpbBytesPerSec;        /* bytes per sector */
63
        u_int8_t        bpbSecPerClust;        /* sectors per cluster */
64
        u_int16_t        bpbResSectors;        /* number of reserved sectors */
65
        u_int8_t        bpbFATs;        /* number of FATs */
66
        u_int16_t        bpbRootDirEnts;        /* number of root directory entries */
67
        u_int16_t        bpbSectors;        /* total number of sectors */
68
        u_int8_t        bpbMedia;        /* media descriptor */
69
        u_int16_t        bpbFATsecs;        /* number of sectors per FAT */
70
        u_int16_t        bpbSecPerTrack;        /* sectors per track */
71
        u_int16_t        bpbHeads;        /* number of heads */
72
        u_int32_t        bpbHiddenSecs;        /* # of hidden sectors */
73
        u_int32_t        bpbHugeSectors;        /* # of sectors if bpbSectors == 0 */
74
        u_int32_t        bpbBigFATsecs;        /* like bpbFATsecs for FAT32 */
75
        u_int16_t        bpbExtFlags;        /* extended flags: */
76
#define        FATNUM                0xf                /* mask for numbering active FAT */
77
#define        FATMIRROR        0x80                /* FAT is mirrored (like it always was) */
78
        u_int16_t        bpbFSVers;        /* filesystem version */
79
#define        FSVERS                0                /* currently only 0 is understood */
80
        u_int32_t        bpbRootClust;        /* start cluster for root directory */
81
        u_int16_t        bpbFSInfo;        /* filesystem info structure sector */
82
        u_int16_t        bpbBackup;        /* backup boot sector */
83
        u_int8_t        bpbReserved[12]; /* Reserved for future expansion */
84
};
85

    
86
#ifdef        atari
87
/*
88
 * BPB for GEMDOS filesystems. Atari leaves the obsolete stuff undefined.
89
 * Currently there is no need for a separate BPB structure.
90
 */
91
#if 0
92
struct bpb_a {
93
        u_int16_t        bpbBytesPerSec;        /* bytes per sector                */
94
        u_int8_t        bpbSecPerClust;        /* sectors per cluster                */
95
        u_int16_t        bpbResSectors;        /* number of reserved sectors        */
96
        u_int8_t        bpbFATs;        /* number of FATs                */
97
        u_int16_t        bpbRootDirEnts;        /* number of root directory entries */
98
        u_int16_t        bpbSectors;        /* total number of sectors        */
99
        u_int8_t        bpbUseless1;        /* meaningless on GEMDOS FS        */
100
        u_int16_t        bpbFATsecs;        /* number of sectors per FAT        */
101
        u_int16_t        bpbUseless2;        /* meaningless for harddisk fs        */
102
        u_int16_t        bpbUseless3;        /* meaningless for harddisk fs        */
103
        u_int16_t        bpbHiddenSecs;        /* the TOS-BIOS ignores this        */
104
};
105
#endif
106
#endif        /* atari */
107

    
108
/*
109
 * The following structures represent how the bpb's look on disk.  shorts
110
 * and longs are just character arrays of the appropriate length.  This is
111
 * because the compiler forces shorts and longs to align on word or
112
 * halfword boundaries.
113
 */
114

    
115
#include <sys/endian.h>
116

    
117
#define        getushort(p)        le16dec(p)
118
#define        getulong(p)        le32dec(p)
119
#define        putushort(p, v) le16enc((p), (v))
120
#define        putulong(p, v)        le32enc((p), (v))
121

    
122
/*
123
 * BIOS Parameter Block (BPB) for DOS 3.3
124
 */
125
struct byte_bpb33 {
126
        int8_t bpbBytesPerSec[2];        /* bytes per sector */
127
        int8_t bpbSecPerClust;                /* sectors per cluster */
128
        int8_t bpbResSectors[2];        /* number of reserved sectors */
129
        int8_t bpbFATs;                        /* number of FATs */
130
        int8_t bpbRootDirEnts[2];        /* number of root directory entries */
131
        int8_t bpbSectors[2];                /* total number of sectors */
132
        int8_t bpbMedia;                /* media descriptor */
133
        int8_t bpbFATsecs[2];                /* number of sectors per FAT */
134
        int8_t bpbSecPerTrack[2];        /* sectors per track */
135
        int8_t bpbHeads[2];                /* number of heads */
136
        int8_t bpbHiddenSecs[2];        /* number of hidden sectors */
137
};
138

    
139
/*
140
 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
141
 * and bpbHugeSectors is not in the 3.3 bpb.
142
 */
143
struct byte_bpb50 {
144
        int8_t bpbBytesPerSec[2];        /* bytes per sector */
145
        int8_t bpbSecPerClust;                /* sectors per cluster */
146
        int8_t bpbResSectors[2];        /* number of reserved sectors */
147
        int8_t bpbFATs;                        /* number of FATs */
148
        int8_t bpbRootDirEnts[2];        /* number of root directory entries */
149
        int8_t bpbSectors[2];                /* total number of sectors */
150
        int8_t bpbMedia;                /* media descriptor */
151
        int8_t bpbFATsecs[2];                /* number of sectors per FAT */
152
        int8_t bpbSecPerTrack[2];        /* sectors per track */
153
        int8_t bpbHeads[2];                /* number of heads */
154
        int8_t bpbHiddenSecs[4];        /* number of hidden sectors */
155
        int8_t bpbHugeSectors[4];        /* # of sectors if bpbSectors == 0 */
156
};
157

    
158
/*
159
 * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
160
 */
161
struct byte_bpb710 {
162
        u_int8_t bpbBytesPerSec[2];        /* bytes per sector */
163
        u_int8_t bpbSecPerClust;        /* sectors per cluster */
164
        u_int8_t bpbResSectors[2];        /* number of reserved sectors */
165
        u_int8_t bpbFATs;                /* number of FATs */
166
        u_int8_t bpbRootDirEnts[2];        /* number of root directory entries */
167
        u_int8_t bpbSectors[2];                /* total number of sectors */
168
        u_int8_t bpbMedia;                /* media descriptor */
169
        u_int8_t bpbFATsecs[2];                /* number of sectors per FAT */
170
        u_int8_t bpbSecPerTrack[2];        /* sectors per track */
171
        u_int8_t bpbHeads[2];                /* number of heads */
172
        u_int8_t bpbHiddenSecs[4];        /* # of hidden sectors */
173
        u_int8_t bpbHugeSectors[4];        /* # of sectors if bpbSectors == 0 */
174
        u_int8_t bpbBigFATsecs[4];        /* like bpbFATsecs for FAT32 */
175
        u_int8_t bpbExtFlags[2];        /* extended flags: */
176
        u_int8_t bpbFSVers[2];                /* filesystem version */
177
        u_int8_t bpbRootClust[4];        /* start cluster for root directory */
178
        u_int8_t bpbFSInfo[2];                /* filesystem info structure sector */
179
        u_int8_t bpbBackup[2];                /* backup boot sector */
180
        u_int8_t bpbReserved[12];        /* Reserved for future expansion */
181
};
182

    
183
/*
184
 * FAT32 FSInfo block.
185
 */
186
struct fsinfo {
187
        u_int8_t fsisig1[4];
188
        u_int8_t fsifill1[480];
189
        u_int8_t fsisig2[4];
190
        u_int8_t fsinfree[4];
191
        u_int8_t fsinxtfree[4];
192
        u_int8_t fsifill2[12];
193
        u_int8_t fsisig3[4];
194
        u_int8_t fsifill3[508];
195
        u_int8_t fsisig4[4];
196
};
197
#endif /* _MSDOSFS_BPB_H_ */