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

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

unix.superglobalmegacorp.com

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