Annotation of XNU/bsd/hfs/hfscommon/headers/HFSVolumes.h, revision 1.1.1.1

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__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.