]>
git.saurik.com Git - apple/boot.git/blob - i386/libsaio/msdos_private.h
2 * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 2.0 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 * Written by Paul Popelka (paulp@uts.amdahl.com)
25 * You can do anything you want with this software, just don't say you wrote
26 * it, and don't remove this notice.
28 * This software is provided "as is".
30 * The author supplies this software to be publicly redistributed on the
31 * understanding that the author is not responsible for the correct
32 * functioning of this software in any circumstances and is not liable for
33 * any damages caused by this software.
39 * Format of a boot sector. This is the first sector on a DOS floppy disk
40 * or the fist sector of a partition on a hard disk. But, it is not the
41 * first sector of a partitioned hard disk.
44 u_int8_t bsJump
[3]; /* jump inst E9xxxx or EBxx90 */
45 int8_t bsOemName
[8]; /* OEM name and version */
46 int8_t bsBPB
[19]; /* BIOS parameter block */
47 int8_t bsDriveNumber
; /* drive number (0x80) */
48 int8_t bsBootCode
[479]; /* pad so struct is 512b */
49 u_int8_t bsBootSectSig0
;
50 u_int8_t bsBootSectSig1
;
56 int8_t exDriveNumber
; /* drive number (0x80) */
57 int8_t exReserved1
; /* reserved */
58 int8_t exBootSignature
; /* ext. boot signature (0x29) */
59 #define EXBOOTSIG 0x29
60 int8_t exVolumeID
[4]; /* volume ID number */
61 int8_t exVolumeLabel
[11]; /* volume label */
62 int8_t exFileSysType
[8]; /* fs type (FAT12 or FAT16) */
66 u_int8_t bsJump
[3]; /* jump inst E9xxxx or EBxx90 */
67 int8_t bsOemName
[8]; /* OEM name and version */
68 int8_t bsBPB
[25]; /* BIOS parameter block */
69 int8_t bsExt
[26]; /* Bootsector Extension */
70 int8_t bsBootCode
[448]; /* pad so structure is 512b */
71 u_int8_t bsBootSectSig0
;
72 u_int8_t bsBootSectSig1
;
77 struct bootsector710
{
78 u_int8_t bsJump
[3]; /* jump inst E9xxxx or EBxx90 */
79 int8_t bsOEMName
[8]; /* OEM name and version */
80 int8_t bsBPB
[53]; /* BIOS parameter block */
81 int8_t bsExt
[26]; /* Bootsector Extension */
82 int8_t bsBootCode
[420]; /* pad so structure is 512b */
83 u_int8_t bsBootSectSig0
;
84 u_int8_t bsBootSectSig1
;
90 struct bootsector33 bs33
;
91 struct bootsector50 bs50
;
92 struct bootsector710 bs710
;
99 * BIOS Parameter Block (BPB) for DOS 3.3
102 u_int16_t bpbBytesPerSec
; /* bytes per sector */
103 u_int8_t bpbSecPerClust
; /* sectors per cluster */
104 u_int16_t bpbResSectors
; /* number of reserved sectors */
105 u_int8_t bpbFATs
; /* number of FATs */
106 u_int16_t bpbRootDirEnts
; /* number of root directory entries */
107 u_int16_t bpbSectors
; /* total number of sectors */
108 u_int8_t bpbMedia
; /* media descriptor */
109 u_int16_t bpbFATsecs
; /* number of sectors per FAT */
110 u_int16_t bpbSecPerTrack
; /* sectors per track */
111 u_int16_t bpbHeads
; /* number of heads */
112 u_int16_t bpbHiddenSecs
; /* number of hidden sectors */
113 } __attribute__((packed
));
116 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
117 * and bpbHugeSectors is not in the 3.3 bpb.
120 u_int16_t bpbBytesPerSec
; /* bytes per sector */
121 u_int8_t bpbSecPerClust
; /* sectors per cluster */
122 u_int16_t bpbResSectors
; /* number of reserved sectors */
123 u_int8_t bpbFATs
; /* number of FATs */
124 u_int16_t bpbRootDirEnts
; /* number of root directory entries */
125 u_int16_t bpbSectors
; /* total number of sectors */
126 u_int8_t bpbMedia
; /* media descriptor */
127 u_int16_t bpbFATsecs
; /* number of sectors per FAT */
128 u_int16_t bpbSecPerTrack
; /* sectors per track */
129 u_int16_t bpbHeads
; /* number of heads */
130 u_int32_t bpbHiddenSecs
; /* # of hidden sectors */
131 u_int32_t bpbHugeSectors
; /* # of sectors if bpbSectors == 0 */
132 } __attribute__((packed
));
135 * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
138 u_int16_t bpbBytesPerSec
; /* bytes per sector */
139 u_int8_t bpbSecPerClust
; /* sectors per cluster */
140 u_int16_t bpbResSectors
; /* number of reserved sectors */
141 u_int8_t bpbFATs
; /* number of FATs */
142 u_int16_t bpbRootDirEnts
; /* number of root directory entries */
143 u_int16_t bpbSectors
; /* total number of sectors */
144 u_int8_t bpbMedia
; /* media descriptor */
145 u_int16_t bpbFATsecs
; /* number of sectors per FAT */
146 u_int16_t bpbSecPerTrack
; /* sectors per track */
147 u_int16_t bpbHeads
; /* number of heads */
148 u_int32_t bpbHiddenSecs
; /* # of hidden sectors */
149 u_int32_t bpbHugeSectors
; /* # of sectors if bpbSectors == 0 */
150 u_int32_t bpbBigFATsecs
; /* like bpbFATsecs for FAT32 */
151 u_int16_t bpbExtFlags
; /* extended flags: */
152 #define FATNUM 0xf /* mask for numbering active FAT */
153 #define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */
154 u_int16_t bpbFSVers
; /* filesystem version */
155 #define FSVERS 0 /* currently only 0 is understood */
156 u_int32_t bpbRootClust
; /* start cluster for root directory */
157 u_int16_t bpbFSInfo
; /* filesystem info structure sector */
158 u_int16_t bpbBackup
; /* backup boot sector */
159 /* There is a 12 byte filler here, but we ignore it */
160 } __attribute__((packed
));
164 * BIOS Parameter Block (BPB) for DOS 3.3
167 int8_t bpbBytesPerSec
[2]; /* bytes per sector */
168 int8_t bpbSecPerClust
; /* sectors per cluster */
169 int8_t bpbResSectors
[2]; /* number of reserved sectors */
170 int8_t bpbFATs
; /* number of FATs */
171 int8_t bpbRootDirEnts
[2]; /* number of root directory entries */
172 int8_t bpbSectors
[2]; /* total number of sectors */
173 int8_t bpbMedia
; /* media descriptor */
174 int8_t bpbFATsecs
[2]; /* number of sectors per FAT */
175 int8_t bpbSecPerTrack
[2]; /* sectors per track */
176 int8_t bpbHeads
[2]; /* number of heads */
177 int8_t bpbHiddenSecs
[2]; /* number of hidden sectors */
181 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
182 * and bpbHugeSectors is not in the 3.3 bpb.
185 int8_t bpbBytesPerSec
[2]; /* bytes per sector */
186 int8_t bpbSecPerClust
; /* sectors per cluster */
187 int8_t bpbResSectors
[2]; /* number of reserved sectors */
188 int8_t bpbFATs
; /* number of FATs */
189 int8_t bpbRootDirEnts
[2]; /* number of root directory entries */
190 int8_t bpbSectors
[2]; /* total number of sectors */
191 int8_t bpbMedia
; /* media descriptor */
192 int8_t bpbFATsecs
[2]; /* number of sectors per FAT */
193 int8_t bpbSecPerTrack
[2]; /* sectors per track */
194 int8_t bpbHeads
[2]; /* number of heads */
195 int8_t bpbHiddenSecs
[4]; /* number of hidden sectors */
196 int8_t bpbHugeSectors
[4]; /* # of sectors if bpbSectors == 0 */
200 * BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
203 u_int8_t bpbBytesPerSec
[2]; /* bytes per sector */
204 u_int8_t bpbSecPerClust
; /* sectors per cluster */
205 u_int8_t bpbResSectors
[2]; /* number of reserved sectors */
206 u_int8_t bpbFATs
; /* number of FATs */
207 u_int8_t bpbRootDirEnts
[2]; /* number of root directory entries */
208 u_int8_t bpbSectors
[2]; /* total number of sectors */
209 u_int8_t bpbMedia
; /* media descriptor */
210 u_int8_t bpbFATsecs
[2]; /* number of sectors per FAT */
211 u_int8_t bpbSecPerTrack
[2]; /* sectors per track */
212 u_int8_t bpbHeads
[2]; /* number of heads */
213 u_int8_t bpbHiddenSecs
[4]; /* # of hidden sectors */
214 u_int8_t bpbHugeSectors
[4]; /* # of sectors if bpbSectors == 0 */
215 u_int8_t bpbBigFATsecs
[4]; /* like bpbFATsecs for FAT32 */
216 u_int8_t bpbExtFlags
[2]; /* extended flags: */
217 u_int8_t bpbFSVers
[2]; /* filesystem version */
218 u_int8_t bpbRootClust
[4]; /* start cluster for root directory */
219 u_int8_t bpbFSInfo
[2]; /* filesystem info structure sector */
220 u_int8_t bpbBackup
[2]; /* backup boot sector */
221 /* There is a 12 byte filler here, but we ignore it */
226 * FAT32 FSInfo block.
230 u_int8_t fsifill1
[480];
232 u_int8_t fsinfree
[4];
233 u_int8_t fsinxtfree
[4];
234 u_int8_t fsifill2
[12];
242 * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
243 * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
244 * All rights reserved.
245 * Original code by Paul Popelka (paulp@uts.amdahl.com) (see above).
247 * Redistribution and use in source and binary forms, with or without
248 * modification, are permitted provided that the following conditions
250 * 1. Redistributions of source code must retain the above copyright
251 * notice, this list of conditions and the following disclaimer.
252 * 2. Redistributions in binary form must reproduce the above copyright
253 * notice, this list of conditions and the following disclaimer in the
254 * documentation and/or other materials provided with the distribution.
255 * 3. All advertising materials mentioning features or use of this software
256 * must display the following acknowledgement:
257 * This product includes software developed by TooLs GmbH.
258 * 4. The name of TooLs GmbH may not be used to endorse or promote products
259 * derived from this software without specific prior written permission.
261 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
262 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
263 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
264 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
265 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
266 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
267 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
268 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
269 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
270 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274 * Structure of a dos directory entry.
277 u_int8_t deName
[8]; /* filename, blank filled */
278 #define SLOT_EMPTY 0x00 /* slot has never been used */
279 #define SLOT_E5 0x05 /* the real value is 0xe5 */
280 #define SLOT_DELETED 0xe5 /* file in this slot deleted */
281 u_int8_t deExtension
[3]; /* extension, blank filled */
282 u_int8_t deAttributes
; /* file attributes */
283 #define ATTR_NORMAL 0x00 /* normal file */
284 #define ATTR_READONLY 0x01 /* file is read-only (immutable) */
285 #define ATTR_HIDDEN 0x02 /* file is hidden */
286 #define ATTR_SYSTEM 0x04 /* file is a system file */
287 #define ATTR_VOLUME 0x08 /* entry is a volume label */
288 #define ATTR_DIRECTORY 0x10 /* entry is a directory name */
289 #define ATTR_ARCHIVE 0x20 /* file is new or modified */
290 u_int8_t deLowerCase
; /* NT VFAT lower case flags */
291 #define LCASE_BASE 0x08 /* filename base in lower case */
292 #define LCASE_EXT 0x10 /* filename extension in lower case */
293 u_int8_t deCHundredth
; /* hundredth of seconds in CTime */
294 u_int8_t deCTime
[2]; /* create time */
295 u_int8_t deCDate
[2]; /* create date */
296 u_int8_t deADate
[2]; /* access date */
297 u_int8_t deHighClust
[2]; /* high bytes of cluster number */
298 u_int8_t deMTime
[2]; /* last update time */
299 u_int8_t deMDate
[2]; /* last update date */
300 u_int8_t deStartCluster
[2]; /* starting cluster of file */
301 u_int8_t deFileSize
[4]; /* size of file in bytes */
305 * Structure of a Win95 long name directory entry
309 #define WIN_LAST 0x40
311 u_int8_t wePart1
[10];
312 u_int8_t weAttributes
;
313 #define ATTR_WIN95 0x0f
314 u_int8_t weReserved1
;
316 u_int8_t wePart2
[12];
317 u_int16_t weReserved2
;
320 #define WIN_CHARS 13 /* Number of chars per winentry */
323 * Maximum filename length in Win95
324 * Note: Must be < sizeof(dirent.d_name)
326 #define WIN_MAXLEN 255
329 * This is the format of the contents of the deTime field in the direntry
331 * We don't use bitfields because we don't know how compilers for
332 * arbitrary machines will lay them out.
334 #define DT_2SECONDS_MASK 0x1F /* seconds divided by 2 */
335 #define DT_2SECONDS_SHIFT 0
336 #define DT_MINUTES_MASK 0x7E0 /* minutes */
337 #define DT_MINUTES_SHIFT 5
338 #define DT_HOURS_MASK 0xF800 /* hours */
339 #define DT_HOURS_SHIFT 11
342 * This is the format of the contents of the deDate field in the direntry
345 #define DD_DAY_MASK 0x1F /* day of month */
346 #define DD_DAY_SHIFT 0
347 #define DD_MONTH_MASK 0x1E0 /* month */
348 #define DD_MONTH_SHIFT 5
349 #define DD_YEAR_MASK 0xFE00 /* year - 1980 */
350 #define DD_YEAR_SHIFT 9