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