|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: File: HFSVolumes.h
27:
28: Contains: On-disk data structures for HFS and HFS Plus volumes.
29:
30: Version: Mac OS 8.1
31:
32: Copyright: � 1984-1998 by Apple Computer, Inc. All rights reserved.
33:
34: File Ownership:
35:
36: DRI: Mark Day
37:
38: Other Contacts: Deric Horn
39:
40: Technology: File Systems
41:
42: Writers:
43:
44: (ngk) Nick Kledzik
45: (gap) george puckett
46: (djb) Don Brady
47: (msd) Mark Day
48: (DSH) Deric Horn
49:
50: Change History (most recent first):
51:
52: From HFSVolumes.i:
53:
54: <Rhap> 4/9/98 djb Use a different kHFSPlusMountVersion for Rhapsody.
55:
56: <2> 2/12/98 ngk Clean up: add version field in this header, change Types.i to
57: MacTypes.i, remove pragma comments, remove unnecesarry typedef
58: struct Foo Foo statements.
59: <1> 2/9/98 msd first checked in
60: <0> 2/5/98 msd Imported from HFSVolumesPriv.i. Added "HFS" to many names.
61: Added reserved field to HFSPlusAttrInlineData.
62:
63: From HFSVolumesPriv.i:
64:
65: <CS19> 11/16/97 djb Bump volume format version for Unicode changes.
66: <CS18> 10/23/97 msd Bug 1685113. Change kHFSPlusMountVersion to '8.10' to trigger
67: MountCheck; it also happens to be a more correct value.
68: <CS17> 10/19/97 msd Bug 1684586. Rename modifyDate to attributeModDate. GetCatInfo
69: and SetCatInfo use only contentModDate.
70: <CS16> 9/19/97 msd Fix bug 1679778. In the LargeCatalogFile structure, change the
71: name of the linkCount field to "reserved1" since we no longer
72: support hard links.
73: <CS15> 9/10/97 msd Make sure fork and extent information is 8-byte aligned in
74: attribute records.
75: <CS14> 9/4/97 msd Attributes are now identified by a single Unicode string (flags
76: and OSTypes are gone), and may have extents (allowing them to be
77: very large). Removed C define of bitmapFile. Removed
78: kVolumeHardLinksBit. Added field lastMountedVersion to
79: VolumeHeader; moved unused space near start of structure to make
80: following fields nicely aligned. LargeExtentKey's keyLength is
81: now a UInt16, like all the rest of the HFS Plus B-Trees. Change
82: kHFSPlusVersion to $0003.
83: <CS13> 9/2/97 DSH Moved the VolumeHeader to sector 2 of HFS+ partition, bumped
84: kHFSPlusVersion to 0X0002.
85: <CS12> 8/5/97 msd Change kHFSPlusSigWord to $482B ('H+'). Add enum for
86: kHFSPlusVersion (set to $0001).
87: <CS11> 6/24/97 djb Add link count to HFS Plus file record. Add kVolumeHardLinksBit.
88: <CS10> 6/20/97 msd Remove the define for contentModDate.
89: <CS9> 6/12/97 djb Removed rootFileCount and rootFolderCount. Added new dates,
90: permissions, and encodingBitmap, changed signature to "D8".
91: <CS8> 6/6/97 djb Removed enum names and #pragma enumsalwaysint.
92: <CS7> 6/4/97 gap Removed ForBride conditional. Caused problem in
93: HFSVolumesPriv.a.
94: <CS6> 6/4/97 gap Add #pragma enumsalwaysint so file will work with latest
95: Interfacer tool in Bride build.
96: <CS5> 5/30/97 djb Add constants for minimum key lengths.
97: <CS4> 5/28/97 msd Add AttributeKey and associated enums.
98: <CS3> 5/20/97 DSH Keep sigWord in sync with last build, D5.
99: <CS2> 5/15/97 msd Key length and fork type for extent records should be unsigned.
100: <CS1> 4/28/97 djb first checked in
101:
102: <HFS7> 4/7/97 msd Add FileID for attributes BTree.
103: <HFS6> 4/4/97 djb Major update to HFS Plus structures.
104: <HFS5> 3/17/97 DSH Adding kNumHFSPlusExtents, and kNumHFSExtents.
105: <HFS4> 2/19/97 djb Latest HFS Plus format changes. Removed B-Tree Manager data
106: structures since they're defined in BTreesPrivate.h.
107: <HFS3> 2/13/97 msd Add unions for extent key and data.
108: <HFS2> 1/16/97 djb Changed kLargeExtentKeyMaximumLength to 11.
109: <HFS1> 1/9/97 djb first checked in
110: <0> 1/7/97 djb Converted from HFSVolumePriv.h file.
111: */
112: #ifndef __HFSVOLUMES__
113: #define __HFSVOLUMES__
114:
115: #if TARGET_OS_MAC
116: #ifndef __MACTYPES__
117: #include <MacTypes.h>
118: #endif
119: #ifndef __FILES__
120: #include <Files.h>
121: #endif
122: #ifndef __FINDER__
123: #include <Finder.h>
124: #endif
125: #endif /* TARGET_OS_MAC */
126:
127: #if TARGET_OS_RHAPSODY
128: #ifndef __MACOSTYPES__
129: #include <MacOSTypes.h>
130: #endif
131: #ifndef __MACOSSTUBS__
132: #include <MacOSStubs.h>
133: #endif
134: #endif /* TARGET_OS_RHAPSODY */
135:
136:
137: #if PRAGMA_ONCE
138: #pragma once
139: #endif
140:
141: #ifdef __cplusplus
142: extern "C" {
143: #endif
144:
145: #if PRAGMA_IMPORT
146: #pragma import on
147: #endif
148:
149: #if PRAGMA_STRUCT_ALIGN
150: #pragma options align=mac68k
151: #elif PRAGMA_STRUCT_PACKPUSH
152: #pragma pack(push, 2)
153: #elif PRAGMA_STRUCT_PACK
154: #pragma pack(2)
155: #endif
156:
157: /* Signatures used to differentiate between HFS and HFS Plus volumes */
158:
159: enum {
160: kHFSSigWord = 0x4244, /* 'BD' in ASCII */
161: kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */
162: kHFSPlusVersion = 0x0004, /* will change as format changes (version 4 shipped with Mac OS 8.1) */
163:
164: #if TARGET_OS_MAC
165: kHFSPlusMountVersion = FOUR_CHAR_CODE('8.10') /* will change as implementations change ('8.10' in Mac OS 8.1) */
166: #endif
167:
168: #if TARGET_OS_RHAPSODY
169: kHFSPlusMountVersion = FOUR_CHAR_CODE('9.00') /* will change as implementations change */
170: #endif
171:
172:
173: };
174:
175:
176: /* CatalogNodeID is used to track catalog objects */
177: typedef UInt32 HFSCatalogNodeID;
178: /* Unicode strings are used for file and folder names (HFS Plus only) */
179:
180: struct HFSUniStr255 {
181: UInt16 length; /* number of unicode characters */
182: UniChar unicode[255]; /* unicode characters */
183: };
184: typedef struct HFSUniStr255 HFSUniStr255;
185:
186: typedef const HFSUniStr255 * ConstHFSUniStr255Param;
187:
188: enum {
189: kHFSMaxVolumeNameChars = 27,
190: kHFSMaxFileNameChars = 31,
191: kHFSPlusMaxFileNameChars = 255
192: };
193:
194:
195: /* Extent overflow file data structures */
196: /* HFS Extent key */
197:
198: struct HFSExtentKey {
199: UInt8 keyLength; /* length of key, excluding this field */
200: UInt8 forkType; /* 0 = data fork, FF = resource fork */
201: HFSCatalogNodeID fileID; /* file ID */
202: UInt16 startBlock; /* first file allocation block number in this extent */
203: };
204: typedef struct HFSExtentKey HFSExtentKey;
205: /* HFS Plus Extent key */
206:
207: struct HFSPlusExtentKey {
208: UInt16 keyLength; /* length of key, excluding this field */
209: UInt8 forkType; /* 0 = data fork, FF = resource fork */
210: UInt8 pad; /* make the other fields align on 32-bit boundary */
211: HFSCatalogNodeID fileID; /* file ID */
212: UInt32 startBlock; /* first file allocation block number in this extent */
213: };
214: typedef struct HFSPlusExtentKey HFSPlusExtentKey;
215: /* Number of extent descriptors per extent record */
216:
217: enum {
218: kHFSExtentDensity = 3,
219: kHFSPlusExtentDensity = 8
220: };
221:
222: /* HFS extent descriptor */
223:
224: struct HFSExtentDescriptor {
225: UInt16 startBlock; /* first allocation block */
226: UInt16 blockCount; /* number of allocation blocks */
227: };
228: typedef struct HFSExtentDescriptor HFSExtentDescriptor;
229: /* HFS Plus extent descriptor */
230:
231: struct HFSPlusExtentDescriptor {
232: UInt32 startBlock; /* first allocation block */
233: UInt32 blockCount; /* number of allocation blocks */
234: };
235: typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
236: /* HFS extent record */
237:
238: typedef HFSExtentDescriptor HFSExtentRecord[3];
239: /* HFS Plus extent record */
240: typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
241:
242: /* Fork data info (HFS Plus only) - 80 bytes */
243:
244: struct HFSPlusForkData {
245: UInt64 logicalSize; /* fork's logical size in bytes */
246: UInt32 clumpSize; /* fork's clump size in bytes */
247: UInt32 totalBlocks; /* total blocks used by this fork */
248: HFSPlusExtentRecord extents; /* initial set of extents */
249: };
250: typedef struct HFSPlusForkData HFSPlusForkData;
251: /* Permissions info (HFS Plus only) - 16 bytes */
252:
253: struct HFSPlusPermissions {
254: UInt32 ownerID; /* user or group ID of file/folder owner */
255: UInt32 groupID; /* additional user of group ID */
256: UInt32 permissions; /* permissions (bytes: unused, owner, group, everyone) */
257: UInt32 specialDevice; /* UNIX: device for character or block special file */
258: };
259: typedef struct HFSPlusPermissions HFSPlusPermissions;
260: /* Catalog file data structures */
261:
262: enum {
263: kHFSRootParentID = 1, /* Parent ID of the root folder */
264: kHFSRootFolderID = 2, /* Folder ID of the root folder */
265: kHFSExtentsFileID = 3, /* File ID of the extents file */
266: kHFSCatalogFileID = 4, /* File ID of the catalog file */
267: kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */
268: kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */
269: kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */
270: kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */
271: kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */
272: kHFSFirstUserCatalogNodeID = 16
273: };
274:
275:
276: /* HFS catalog key */
277:
278: struct HFSCatalogKey {
279: UInt8 keyLength; /* key length (in bytes) */
280: UInt8 reserved; /* reserved (set to zero) */
281: HFSCatalogNodeID parentID; /* parent folder ID */
282: Str31 nodeName; /* catalog node name */
283: };
284: typedef struct HFSCatalogKey HFSCatalogKey;
285: /* HFS Plus catalog key */
286:
287: struct HFSPlusCatalogKey {
288: UInt16 keyLength; /* key length (in bytes) */
289: HFSCatalogNodeID parentID; /* parent folder ID */
290: HFSUniStr255 nodeName; /* catalog node name */
291: };
292: typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
293:
294: /* Catalog record types */
295:
296: enum {
297: /* HFS Catalog Records */
298: kHFSFolderRecord = 0x0100, /* Folder record */
299: kHFSFileRecord = 0x0200, /* File record */
300: kHFSFolderThreadRecord = 0x0300, /* Folder thread record */
301: kHFSFileThreadRecord = 0x0400, /* File thread record */
302: /* HFS Plus Catalog Records */
303: kHFSPlusFolderRecord = 1, /* Folder record */
304: kHFSPlusFileRecord = 2, /* File record */
305: kHFSPlusFolderThreadRecord = 3, /* Folder thread record */
306: kHFSPlusFileThreadRecord = 4 /* File thread record */
307: };
308:
309:
310: /* Catalog file record flags */
311:
312: enum {
313: kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */
314: kHFSFileLockedMask = 0x0001,
315: kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */
316: kHFSThreadExistsMask = 0x0002
317: };
318:
319:
320: /* HFS catalog folder record - 70 bytes */
321:
322: struct HFSCatalogFolder {
323: SInt16 recordType; /* record type */
324: UInt16 flags; /* folder flags */
325: UInt16 valence; /* folder valence */
326: HFSCatalogNodeID folderID; /* folder ID */
327: UInt32 createDate; /* date and time of creation */
328: UInt32 modifyDate; /* date and time of last modification */
329: UInt32 backupDate; /* date and time of last backup */
330: DInfo userInfo; /* Finder information */
331: DXInfo finderInfo; /* additional Finder information */
332: UInt32 reserved[4]; /* reserved - set to zero */
333: };
334: typedef struct HFSCatalogFolder HFSCatalogFolder;
335: /* HFS Plus catalog folder record - 88 bytes */
336:
337: struct HFSPlusCatalogFolder {
338: SInt16 recordType; /* record type = HFS Plus folder record */
339: UInt16 flags; /* file flags */
340: UInt32 valence; /* folder's valence (limited to 2^16 in Mac OS) */
341: HFSCatalogNodeID folderID; /* folder ID */
342: UInt32 createDate; /* date and time of creation */
343: UInt32 contentModDate; /* date and time of last content modification */
344: UInt32 attributeModDate; /* date and time of last attribute modification */
345: UInt32 accessDate; /* date and time of last access (Rhapsody only) */
346: UInt32 backupDate; /* date and time of last backup */
347: HFSPlusPermissions permissions; /* permissions (for Rhapsody) */
348: DInfo userInfo; /* Finder information */
349: DXInfo finderInfo; /* additional Finder information */
350: UInt32 textEncoding; /* hint for name conversions */
351: UInt32 reserved; /* reserved - set to zero */
352: };
353: typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
354: /* HFS catalog file record - 102 bytes */
355:
356: struct HFSCatalogFile {
357: SInt16 recordType; /* record type */
358: SInt8 flags; /* file flags */
359: SInt8 fileType; /* file type (unused ?) */
360: FInfo userInfo; /* Finder information */
361: HFSCatalogNodeID fileID; /* file ID */
362: UInt16 dataStartBlock; /* not used - set to zero */
363: SInt32 dataLogicalSize; /* logical EOF of data fork */
364: SInt32 dataPhysicalSize; /* physical EOF of data fork */
365: UInt16 rsrcStartBlock; /* not used - set to zero */
366: SInt32 rsrcLogicalSize; /* logical EOF of resource fork */
367: SInt32 rsrcPhysicalSize; /* physical EOF of resource fork */
368: UInt32 createDate; /* date and time of creation */
369: UInt32 modifyDate; /* date and time of last modification */
370: UInt32 backupDate; /* date and time of last backup */
371: FXInfo finderInfo; /* additional Finder information */
372: UInt16 clumpSize; /* file clump size (not used) */
373: HFSExtentRecord dataExtents; /* first data fork extent record */
374: HFSExtentRecord rsrcExtents; /* first resource fork extent record */
375: UInt32 reserved; /* reserved - set to zero */
376: };
377: typedef struct HFSCatalogFile HFSCatalogFile;
378: /* HFS Plus catalog file record - 248 bytes */
379:
380: struct HFSPlusCatalogFile {
381: SInt16 recordType; /* record type = HFS Plus file record */
382: UInt16 flags; /* file flags */
383: UInt32 reserved1; /* reserved - set to zero */
384: HFSCatalogNodeID fileID; /* file ID */
385: UInt32 createDate; /* date and time of creation */
386: UInt32 contentModDate; /* date and time of last content modification */
387: UInt32 attributeModDate; /* date and time of last attribute modification */
388: UInt32 accessDate; /* date and time of last access (Rhapsody only) */
389: UInt32 backupDate; /* date and time of last backup */
390: HFSPlusPermissions permissions; /* permissions (for Rhapsody) */
391: FInfo userInfo; /* Finder information */
392: FXInfo finderInfo; /* additional Finder information */
393: UInt32 textEncoding; /* hint for name conversions */
394: UInt32 reserved2; /* reserved - set to zero */
395:
396: /* start on double long (64 bit) boundry */
397: HFSPlusForkData dataFork; /* size and block data for data fork */
398: HFSPlusForkData resourceFork; /* size and block data for resource fork */
399: };
400: typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
401: /* HFS catalog thread record - 46 bytes */
402:
403: struct HFSCatalogThread {
404: SInt16 recordType; /* record type */
405: SInt32 reserved[2]; /* reserved - set to zero */
406: HFSCatalogNodeID parentID; /* parent ID for this catalog node */
407: Str31 nodeName; /* name of this catalog node */
408: };
409: typedef struct HFSCatalogThread HFSCatalogThread;
410: /* HFS Plus catalog thread record -- 264 bytes */
411:
412: struct HFSPlusCatalogThread {
413: SInt16 recordType; /* record type */
414: SInt16 reserved; /* reserved - set to zero */
415: HFSCatalogNodeID parentID; /* parent ID for this catalog node */
416: HFSUniStr255 nodeName; /* name of this catalog node (variable length) */
417: };
418: typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
419:
420: /*
421: These are the types of records in the attribute B-tree. The values were chosen
422: so that they wouldn't conflict with the catalog record types.
423: */
424:
425: enum {
426: kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */
427: kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */
428: kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */
429: };
430:
431:
432: /*
433: HFSPlusAttrInlineData
434: For small attributes, whose entire value is stored within this one
435: B-tree record.
436: There would not be any other records for this attribute.
437: */
438:
439: struct HFSPlusAttrInlineData {
440: UInt32 recordType; /* = kHFSPlusAttrInlineData*/
441: UInt32 reserved;
442: UInt32 logicalSize; /* size in bytes of userData*/
443: Byte userData[2]; /* variable length; space allocated is a multiple of 2 bytes*/
444: };
445: typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
446: /*
447: HFSPlusAttrForkData
448: For larger attributes, whose value is stored in allocation blocks.
449: If the attribute has more than 8 extents, there will be additonal
450: records (of type HFSPlusAttrExtents) for this attribute.
451: */
452:
453: struct HFSPlusAttrForkData {
454: UInt32 recordType; /* = kHFSPlusAttrForkData*/
455: UInt32 reserved;
456: HFSPlusForkData theFork; /* size and first extents of value*/
457: };
458: typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
459: /*
460: HFSPlusAttrExtents
461: This record contains information about overflow extents for large,
462: fragmented attributes.
463: */
464:
465: struct HFSPlusAttrExtents {
466: UInt32 recordType; /* = kHFSPlusAttrExtents*/
467: UInt32 reserved;
468: HFSPlusExtentRecord extents; /* additional extents*/
469: };
470: typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
471: /* A generic Attribute Record*/
472:
473: union HFSPlusAttrRecord {
474: UInt32 recordType;
475: HFSPlusAttrInlineData inlineData;
476: HFSPlusAttrForkData forkData;
477: HFSPlusAttrExtents overflowExtents;
478: };
479: typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
480: /* Key and node lengths */
481:
482: enum {
483: kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(UInt16),
484: kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(UInt8),
485: kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(UInt16),
486: kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(UInt16),
487: kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(UInt8),
488: kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - sizeof(Str31) + sizeof(UInt8),
489: kHFSPlusCatalogMinNodeSize = 4096,
490: kHFSPlusExtentMinNodeSize = 512,
491: kHFSPlusAttrMinNodeSize = 4096
492: };
493:
494:
495: /* HFS and HFS Plus volume attribute bits */
496:
497: enum {
498: /* Bits 0-6 are reserved (always cleared by MountVol call) */
499: kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */
500: kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */
501: kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */
502: kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */
503: kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */
504: /* Bits 12-14 are reserved for future use */
505: kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */
506: kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
507: kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
508: kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
509: kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
510: kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
511: kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
512: kHFSMDBAttributesMask = 0x8380
513: };
514:
515:
516: /* Master Directory Block (HFS only) - 162 bytes */
517: /* Stored at sector #2 (3rd sector) */
518:
519: struct HFSMasterDirectoryBlock {
520:
521: /* These first fields are also used by MFS */
522:
523: UInt16 drSigWord; /* volume signature */
524: UInt32 drCrDate; /* date and time of volume creation */
525: UInt32 drLsMod; /* date and time of last modification */
526: UInt16 drAtrb; /* volume attributes */
527: SInt16 drNmFls; /* number of files in root folder */
528: UInt16 drVBMSt; /* first block of volume bitmap */
529: UInt16 drAllocPtr; /* start of next allocation search */
530: UInt16 drNmAlBlks; /* number of allocation blocks in volume */
531: SInt32 drAlBlkSiz; /* size (in bytes) of allocation blocks */
532: SInt32 drClpSiz; /* default clump size */
533: SInt16 drAlBlSt; /* first allocation block in volume */
534: UInt32 drNxtCNID; /* next unused catalog node ID */
535: SInt16 drFreeBks; /* number of unused allocation blocks */
536: Str27 drVN; /* volume name */
537:
538: /* Master Directory Block extensions for HFS */
539:
540: UInt32 drVolBkUp; /* date and time of last backup */
541: UInt16 drVSeqNum; /* volume backup sequence number */
542: SInt32 drWrCnt; /* volume write count */
543: SInt32 drXTClpSiz; /* clump size for extents overflow file */
544: SInt32 drCTClpSiz; /* clump size for catalog file */
545: SInt16 drNmRtDirs; /* number of directories in root folder */
546: SInt32 drFilCnt; /* number of files in volume */
547: SInt32 drDirCnt; /* number of directories in volume */
548: SInt32 drFndrInfo[8]; /* information used by the Finder */
549: UInt16 drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
550: HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
551: SInt32 drXTFlSize; /* size of extents overflow file */
552: HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */
553: SInt32 drCTFlSize; /* size of catalog file */
554: HFSExtentRecord drCTExtRec; /* extent record for catalog file */
555: };
556: typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
557:
558: /* HFSPlusVolumeHeader (HFS Plus only) - 512 bytes */
559: /* Stored at sector #2 (1st sector) and sector n-2 */
560:
561: struct HFSPlusVolumeHeader {
562: UInt16 signature; /* volume signature == 'H+' */
563: UInt16 version; /* current version is kHFSPlusVersion */
564: UInt32 attributes; /* volume attributes */
565: UInt32 lastMountedVersion; /* implementation version which last mounted volume */
566: UInt32 reserved; /* reserved - set to zero */
567:
568: UInt32 createDate; /* date and time of volume creation */
569: UInt32 modifyDate; /* date and time of last modification */
570: UInt32 backupDate; /* date and time of last backup */
571: UInt32 checkedDate; /* date and time of last disk check */
572:
573: UInt32 fileCount; /* number of files in volume */
574: UInt32 folderCount; /* number of directories in volume */
575:
576: UInt32 blockSize; /* size (in bytes) of allocation blocks */
577: UInt32 totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/
578: UInt32 freeBlocks; /* number of unused allocation blocks */
579:
580: UInt32 nextAllocation; /* start of next allocation search */
581: UInt32 rsrcClumpSize; /* default resource fork clump size */
582: UInt32 dataClumpSize; /* default data fork clump size */
583: HFSCatalogNodeID nextCatalogID; /* next unused catalog node ID */
584:
585: UInt32 writeCount; /* volume write count */
586: UInt64 encodingsBitmap; /* which encodings have been use on this volume */
587:
588: UInt8 finderInfo[32]; /* information used by the Finder */
589:
590: HFSPlusForkData allocationFile; /* allocation bitmap file */
591: HFSPlusForkData extentsFile; /* extents B-tree file */
592: HFSPlusForkData catalogFile; /* catalog B-tree file */
593: HFSPlusForkData attributesFile; /* extended attributes B-tree file */
594: HFSPlusForkData startupFile; /* boot file */
595: };
596: typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
597:
598: #if PRAGMA_STRUCT_ALIGN
599: #pragma options align=reset
600: #elif PRAGMA_STRUCT_PACKPUSH
601: #pragma pack(pop)
602: #elif PRAGMA_STRUCT_PACK
603: #pragma pack()
604: #endif
605:
606: #ifdef PRAGMA_IMPORT_OFF
607: #pragma import off
608: #elif PRAGMA_IMPORT
609: #pragma import reset
610: #endif
611:
612: #ifdef __cplusplus
613: }
614: #endif
615:
616: #endif /* __HFSVOLUMES__ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.