1 /*
2  * libhfs - library for reading and writing Macintosh HFS volumes
3  * Copyright (C) 1996-1998 Robert Leslie
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
18  * MA 02110-1301, USA.
19  *
20  * $Id: apple.h,v 1.1 1998/04/11 08:27:11 rob Exp $
21  */
22 
23 typedef signed char	Char;
24 typedef unsigned char	UChar;
25 typedef signed char	SignedByte;
26 typedef signed short	Integer;
27 typedef unsigned short	UInteger;
28 typedef signed long	LongInt;
29 typedef unsigned long	ULongInt;
30 typedef char		Str15[16];
31 typedef char		Str31[32];
32 typedef long		OSType;
33 
34 typedef struct {
35   Integer	sbSig;		/* device signature (should be 0x4552) */
36   Integer	sbBlkSize;	/* block size of the device (in bytes) */
37   LongInt	sbBlkCount;	/* number of blocks on the device */
38   Integer	sbDevType;	/* reserved */
39   Integer	sbDevId;	/* reserved */
40   LongInt	sbData;		/* reserved */
41   Integer	sbDrvrCount;	/* number of driver descriptor entries */
42   LongInt	ddBlock;	/* first driver's starting block */
43   Integer	ddSize;		/* size of the driver, in 512-byte blocks */
44   Integer	ddType;		/* driver operating system type (MacOS = 1) */
45   Integer	ddPad[243];	/* additional drivers, if any */
46 } Block0;
47 
48 typedef struct {
49   Integer	pmSig;		/* partition signature (0x504d or 0x5453) */
50   Integer	pmSigPad;	/* reserved */
51   LongInt	pmMapBlkCnt;	/* number of blocks in partition map */
52   LongInt	pmPyPartStart;	/* first physical block of partition */
53   LongInt	pmPartBlkCnt;	/* number of blocks in partition */
54   Char		pmPartName[33];	/* partition name */
55   Char		pmParType[33];	/* partition type */
56   LongInt	pmLgDataStart;	/* first logical block of data area */
57   LongInt	pmDataCnt;	/* number of blocks in data area */
58   LongInt	pmPartStatus;	/* partition status information */
59   LongInt	pmLgBootStart;	/* first logical block of boot code */
60   LongInt	pmBootSize;	/* size of boot code, in bytes */
61   LongInt	pmBootAddr;	/* boot code load address */
62   LongInt	pmBootAddr2;	/* reserved */
63   LongInt	pmBootEntry;	/* boot code entry point */
64   LongInt	pmBootEntry2;	/* reserved */
65   LongInt	pmBootCksum;	/* boot code checksum */
66   Char		pmProcessor[17];/* processor type */
67   Integer	pmPad[188];	/* reserved */
68 } Partition;
69 
70 typedef struct {
71   Integer	bbID;		/* boot blocks signature */
72   LongInt	bbEntry;	/* entry point to boot code */
73   Integer	bbVersion;	/* boot blocks version number */
74   Integer	bbPageFlags;	/* used internally */
75   Str15		bbSysName;	/* System filename */
76   Str15		bbShellName;	/* Finder filename */
77   Str15		bbDbg1Name;	/* debugger filename */
78   Str15		bbDbg2Name;	/* debugger filename */
79   Str15		bbScreenName;	/* name of startup screen */
80   Str15		bbHelloName;	/* name of startup program */
81   Str15		bbScrapName;	/* name of system scrap file */
82   Integer	bbCntFCBs;	/* number of FCBs to allocate */
83   Integer	bbCntEvts;	/* number of event queue elements */
84   LongInt	bb128KSHeap;	/* system heap size on 128K Mac */
85   LongInt	bb256KSHeap;	/* used internally */
86   LongInt	bbSysHeapSize;	/* system heap size on all machines */
87   Integer	filler;		/* reserved */
88   LongInt	bbSysHeapExtra;	/* additional system heap space */
89   LongInt	bbSysHeapFract;	/* fraction of RAM for system heap */
90 } BootBlkHdr;
91 
92 typedef struct {
93   UInteger	xdrStABN;	/* first allocation block */
94   UInteger	xdrNumABlks;	/* number of allocation blocks */
95 } ExtDescriptor;
96 
97 typedef ExtDescriptor ExtDataRec[3];
98 
99 typedef struct {
100   SignedByte	xkrKeyLen;	/* key length */
101   SignedByte	xkrFkType;	/* fork type (0x00/0xff == data/resource */
102   ULongInt	xkrFNum;	/* file number */
103   UInteger	xkrFABN;	/* starting file allocation block */
104 } ExtKeyRec;
105 
106 typedef struct {
107   SignedByte	ckrKeyLen;	/* key length */
108   SignedByte	ckrResrv1;	/* reserved */
109   ULongInt	ckrParID;	/* parent directory ID */
110   Str31		ckrCName;	/* catalog node name */
111 } CatKeyRec;
112 
113 typedef struct {
114   Integer	v;		/* vertical coordinate */
115   Integer	h;		/* horizontal coordinate */
116 } Point;
117 
118 typedef struct {
119   Integer	top;		/* top edge of rectangle */
120   Integer	left;		/* left edge */
121   Integer	bottom;		/* bottom edge */
122   Integer	right;		/* right edge */
123 } Rect;
124 
125 typedef struct {
126   Rect		frRect;		/* folder's rectangle */
127   Integer	frFlags;	/* flags */
128   Point		frLocation;	/* folder's location */
129   Integer	frView;		/* folder's view */
130 } DInfo;
131 
132 typedef struct {
133   Point		frScroll;	/* scroll position */
134   LongInt	frOpenChain;	/* directory ID chain of open folders */
135   Integer	frUnused;	/* reserved */
136   Integer	frComment;	/* comment ID */
137   LongInt	frPutAway;	/* directory ID */
138 } DXInfo;
139 
140 typedef struct {
141   OSType	fdType;		/* file type */
142   OSType	fdCreator;	/* file's creator */
143   Integer	fdFlags;	/* flags */
144   Point		fdLocation;	/* file's location */
145   Integer	fdFldr;		/* file's window */
146 } FInfo;
147 
148 typedef struct {
149   Integer	fdIconID;	/* icon ID */
150   Integer	fdUnused[4];	/* reserved */
151   Integer	fdComment;	/* comment ID */
152   LongInt	fdPutAway;	/* home directory ID */
153 } FXInfo;
154 
155 typedef struct {
156   Integer	drSigWord;	/* volume signature (0x4244 for HFS) */
157   LongInt	drCrDate;	/* date and time of volume creation */
158   LongInt	drLsMod;	/* date and time of last modification */
159   Integer	drAtrb;		/* volume attributes */
160   UInteger	drNmFls;	/* number of files in root directory */
161   UInteger	drVBMSt;	/* first block of volume bit map (always 3) */
162   UInteger	drAllocPtr;	/* start of next allocation search */
163   UInteger	drNmAlBlks;	/* number of allocation blocks in volume */
164   ULongInt	drAlBlkSiz;	/* size (in bytes) of allocation blocks */
165   ULongInt	drClpSiz;	/* default clump size */
166   UInteger	drAlBlSt;	/* first allocation block in volume */
167   LongInt	drNxtCNID;	/* next unused catalog node ID (dir/file ID) */
168   UInteger	drFreeBks;	/* number of unused allocation blocks */
169   char		drVN[28];	/* volume name (1-27 chars) */
170   LongInt	drVolBkUp;	/* date and time of last backup */
171   Integer	drVSeqNum;	/* volume backup sequence number */
172   ULongInt	drWrCnt;	/* volume write count */
173   ULongInt	drXTClpSiz;	/* clump size for extents overflow file */
174   ULongInt	drCTClpSiz;	/* clump size for catalog file */
175   UInteger	drNmRtDirs;	/* number of directories in root directory */
176   ULongInt	drFilCnt;	/* number of files in volume */
177   ULongInt	drDirCnt;	/* number of directories in volume */
178   LongInt	drFndrInfo[8];	/* information used by the Finder */
179   UInteger	drEmbedSigWord;	/* type of embedded volume */
180   ExtDescriptor	drEmbedExtent;	/* location of embedded volume */
181   ULongInt	drXTFlSize;	/* size (in bytes) of extents overflow file */
182   ExtDataRec	drXTExtRec;	/* first extent record for extents file */
183   ULongInt	drCTFlSize;	/* size (in bytes) of catalog file */
184   ExtDataRec	drCTExtRec;	/* first extent record for catalog file */
185 } MDB;
186 
187 typedef enum {
188   cdrDirRec  = 1,
189   cdrFilRec  = 2,
190   cdrThdRec  = 3,
191   cdrFThdRec = 4
192 } CatDataType;
193 
194 typedef struct {
195   SignedByte	cdrType;	/* record type */
196   SignedByte	cdrResrv2;	/* reserved */
197   union {
198     struct {  /* cdrDirRec */
199       Integer	dirFlags;	/* directory flags */
200       UInteger	dirVal;		/* directory valence */
201       ULongInt	dirDirID;	/* directory ID */
202       LongInt	dirCrDat;	/* date and time of creation */
203       LongInt	dirMdDat;	/* date and time of last modification */
204       LongInt	dirBkDat;	/* date and time of last backup */
205       DInfo	dirUsrInfo;	/* Finder information */
206       DXInfo	dirFndrInfo;	/* additional Finder information */
207       LongInt	dirResrv[4];	/* reserved */
208     } dir;
209     struct {  /* cdrFilRec */
210       SignedByte
211 		filFlags;	/* file flags */
212       SignedByte
213 		filTyp;		/* file type */
214       FInfo	filUsrWds;	/* Finder information */
215       ULongInt	filFlNum;	/* file ID */
216       UInteger	filStBlk;	/* first alloc block of data fork */
217       ULongInt	filLgLen;	/* logical EOF of data fork */
218       ULongInt	filPyLen;	/* physical EOF of data fork */
219       UInteger	filRStBlk;	/* first alloc block of resource fork */
220       ULongInt	filRLgLen;	/* logical EOF of resource fork */
221       ULongInt	filRPyLen;	/* physical EOF of resource fork */
222       LongInt	filCrDat;	/* date and time of creation */
223       LongInt	filMdDat;	/* date and time of last modification */
224       LongInt	filBkDat;	/* date and time of last backup */
225       FXInfo	filFndrInfo;	/* additional Finder information */
226       UInteger	filClpSize;	/* file clump size */
227       ExtDataRec
228 		filExtRec;	/* first data fork extent record */
229       ExtDataRec
230 		filRExtRec;	/* first resource fork extent record */
231       LongInt	filResrv;	/* reserved */
232     } fil;
233     struct {  /* cdrThdRec */
234       LongInt	thdResrv[2];	/* reserved */
235       ULongInt	thdParID;	/* parent ID for this directory */
236       Str31	thdCName;	/* name of this directory */
237     } dthd;
238     struct {  /* cdrFThdRec */
239       LongInt	fthdResrv[2];	/* reserved */
240       ULongInt	fthdParID;	/* parent ID for this file */
241       Str31	fthdCName;	/* name of this file */
242     } fthd;
243   } u;
244 } CatDataRec;
245 
246 typedef struct {
247   ULongInt	ndFLink;	/* forward link */
248   ULongInt	ndBLink;	/* backward link */
249   SignedByte	ndType;		/* node type */
250   SignedByte	ndNHeight;	/* node level */
251   UInteger	ndNRecs;	/* number of records in node */
252   Integer	ndResv2;	/* reserved */
253 } NodeDescriptor;
254 
255 enum {
256   ndIndxNode = (SignedByte) 0x00,
257   ndHdrNode  = (SignedByte) 0x01,
258   ndMapNode  = (SignedByte) 0x02,
259   ndLeafNode = (SignedByte) 0xff
260 };
261 
262 typedef struct {
263   UInteger	bthDepth;	/* current depth of tree */
264   ULongInt	bthRoot;	/* number of root node */
265   ULongInt	bthNRecs;	/* number of leaf records in tree */
266   ULongInt	bthFNode;	/* number of first leaf node */
267   ULongInt	bthLNode;	/* number of last leaf node */
268   UInteger	bthNodeSize;	/* size of a node */
269   UInteger	bthKeyLen;	/* maximum length of a key */
270   ULongInt	bthNNodes;	/* total number of nodes in tree */
271   ULongInt	bthFree;	/* number of free nodes */
272   SignedByte	bthResv[76];	/* reserved */
273 } BTHdrRec;
274