Annotation of XNU/bsd/hfs/hfs_format.h, revision 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: #ifndef __HFS_FORMAT__
        !            23: #define __HFS_FORMAT__
        !            24: 
        !            25: /*
        !            26:  * hfs_format.c
        !            27:  *
        !            28:  * This file describes the on-disk format for hfs/HFS Plus volumes.
        !            29:  * The HFS Plus volume format is desciibed in detail in Apple Technote 1150.
        !            30:  *
        !            31:  * http://developer.apple.com/technotes/tn/tn1150.html
        !            32:  *
        !            33:  */
        !            34: 
        !            35: #ifdef __cplusplus
        !            36: extern "C" {
        !            37: #endif
        !            38: 
        !            39: /* some on disk hfs structures have 68K alignment (misaligned) */
        !            40: #pragma options align=mac68k
        !            41: 
        !            42: /* Signatures used to differentiate between HFS and HFS Plus volumes */
        !            43: enum {
        !            44:        kHFSSigWord             = 0x4244,       /* 'BD' in ASCII */
        !            45:        kHFSPlusSigWord         = 0x482B,       /* 'H+' in ASCII */
        !            46:        kHFSPlusVersion         = 0x0004,       /* will change as format changes */
        !            47:                                                /* version 4 shipped with Mac OS 8.1 */
        !            48: 
        !            49:        kHFSPlusMountVersion    = 0x31302E30    /* '10.0' for Mac OS X */
        !            50: };
        !            51: 
        !            52: 
        !            53: /*
        !            54:  * Mac OS X special directory for linked and/or deleted files (HFS Plus only)
        !            55:  *
        !            56:  * to make this folder name sort last...
        !            57:  * it has 0xFFE5 Unicode prefix (0xEF, 0xBF, 0xA5 in UTF-8)
        !            58:  */
        !            59: #define HFSPLUSMETADATAFOLDER  "\xEF\xBF\xA5\xEF\xBF\xA5\xEF\xBF\xA5 HFS Private Meta Data"
        !            60: 
        !            61: /*
        !            62:  * Files in the HFS Private Meta Data folder have one of the following
        !            63:  * prefixes followed by the file ID in decimal (no leading zeros).
        !            64:  * e.g.  FileNodeData3296
        !            65:  */
        !            66: #define HFS_LINK_PREFIX                "FileNodeData"
        !            67: #define HFS_DELETE_PREFIX      "DeletedFile"
        !            68: 
        !            69: /* Unicode strings are used for HFS Plus file and folder names */
        !            70: struct HFSUniStr255 {
        !            71:        u_int16_t       length;         /* number of unicode characters */
        !            72:        u_int16_t       unicode[255];   /* unicode characters */
        !            73: };
        !            74: typedef struct HFSUniStr255 HFSUniStr255;
        !            75: typedef const HFSUniStr255 *ConstHFSUniStr255Param;
        !            76: 
        !            77: enum {
        !            78:        kHFSMaxVolumeNameChars          = 27,
        !            79:        kHFSMaxFileNameChars            = 31,
        !            80:        kHFSPlusMaxFileNameChars        = 255
        !            81: };
        !            82: 
        !            83: 
        !            84: /* Extent overflow file data structures */
        !            85: 
        !            86: /* HFS Extent key */
        !            87: struct HFSExtentKey {
        !            88:        u_int8_t        keyLength;      /* length of key, excluding this field */
        !            89:        u_int8_t        forkType;       /* 0 = data fork, FF = resource fork */
        !            90:        u_int32_t       fileID;         /* file ID */
        !            91:        u_int16_t       startBlock;     /* first file allocation block number in this extent */
        !            92: };
        !            93: typedef struct HFSExtentKey HFSExtentKey;
        !            94: 
        !            95: /* HFS Plus Extent key */
        !            96: struct HFSPlusExtentKey {
        !            97:        u_int16_t       keyLength;              /* length of key, excluding this field */
        !            98:        u_int8_t        forkType;               /* 0 = data fork, FF = resource fork */
        !            99:        u_int8_t        pad;                    /* make the other fields align on 32-bit boundary */
        !           100:        u_int32_t       fileID;                 /* file ID */
        !           101:        u_int32_t       startBlock;             /* first file allocation block number in this extent */
        !           102: };
        !           103: typedef struct HFSPlusExtentKey HFSPlusExtentKey;
        !           104: 
        !           105: /* Number of extent descriptors per extent record */
        !           106: enum {
        !           107:        kHFSExtentDensity       = 3,
        !           108:        kHFSPlusExtentDensity   = 8
        !           109: };
        !           110: 
        !           111: /* HFS extent descriptor */
        !           112: struct HFSExtentDescriptor {
        !           113:        u_int16_t       startBlock;             /* first allocation block */
        !           114:        u_int16_t       blockCount;             /* number of allocation blocks */
        !           115: };
        !           116: typedef struct HFSExtentDescriptor HFSExtentDescriptor;
        !           117: 
        !           118: /* HFS Plus extent descriptor */
        !           119: struct HFSPlusExtentDescriptor {
        !           120:        u_int32_t       startBlock;             /* first allocation block */
        !           121:        u_int32_t       blockCount;             /* number of allocation blocks */
        !           122: };
        !           123: typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
        !           124: 
        !           125: /* HFS extent record */
        !           126: typedef HFSExtentDescriptor HFSExtentRecord[3];
        !           127: 
        !           128: /* HFS Plus extent record */
        !           129: typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
        !           130: 
        !           131: 
        !           132: /* Finder information */
        !           133: struct FndrFileInfo {
        !           134:        u_int32_t       fdType;         /* file type */
        !           135:        u_int32_t       fdCreator;      /* file creator */
        !           136:        u_int16_t       fdFlags;        /* Finder flags */
        !           137:        struct {
        !           138:            int16_t     v;              /* file's location */
        !           139:            int16_t     h;
        !           140:        } fdLocation;
        !           141:        int16_t         opaque;
        !           142: };
        !           143: typedef struct FndrFileInfo FndrFileInfo;
        !           144: 
        !           145: struct FndrDirInfo {
        !           146:        struct {                        /* folder's window rectangle */
        !           147:            int16_t     top;
        !           148:            int16_t     left;
        !           149:            int16_t     bottom;
        !           150:            int16_t     right;
        !           151:        } frRect;
        !           152:        unsigned short  frFlags;        /* Finder flags */
        !           153:        struct {
        !           154:            u_int16_t   v;              /* folder's location */
        !           155:            u_int16_t   h;
        !           156:        } frLocation;
        !           157:        int16_t         opaque;
        !           158: };
        !           159: typedef struct FndrDirInfo FndrDirInfo;
        !           160: 
        !           161: struct FndrOpaqueInfo {
        !           162:        int8_t opaque[16];
        !           163: };
        !           164: typedef struct FndrOpaqueInfo FndrOpaqueInfo;
        !           165: 
        !           166: 
        !           167: /* HFS Plus Fork data info - 80 bytes */
        !           168: struct HFSPlusForkData {
        !           169:        u_int64_t               logicalSize;    /* fork's logical size in bytes */
        !           170:        u_int32_t               clumpSize;      /* fork's clump size in bytes */
        !           171:        u_int32_t               totalBlocks;    /* total blocks used by this fork */
        !           172:        HFSPlusExtentRecord     extents;        /* initial set of extents */
        !           173: };
        !           174: typedef struct HFSPlusForkData HFSPlusForkData;
        !           175: 
        !           176: /* HFS Plus Permissions info - 16 bytes */
        !           177: struct HFSPlusPermissions {
        !           178:        u_int32_t       ownerID;        /* user or group ID of file/folder owner */
        !           179:        u_int32_t       groupID;        /* additional user of group ID */
        !           180:        u_int32_t       permissions;    /* permissions (bytes: unused, owner, group, everyone) */
        !           181:        u_int32_t       specialDevice;  /* UNIX: device for character or block special file */
        !           182: };
        !           183: typedef struct HFSPlusPermissions HFSPlusPermissions;
        !           184: 
        !           185: 
        !           186: /* Catalog file data structures */
        !           187: 
        !           188: enum {
        !           189:        kHFSRootParentID                = 1,    /* Parent ID of the root folder */
        !           190:        kHFSRootFolderID                = 2,    /* Folder ID of the root folder */
        !           191:        kHFSExtentsFileID               = 3,    /* File ID of the extents file */
        !           192:        kHFSCatalogFileID               = 4,    /* File ID of the catalog file */
        !           193:        kHFSBadBlockFileID              = 5,    /* File ID of the bad allocation block file */
        !           194:        kHFSAllocationFileID            = 6,    /* File ID of the allocation file (HFS Plus only) */
        !           195:        kHFSStartupFileID               = 7,    /* File ID of the startup file (HFS Plus only) */
        !           196:        kHFSAttributesFileID            = 8,    /* File ID of the attribute file (HFS Plus only) */
        !           197:        kHFSBogusExtentFileID           = 15,   /* Used for exchanging extents in extents file */
        !           198:        kHFSFirstUserCatalogNodeID      = 16
        !           199: };
        !           200: 
        !           201: /* HFS catalog key */
        !           202: struct HFSCatalogKey {
        !           203:        u_int8_t        keyLength;              /* key length (in bytes) */
        !           204:        u_int8_t        reserved;               /* reserved (set to zero) */
        !           205:        u_int32_t       parentID;               /* parent folder ID */
        !           206:        u_char          nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */
        !           207: };
        !           208: typedef struct HFSCatalogKey HFSCatalogKey;
        !           209: 
        !           210: /* HFS Plus catalog key */
        !           211: struct HFSPlusCatalogKey {
        !           212:        u_int16_t               keyLength;      /* key length (in bytes) */
        !           213:        u_int32_t               parentID;       /* parent folder ID */
        !           214:        HFSUniStr255            nodeName;       /* catalog node name */
        !           215: };
        !           216: typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
        !           217: 
        !           218: /* Catalog record types */
        !           219: enum {
        !           220:        /* HFS Catalog Records */
        !           221:        kHFSFolderRecord                = 0x0100,       /* Folder record */
        !           222:        kHFSFileRecord                  = 0x0200,       /* File record */
        !           223:        kHFSFolderThreadRecord          = 0x0300,       /* Folder thread record */
        !           224:        kHFSFileThreadRecord            = 0x0400,       /* File thread record */
        !           225: 
        !           226:        /* HFS Plus Catalog Records */
        !           227:        kHFSPlusFolderRecord            = 1,            /* Folder record */
        !           228:        kHFSPlusFileRecord              = 2,            /* File record */
        !           229:        kHFSPlusFolderThreadRecord      = 3,            /* Folder thread record */
        !           230:        kHFSPlusFileThreadRecord        = 4             /* File thread record */
        !           231: };
        !           232: 
        !           233: 
        !           234: /* Catalog file record flags */
        !           235: enum {
        !           236:        kHFSFileLockedBit       = 0x0000,       /* file is locked and cannot be written to */
        !           237:        kHFSFileLockedMask      = 0x0001,
        !           238:        kHFSThreadExistsBit     = 0x0001,       /* a file thread record exists for this file */
        !           239:        kHFSThreadExistsMask    = 0x0002
        !           240: };
        !           241: 
        !           242: 
        !           243: /* HFS catalog folder record - 70 bytes */
        !           244: struct HFSCatalogFolder {
        !           245:        int16_t                 recordType;             /* == kHFSFolderRecord */
        !           246:        u_int16_t               flags;                  /* folder flags */
        !           247:        u_int16_t               valence;                /* folder valence */
        !           248:        u_int32_t               folderID;               /* folder ID */
        !           249:        u_int32_t               createDate;             /* date and time of creation */
        !           250:        u_int32_t               modifyDate;             /* date and time of last modification */
        !           251:        u_int32_t               backupDate;             /* date and time of last backup */
        !           252:        FndrDirInfo             userInfo;               /* Finder information */
        !           253:        FndrOpaqueInfo          finderInfo;             /* additional Finder information */
        !           254:        u_int32_t               reserved[4];            /* reserved - initialized as zero */
        !           255: };
        !           256: typedef struct HFSCatalogFolder HFSCatalogFolder;
        !           257: 
        !           258: /* HFS Plus catalog folder record - 88 bytes */
        !           259: struct HFSPlusCatalogFolder {
        !           260:        int16_t                 recordType;             /* == kHFSPlusFolderRecord */
        !           261:        u_int16_t               flags;                  /* file flags */
        !           262:        u_int32_t               valence;                /* folder's valence (limited to 2^16 in Mac OS) */
        !           263:        u_int32_t               folderID;               /* folder ID */
        !           264:        u_int32_t               createDate;             /* date and time of creation */
        !           265:        u_int32_t               contentModDate;         /* date and time of last content modification */
        !           266:        u_int32_t               attributeModDate;       /* date and time of last attribute modification */
        !           267:        u_int32_t               accessDate;             /* date and time of last access (MacOS X only) */
        !           268:        u_int32_t               backupDate;             /* date and time of last backup */
        !           269:        HFSPlusPermissions      permissions;            /* permissions (for MacOS X) */
        !           270:        FndrDirInfo             userInfo;               /* Finder information */
        !           271:        FndrOpaqueInfo          finderInfo;             /* additional Finder information */
        !           272:        u_int32_t               textEncoding;           /* hint for name conversions */
        !           273:        u_int32_t               reserved;               /* reserved - initialized as zero */
        !           274: };
        !           275: typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
        !           276: 
        !           277: /* HFS catalog file record - 102 bytes */
        !           278: struct HFSCatalogFile {
        !           279:        int16_t                 recordType;             /* == kHFSFileRecord */
        !           280:        u_int8_t                flags;                  /* file flags */
        !           281:        int8_t                  fileType;               /* file type (unused ?) */
        !           282:        FndrFileInfo            userInfo;               /* Finder information */
        !           283:        u_int32_t               fileID;                 /* file ID */
        !           284:        u_int16_t               dataStartBlock;         /* not used - set to zero */
        !           285:        int32_t                 dataLogicalSize;        /* logical EOF of data fork */
        !           286:        int32_t                 dataPhysicalSize;       /* physical EOF of data fork */
        !           287:        u_int16_t               rsrcStartBlock;         /* not used - set to zero */
        !           288:        int32_t                 rsrcLogicalSize;        /* logical EOF of resource fork */
        !           289:        int32_t                 rsrcPhysicalSize;       /* physical EOF of resource fork */
        !           290:        u_int32_t               createDate;             /* date and time of creation */
        !           291:        u_int32_t               modifyDate;             /* date and time of last modification */
        !           292:        u_int32_t               backupDate;             /* date and time of last backup */
        !           293:        FndrOpaqueInfo          finderInfo;             /* additional Finder information */
        !           294:        u_int16_t               clumpSize;              /* file clump size (not used) */
        !           295:        HFSExtentRecord         dataExtents;            /* first data fork extent record */
        !           296:        HFSExtentRecord         rsrcExtents;            /* first resource fork extent record */
        !           297:        u_int32_t               reserved;               /* reserved - initialized as zero */
        !           298: };
        !           299: typedef struct HFSCatalogFile HFSCatalogFile;
        !           300: 
        !           301: /* HFS Plus catalog file record - 248 bytes */
        !           302: struct HFSPlusCatalogFile {
        !           303:        int16_t                 recordType;             /* == kHFSPlusFileRecord */
        !           304:        u_int16_t               flags;                  /* file flags */
        !           305:        u_int32_t               linkCount;              /* used by Mac OS X */
        !           306:        u_int32_t               fileID;                 /* file ID */
        !           307:        u_int32_t               createDate;             /* date and time of creation */
        !           308:        u_int32_t               contentModDate;         /* date and time of last content modification */
        !           309:        u_int32_t               attributeModDate;       /* date and time of last attribute modification */
        !           310:        u_int32_t               accessDate;             /* date and time of last access (MacOS X only) */
        !           311:        u_int32_t               backupDate;             /* date and time of last backup */
        !           312:        HFSPlusPermissions      permissions;            /* permissions (for MacOS X) */
        !           313:        FndrFileInfo            userInfo;               /* Finder information */
        !           314:        FndrOpaqueInfo          finderInfo;             /* additional Finder information */
        !           315:        u_int32_t               textEncoding;           /* hint for name conversions */
        !           316:        u_int32_t               reserved2;              /* reserved - initialized as zero */
        !           317: 
        !           318:        /* Note: these start on double long (64 bit) boundry */
        !           319:        HFSPlusForkData         dataFork;               /* size and block data for data fork */
        !           320:        HFSPlusForkData         resourceFork;           /* size and block data for resource fork */
        !           321: };
        !           322: typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
        !           323: 
        !           324: /* HFS catalog thread record - 46 bytes */
        !           325: struct HFSCatalogThread {
        !           326:        int16_t         recordType;             /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */
        !           327:        int32_t         reserved[2];            /* reserved - initialized as zero */
        !           328:        u_int32_t       parentID;               /* parent ID for this catalog node */
        !           329:        u_char          nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */
        !           330: };
        !           331: typedef struct HFSCatalogThread HFSCatalogThread;
        !           332: 
        !           333: /* HFS Plus catalog thread record -- 264 bytes */
        !           334: struct HFSPlusCatalogThread {
        !           335:        int16_t         recordType;             /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */
        !           336:        int16_t         reserved;               /* reserved - initialized as zero */
        !           337:        u_int32_t       parentID;               /* parent ID for this catalog node */
        !           338:        HFSUniStr255    nodeName;               /* name of this catalog node (variable length) */
        !           339: };
        !           340: typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
        !           341: 
        !           342: 
        !           343: /*
        !           344:        These are the types of records in the attribute B-tree.  The values were
        !           345:        chosen so that they wouldn't conflict with the catalog record types.
        !           346: */
        !           347: enum {
        !           348:        kHFSPlusAttrInlineData  = 0x10,         /* if size <  kAttrOverflowSize */
        !           349:        kHFSPlusAttrForkData    = 0x20,         /* if size >= kAttrOverflowSize */
        !           350:        kHFSPlusAttrExtents     = 0x30          /* overflow extents for large attributes */
        !           351: };
        !           352: 
        !           353: 
        !           354: /*
        !           355:        HFSPlusAttrInlineData
        !           356:        For small attributes, whose entire value is stored within this one
        !           357:        B-tree record.
        !           358:        There would not be any other records for this attribute.
        !           359: */
        !           360: struct HFSPlusAttrInlineData {
        !           361:        u_int32_t       recordType;             /* == kHFSPlusAttrInlineData*/
        !           362:        u_int32_t       reserved;
        !           363:        u_int32_t       logicalSize;            /* size in bytes of userData*/
        !           364:        u_int8_t        userData[2];            /* variable length; space allocated is a multiple of 2 bytes*/
        !           365: };
        !           366: typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
        !           367: 
        !           368: 
        !           369: /*
        !           370:        HFSPlusAttrForkData
        !           371:        For larger attributes, whose value is stored in allocation blocks.
        !           372:        If the attribute has more than 8 extents, there will be additonal
        !           373:        records (of type HFSPlusAttrExtents) for this attribute.
        !           374: */
        !           375: struct HFSPlusAttrForkData {
        !           376:        u_int32_t       recordType;             /* == kHFSPlusAttrForkData*/
        !           377:        u_int32_t       reserved;
        !           378:        HFSPlusForkData theFork;                /* size and first extents of value*/
        !           379: };
        !           380: typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
        !           381: 
        !           382: /*
        !           383:        HFSPlusAttrExtents
        !           384:        This record contains information about overflow extents for large,
        !           385:        fragmented attributes.
        !           386: */
        !           387: struct HFSPlusAttrExtents {
        !           388:        u_int32_t               recordType;     /* == kHFSPlusAttrExtents*/
        !           389:        u_int32_t               reserved;
        !           390:        HFSPlusExtentRecord     extents;        /* additional extents*/
        !           391: };
        !           392: typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
        !           393: 
        !           394: /*     A generic Attribute Record*/
        !           395: union HFSPlusAttrRecord {
        !           396:        u_int32_t               recordType;
        !           397:        HFSPlusAttrInlineData   inlineData;
        !           398:        HFSPlusAttrForkData     forkData;
        !           399:        HFSPlusAttrExtents      overflowExtents;
        !           400: };
        !           401: typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
        !           402: 
        !           403: /* Key and node lengths */
        !           404: enum {
        !           405:        kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
        !           406:        kHFSExtentKeyMaximumLength      = sizeof(HFSExtentKey) - sizeof(u_int8_t),
        !           407:        kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
        !           408:        kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
        !           409:        kHFSCatalogKeyMaximumLength     = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
        !           410:        kHFSCatalogKeyMinimumLength     = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1 + sizeof(u_int8_t)),
        !           411:        kHFSPlusCatalogMinNodeSize      = 4096,
        !           412:        kHFSPlusExtentMinNodeSize       = 512,
        !           413:        kHFSPlusAttrMinNodeSize         = 4096
        !           414: };
        !           415: 
        !           416: 
        !           417: /* HFS and HFS Plus volume attribute bits */
        !           418: enum {
        !           419:                                                        /* Bits 0-6 are reserved (always cleared by MountVol call) */
        !           420:        kHFSVolumeHardwareLockBit       = 7,            /* volume is locked by hardware */
        !           421:        kHFSVolumeUnmountedBit          = 8,            /* volume was successfully unmounted */
        !           422:        kHFSVolumeSparedBlocksBit       = 9,            /* volume has bad blocks spared */
        !           423:        kHFSVolumeNoCacheRequiredBit = 10,              /* don't cache volume blocks (i.e. RAM or ROM disk) */
        !           424:        kHFSBootVolumeInconsistentBit = 11,             /* boot volume is inconsistent (System 7.6 and later) */
        !           425:                                                        /* Bits 12-14 are reserved for future use */
        !           426:        kHFSVolumeSoftwareLockBit       = 15,           /* volume is locked by software */
        !           427: 
        !           428:        kHFSVolumeHardwareLockMask      = 1 << kHFSVolumeHardwareLockBit,
        !           429:        kHFSVolumeUnmountedMask         = 1 << kHFSVolumeUnmountedBit,
        !           430:        kHFSVolumeSparedBlocksMask      = 1 << kHFSVolumeSparedBlocksBit,
        !           431:        kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
        !           432:        kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
        !           433:        kHFSVolumeSoftwareLockMask      = 1 << kHFSVolumeSoftwareLockBit,
        !           434:        kHFSMDBAttributesMask           = 0x8380
        !           435: };
        !           436: 
        !           437: 
        !           438: /* HFS Master Directory Block - 162 bytes */
        !           439: /* Stored at sector #2 (3rd sector) and second-to-last sector. */
        !           440: struct HFSMasterDirectoryBlock {
        !           441:        u_int16_t               drSigWord;      /* == kHFSSigWord */
        !           442:        u_int32_t               drCrDate;       /* date and time of volume creation */
        !           443:        u_int32_t               drLsMod;        /* date and time of last modification */
        !           444:        u_int16_t               drAtrb;         /* volume attributes */
        !           445:        u_int16_t               drNmFls;        /* number of files in root folder */
        !           446:        u_int16_t               drVBMSt;        /* first block of volume bitmap */
        !           447:        u_int16_t               drAllocPtr;     /* start of next allocation search */
        !           448:        u_int16_t               drNmAlBlks;     /* number of allocation blocks in volume */
        !           449:        u_int32_t               drAlBlkSiz;     /* size (in bytes) of allocation blocks */
        !           450:        u_int32_t               drClpSiz;       /* default clump size */
        !           451:        u_int16_t               drAlBlSt;       /* first allocation block in volume */
        !           452:        u_int32_t               drNxtCNID;      /* next unused catalog node ID */
        !           453:        u_int16_t               drFreeBks;      /* number of unused allocation blocks */
        !           454:        u_char                  drVN[kHFSMaxVolumeNameChars + 1];  /* volume name */
        !           455:        u_int32_t               drVolBkUp;      /* date and time of last backup */
        !           456:        u_int16_t               drVSeqNum;      /* volume backup sequence number */
        !           457:        u_int32_t               drWrCnt;        /* volume write count */
        !           458:        u_int32_t               drXTClpSiz;     /* clump size for extents overflow file */
        !           459:        u_int32_t               drCTClpSiz;     /* clump size for catalog file */
        !           460:        u_int16_t               drNmRtDirs;     /* number of directories in root folder */
        !           461:        u_int32_t               drFilCnt;       /* number of files in volume */
        !           462:        u_int32_t               drDirCnt;       /* number of directories in volume */
        !           463:        u_int32_t               drFndrInfo[8];  /* information used by the Finder */
        !           464:        u_int16_t               drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
        !           465:        HFSExtentDescriptor     drEmbedExtent;  /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
        !           466:        u_int32_t               drXTFlSize;     /* size of extents overflow file */
        !           467:        HFSExtentRecord         drXTExtRec;     /* extent record for extents overflow file */
        !           468:        u_int32_t               drCTFlSize;     /* size of catalog file */
        !           469:        HFSExtentRecord         drCTExtRec;     /* extent record for catalog file */
        !           470: };
        !           471: typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
        !           472: 
        !           473: 
        !           474: /* HFS Plus Volume Header - 512 bytes */
        !           475: /* Stored at sector #2 (3rd sector) and second-to-last sector. */
        !           476: struct HFSPlusVolumeHeader {
        !           477:        u_int16_t       signature;              /* == kHFSPlusSigWord */
        !           478:        u_int16_t       version;                /* == kHFSPlusVersion */
        !           479:        u_int32_t       attributes;             /* volume attributes */
        !           480:        u_int32_t       lastMountedVersion;     /* implementation version which last mounted volume */
        !           481:        u_int32_t       reserved;               /* reserved - initialized as zero */
        !           482: 
        !           483:        u_int32_t       createDate;             /* date and time of volume creation */
        !           484:        u_int32_t       modifyDate;             /* date and time of last modification */
        !           485:        u_int32_t       backupDate;             /* date and time of last backup */
        !           486:        u_int32_t       checkedDate;            /* date and time of last disk check */
        !           487: 
        !           488:        u_int32_t       fileCount;              /* number of files in volume */
        !           489:        u_int32_t       folderCount;            /* number of directories in volume */
        !           490: 
        !           491:        u_int32_t       blockSize;              /* size (in bytes) of allocation blocks */
        !           492:        u_int32_t       totalBlocks;            /* number of allocation blocks in volume (includes this header and VBM*/
        !           493:        u_int32_t       freeBlocks;             /* number of unused allocation blocks */
        !           494: 
        !           495:        u_int32_t       nextAllocation;         /* start of next allocation search */
        !           496:        u_int32_t       rsrcClumpSize;          /* default resource fork clump size */
        !           497:        u_int32_t       dataClumpSize;          /* default data fork clump size */
        !           498:        u_int32_t       nextCatalogID;          /* next unused catalog node ID */
        !           499: 
        !           500:        u_int32_t       writeCount;             /* volume write count */
        !           501:        u_int64_t       encodingsBitmap;        /* which encodings have been use  on this volume */
        !           502: 
        !           503:        u_int8_t        finderInfo[32];         /* information used by the Finder */
        !           504: 
        !           505:        HFSPlusForkData  allocationFile;        /* allocation bitmap file */
        !           506:        HFSPlusForkData  extentsFile;           /* extents B-tree file */
        !           507:        HFSPlusForkData  catalogFile;           /* catalog B-tree file */
        !           508:        HFSPlusForkData  attributesFile;        /* extended attributes B-tree file */
        !           509:        HFSPlusForkData  startupFile;           /* boot file (secondary loader) */
        !           510: };
        !           511: typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
        !           512: 
        !           513: 
        !           514: /* B-tree structures */
        !           515: 
        !           516: enum BTreeKeyLimits{
        !           517:        kMaxKeyLength   = 520
        !           518: };
        !           519: 
        !           520: union BTreeKey{
        !           521:        u_int8_t        length8;
        !           522:        u_int16_t       length16;
        !           523:        u_int8_t        rawData [kMaxKeyLength+2];
        !           524: };
        !           525: typedef union BTreeKey BTreeKey;
        !           526: 
        !           527: /* BTNodeDescriptor -- Every B-tree node starts with these fields. */
        !           528: struct BTNodeDescriptor {
        !           529:        u_int32_t       fLink;                  /* next node at this level*/
        !           530:        u_int32_t       bLink;                  /* previous node at this level*/
        !           531:        int8_t          kind;                   /* kind of node (leaf, index, header, map)*/
        !           532:        u_int8_t        height;                 /* zero for header, map; child is one more than parent*/
        !           533:        u_int16_t       numRecords;             /* number of records in this node*/
        !           534:        u_int16_t       reserved;               /* reserved - initialized as zero */
        !           535: };
        !           536: typedef struct BTNodeDescriptor BTNodeDescriptor;
        !           537: 
        !           538: /* Constants for BTNodeDescriptor kind */
        !           539: enum {
        !           540:        kBTLeafNode     = -1,
        !           541:        kBTIndexNode    = 0,
        !           542:        kBTHeaderNode   = 1,
        !           543:        kBTMapNode      = 2
        !           544: };
        !           545: 
        !           546: /* BTHeaderRec -- The first record of a B-tree header node */
        !           547: struct BTHeaderRec {
        !           548:        u_int16_t       treeDepth;              /* maximum height (usually leaf nodes) */
        !           549:        u_int32_t       rootNode;               /* node number of root node */
        !           550:        u_int32_t       leafRecords;            /* number of leaf records in all leaf nodes */
        !           551:        u_int32_t       firstLeafNode;          /* node number of first leaf node */
        !           552:        u_int32_t       lastLeafNode;           /* node number of last leaf node */
        !           553:        u_int16_t       nodeSize;               /* size of a node, in bytes */
        !           554:        u_int16_t       maxKeyLength;           /* reserved */
        !           555:        u_int32_t       totalNodes;             /* total number of nodes in tree */
        !           556:        u_int32_t       freeNodes;              /* number of unused (free) nodes in tree */
        !           557:        u_int16_t       reserved1;              /* unused */
        !           558:        u_int32_t       clumpSize;              /* reserved */
        !           559:        u_int8_t        btreeType;              /* reserved */
        !           560:        u_int8_t        reserved2;              /* reserved */
        !           561:        u_int32_t       attributes;             /* persistent attributes about the tree */
        !           562:        u_int32_t       reserved3[16];          /* reserved */
        !           563: };
        !           564: typedef struct BTHeaderRec BTHeaderRec;
        !           565: 
        !           566: /* Constants for BTHeaderRec attributes */
        !           567: enum {
        !           568:        kBTBadCloseMask          = 0x00000001,  /* reserved */
        !           569:        kBTBigKeysMask           = 0x00000002,  /* key length field is 16 bits */
        !           570:        kBTVariableIndexKeysMask = 0x00000004   /* keys in index nodes are variable length */
        !           571: };
        !           572: 
        !           573: #pragma options align=reset
        !           574: 
        !           575: #ifdef __cplusplus
        !           576: }
        !           577: #endif
        !           578: 
        !           579: #endif /* __HFS_FORMAT__ */

unix.superglobalmegacorp.com

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