diff options
Diffstat (limited to 'common/quicktime_win32/HFSVolumes.h')
| -rw-r--r-- | common/quicktime_win32/HFSVolumes.h | 503 |
1 files changed, 503 insertions, 0 deletions
diff --git a/common/quicktime_win32/HFSVolumes.h b/common/quicktime_win32/HFSVolumes.h new file mode 100644 index 0000000..0604a10 --- /dev/null +++ b/common/quicktime_win32/HFSVolumes.h @@ -0,0 +1,503 @@ +/* + File: HFSVolumes.h + + Contains: On-disk data structures for HFS and HFS Plus volumes. + + Version: QuickTime 7.3 + + Copyright: (c) 2007 (c) 1984-2001 by Apple Computer, Inc. All rights reserved. + + Bugs?: For bug reports, consult the following page on + the World Wide Web: + + http://developer.apple.com/bugreporter/ + +*/ +#ifndef __HFSVOLUMES__ +#define __HFSVOLUMES__ + +#ifndef __MACTYPES__ +#include <MacTypes.h> +#endif + +#ifndef __FILES__ +#include <Files.h> +#endif + +#ifndef __FINDER__ +#include <Finder.h> +#endif + + + + +#if PRAGMA_ONCE +#pragma once +#endif + +#if PRAGMA_IMPORT +#pragma import on +#endif + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=mac68k +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(push, 2) +#elif PRAGMA_STRUCT_PACK + #pragma pack(2) +#endif + +/* Signatures used to differentiate between HFS and HFS Plus volumes */ +enum { + kHFSSigWord = 0x4244, /* 'BD' in ASCII */ + kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */ + kHFSPlusVersion = 0x0004, /* will change as format changes (version 4 shipped with Mac OS 8.1) */ + kHFSPlusMountVersion = FOUR_CHAR_CODE('8.10') /* will change as implementations change ('8.10' in Mac OS 8.1) */ +}; + + +/* CatalogNodeID is used to track catalog objects */ +typedef UInt32 HFSCatalogNodeID; +enum { + kHFSMaxVolumeNameChars = 27, + kHFSMaxFileNameChars = 31, + kHFSPlusMaxFileNameChars = 255 +}; + + +/* Extent overflow file data structures */ +/* HFS Extent key */ +struct HFSExtentKey { + UInt8 keyLength; /* length of key, excluding this field */ + UInt8 forkType; /* 0 = data fork, FF = resource fork */ + HFSCatalogNodeID fileID; /* file ID */ + UInt16 startBlock; /* first file allocation block number in this extent */ +}; +typedef struct HFSExtentKey HFSExtentKey; +/* HFS Plus Extent key */ +struct HFSPlusExtentKey { + UInt16 keyLength; /* length of key, excluding this field */ + UInt8 forkType; /* 0 = data fork, FF = resource fork */ + UInt8 pad; /* make the other fields align on 32-bit boundary */ + HFSCatalogNodeID fileID; /* file ID */ + UInt32 startBlock; /* first file allocation block number in this extent */ +}; +typedef struct HFSPlusExtentKey HFSPlusExtentKey; +/* Number of extent descriptors per extent record */ +enum { + kHFSExtentDensity = 3, + kHFSPlusExtentDensity = 8 +}; + +/* HFS extent descriptor */ +struct HFSExtentDescriptor { + UInt16 startBlock; /* first allocation block */ + UInt16 blockCount; /* number of allocation blocks */ +}; +typedef struct HFSExtentDescriptor HFSExtentDescriptor; +/* HFS Plus extent descriptor */ +struct HFSPlusExtentDescriptor { + UInt32 startBlock; /* first allocation block */ + UInt32 blockCount; /* number of allocation blocks */ +}; +typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor; +/* HFS extent record */ + +typedef HFSExtentDescriptor HFSExtentRecord[3]; +/* HFS Plus extent record */ +typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8]; + +/* Fork data info (HFS Plus only) - 80 bytes */ +struct HFSPlusForkData { + UInt64 logicalSize; /* fork's logical size in bytes */ + UInt32 clumpSize; /* fork's clump size in bytes */ + UInt32 totalBlocks; /* total blocks used by this fork */ + HFSPlusExtentRecord extents; /* initial set of extents */ +}; +typedef struct HFSPlusForkData HFSPlusForkData; +/* Permissions info (HFS Plus only) - 16 bytes */ +struct HFSPlusPermissions { + UInt32 ownerID; /* user or group ID of file/folder owner */ + UInt32 groupID; /* additional user of group ID */ + UInt32 permissions; /* permissions (bytes: unused, owner, group, everyone) */ + UInt32 specialDevice; /* UNIX: device for character or block special file */ +}; +typedef struct HFSPlusPermissions HFSPlusPermissions; +/* Catalog file data structures */ +enum { + kHFSRootParentID = 1, /* Parent ID of the root folder */ + kHFSRootFolderID = 2, /* Folder ID of the root folder */ + kHFSExtentsFileID = 3, /* File ID of the extents file */ + kHFSCatalogFileID = 4, /* File ID of the catalog file */ + kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */ + kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */ + kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */ + kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */ + kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */ + kHFSFirstUserCatalogNodeID = 16 +}; + + +/* HFS catalog key */ +struct HFSCatalogKey { + UInt8 keyLength; /* key length (in bytes) */ + UInt8 reserved; /* reserved (set to zero) */ + HFSCatalogNodeID parentID; /* parent folder ID */ + Str31 nodeName; /* catalog node name */ +}; +typedef struct HFSCatalogKey HFSCatalogKey; +/* HFS Plus catalog key */ +struct HFSPlusCatalogKey { + UInt16 keyLength; /* key length (in bytes) */ + HFSCatalogNodeID parentID; /* parent folder ID */ + HFSUniStr255 nodeName; /* catalog node name */ +}; +typedef struct HFSPlusCatalogKey HFSPlusCatalogKey; + +/* Catalog record types */ +enum { + /* HFS Catalog Records */ + kHFSFolderRecord = 0x0100, /* Folder record */ + kHFSFileRecord = 0x0200, /* File record */ + kHFSFolderThreadRecord = 0x0300, /* Folder thread record */ + kHFSFileThreadRecord = 0x0400, /* File thread record */ + /* HFS Plus Catalog Records */ + kHFSPlusFolderRecord = 1, /* Folder record */ + kHFSPlusFileRecord = 2, /* File record */ + kHFSPlusFolderThreadRecord = 3, /* Folder thread record */ + kHFSPlusFileThreadRecord = 4 /* File thread record */ +}; + + +/* Catalog file record flags */ +enum { + kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */ + kHFSFileLockedMask = 0x0001, + kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */ + kHFSThreadExistsMask = 0x0002 +}; + + +/* HFS catalog folder record - 70 bytes */ +struct HFSCatalogFolder { + SInt16 recordType; /* record type */ + UInt16 flags; /* folder flags */ + UInt16 valence; /* folder valence */ + HFSCatalogNodeID folderID; /* folder ID */ + UInt32 createDate; /* date and time of creation */ + UInt32 modifyDate; /* date and time of last modification */ + UInt32 backupDate; /* date and time of last backup */ + DInfo userInfo; /* Finder information */ + DXInfo finderInfo; /* additional Finder information */ + UInt32 reserved[4]; /* reserved - set to zero */ +}; +typedef struct HFSCatalogFolder HFSCatalogFolder; +/* HFS Plus catalog folder record - 88 bytes */ +struct HFSPlusCatalogFolder { + SInt16 recordType; /* record type = HFS Plus folder record */ + UInt16 flags; /* file flags */ + UInt32 valence; /* folder's valence (limited to 2^16 in Mac OS) */ + HFSCatalogNodeID folderID; /* folder ID */ + UInt32 createDate; /* date and time of creation */ + UInt32 contentModDate; /* date and time of last content modification */ + UInt32 attributeModDate; /* date and time of last attribute modification */ + UInt32 accessDate; /* date and time of last access (Rhapsody only) */ + UInt32 backupDate; /* date and time of last backup */ + HFSPlusPermissions permissions; /* permissions (for Rhapsody) */ + DInfo userInfo; /* Finder information */ + DXInfo finderInfo; /* additional Finder information */ + UInt32 textEncoding; /* hint for name conversions */ + UInt32 reserved; /* reserved - set to zero */ +}; +typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder; +/* HFS catalog file record - 102 bytes */ +struct HFSCatalogFile { + SInt16 recordType; /* record type */ + UInt8 flags; /* file flags */ + SInt8 fileType; /* file type (unused ?) */ + FInfo userInfo; /* Finder information */ + HFSCatalogNodeID fileID; /* file ID */ + UInt16 dataStartBlock; /* not used - set to zero */ + SInt32 dataLogicalSize; /* logical EOF of data fork */ + SInt32 dataPhysicalSize; /* physical EOF of data fork */ + UInt16 rsrcStartBlock; /* not used - set to zero */ + SInt32 rsrcLogicalSize; /* logical EOF of resource fork */ + SInt32 rsrcPhysicalSize; /* physical EOF of resource fork */ + UInt32 createDate; /* date and time of creation */ + UInt32 modifyDate; /* date and time of last modification */ + UInt32 backupDate; /* date and time of last backup */ + FXInfo finderInfo; /* additional Finder information */ + UInt16 clumpSize; /* file clump size (not used) */ + HFSExtentRecord dataExtents; /* first data fork extent record */ + HFSExtentRecord rsrcExtents; /* first resource fork extent record */ + UInt32 reserved; /* reserved - set to zero */ +}; +typedef struct HFSCatalogFile HFSCatalogFile; +/* HFS Plus catalog file record - 248 bytes */ +struct HFSPlusCatalogFile { + SInt16 recordType; /* record type = HFS Plus file record */ + UInt16 flags; /* file flags */ + UInt32 reserved1; /* reserved - set to zero */ + HFSCatalogNodeID fileID; /* file ID */ + UInt32 createDate; /* date and time of creation */ + UInt32 contentModDate; /* date and time of last content modification */ + UInt32 attributeModDate; /* date and time of last attribute modification */ + UInt32 accessDate; /* date and time of last access (Rhapsody only) */ + UInt32 backupDate; /* date and time of last backup */ + HFSPlusPermissions permissions; /* permissions (for Rhapsody) */ + FInfo userInfo; /* Finder information */ + FXInfo finderInfo; /* additional Finder information */ + UInt32 textEncoding; /* hint for name conversions */ + UInt32 reserved2; /* reserved - set to zero */ + + /* start on double long (64 bit) boundry */ + HFSPlusForkData dataFork; /* size and block data for data fork */ + HFSPlusForkData resourceFork; /* size and block data for resource fork */ +}; +typedef struct HFSPlusCatalogFile HFSPlusCatalogFile; +/* HFS catalog thread record - 46 bytes */ +struct HFSCatalogThread { + SInt16 recordType; /* record type */ + SInt32 reserved[2]; /* reserved - set to zero */ + HFSCatalogNodeID parentID; /* parent ID for this catalog node */ + Str31 nodeName; /* name of this catalog node */ +}; +typedef struct HFSCatalogThread HFSCatalogThread; +/* HFS Plus catalog thread record -- 264 bytes */ +struct HFSPlusCatalogThread { + SInt16 recordType; /* record type */ + SInt16 reserved; /* reserved - set to zero */ + HFSCatalogNodeID parentID; /* parent ID for this catalog node */ + HFSUniStr255 nodeName; /* name of this catalog node (variable length) */ +}; +typedef struct HFSPlusCatalogThread HFSPlusCatalogThread; + +/* + These are the types of records in the attribute B-tree. The values were chosen + so that they wouldn't conflict with the catalog record types. +*/ +enum { + kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */ + kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */ + kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */ +}; + + +/* + HFSPlusAttrInlineData + For small attributes, whose entire value is stored within this one + B-tree record. + There would not be any other records for this attribute. +*/ +struct HFSPlusAttrInlineData { + UInt32 recordType; /* = kHFSPlusAttrInlineData*/ + UInt32 reserved; + UInt32 logicalSize; /* size in bytes of userData*/ + UInt8 userData[2]; /* variable length; space allocated is a multiple of 2 bytes*/ +}; +typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData; +/* + HFSPlusAttrForkData + For larger attributes, whose value is stored in allocation blocks. + If the attribute has more than 8 extents, there will be additonal + records (of type HFSPlusAttrExtents) for this attribute. +*/ +struct HFSPlusAttrForkData { + UInt32 recordType; /* = kHFSPlusAttrForkData*/ + UInt32 reserved; + HFSPlusForkData theFork; /* size and first extents of value*/ +}; +typedef struct HFSPlusAttrForkData HFSPlusAttrForkData; +/* + HFSPlusAttrExtents + This record contains information about overflow extents for large, + fragmented attributes. +*/ +struct HFSPlusAttrExtents { + UInt32 recordType; /* = kHFSPlusAttrExtents*/ + UInt32 reserved; + HFSPlusExtentRecord extents; /* additional extents*/ +}; +typedef struct HFSPlusAttrExtents HFSPlusAttrExtents; +/* A generic Attribute Record*/ +union HFSPlusAttrRecord { + UInt32 recordType; + HFSPlusAttrInlineData inlineData; + HFSPlusAttrForkData forkData; + HFSPlusAttrExtents overflowExtents; +}; +typedef union HFSPlusAttrRecord HFSPlusAttrRecord; +/* Key and node lengths */ +enum { + kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(UInt16), + kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(UInt8), + kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(UInt16), + kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(UInt16), + kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(UInt8), + kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - sizeof(Str31) + sizeof(UInt8), + kHFSPlusCatalogMinNodeSize = 4096, + kHFSPlusExtentMinNodeSize = 512, + kHFSPlusAttrMinNodeSize = 4096 +}; + + +/* HFS and HFS Plus volume attribute bits */ +enum { + /* Bits 0-6 are reserved (always cleared by MountVol call) */ + kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */ + kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */ + kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */ + kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */ + kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */ + /* Bits 12-14 are reserved for future use */ + kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */ + kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit, + kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit, + kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit, + kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit, + kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit, + kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit, + kHFSMDBAttributesMask = 0x8380 +}; + +/* Master Directory Block (HFS only) - 162 bytes */ +/* Stored at sector #2 (3rd sector) */ +struct HFSMasterDirectoryBlock { + + /* These first fields are also used by MFS */ + + UInt16 drSigWord; /* volume signature */ + UInt32 drCrDate; /* date and time of volume creation */ + UInt32 drLsMod; /* date and time of last modification */ + UInt16 drAtrb; /* volume attributes */ + UInt16 drNmFls; /* number of files in root folder */ + UInt16 drVBMSt; /* first block of volume bitmap */ + UInt16 drAllocPtr; /* start of next allocation search */ + UInt16 drNmAlBlks; /* number of allocation blocks in volume */ + UInt32 drAlBlkSiz; /* size (in bytes) of allocation blocks */ + UInt32 drClpSiz; /* default clump size */ + UInt16 drAlBlSt; /* first allocation block in volume */ + UInt32 drNxtCNID; /* next unused catalog node ID */ + UInt16 drFreeBks; /* number of unused allocation blocks */ + Str27 drVN; /* volume name */ + + /* Master Directory Block extensions for HFS */ + + UInt32 drVolBkUp; /* date and time of last backup */ + UInt16 drVSeqNum; /* volume backup sequence number */ + UInt32 drWrCnt; /* volume write count */ + UInt32 drXTClpSiz; /* clump size for extents overflow file */ + UInt32 drCTClpSiz; /* clump size for catalog file */ + UInt16 drNmRtDirs; /* number of directories in root folder */ + UInt32 drFilCnt; /* number of files in volume */ + UInt32 drDirCnt; /* number of directories in volume */ + SInt32 drFndrInfo[8]; /* information used by the Finder */ + UInt16 drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */ + HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */ + UInt32 drXTFlSize; /* size of extents overflow file */ + HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */ + UInt32 drCTFlSize; /* size of catalog file */ + HFSExtentRecord drCTExtRec; /* extent record for catalog file */ +}; +typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock; +/* HFSPlusVolumeHeader (HFS Plus only) - 512 bytes */ +/* Stored at sector #2 (3rd sector) and second-to-last sector. */ +struct HFSPlusVolumeHeader { + UInt16 signature; /* volume signature == 'H+' */ + UInt16 version; /* current version is kHFSPlusVersion */ + UInt32 attributes; /* volume attributes */ + UInt32 lastMountedVersion; /* implementation version which last mounted volume */ + UInt32 reserved; /* reserved - set to zero */ + + UInt32 createDate; /* date and time of volume creation */ + UInt32 modifyDate; /* date and time of last modification */ + UInt32 backupDate; /* date and time of last backup */ + UInt32 checkedDate; /* date and time of last disk check */ + + UInt32 fileCount; /* number of files in volume */ + UInt32 folderCount; /* number of directories in volume */ + + UInt32 blockSize; /* size (in bytes) of allocation blocks */ + UInt32 totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/ + UInt32 freeBlocks; /* number of unused allocation blocks */ + + UInt32 nextAllocation; /* start of next allocation search */ + UInt32 rsrcClumpSize; /* default resource fork clump size */ + UInt32 dataClumpSize; /* default data fork clump size */ + HFSCatalogNodeID nextCatalogID; /* next unused catalog node ID */ + + UInt32 writeCount; /* volume write count */ + UInt64 encodingsBitmap; /* which encodings have been use on this volume */ + + UInt8 finderInfo[32]; /* information used by the Finder */ + + HFSPlusForkData allocationFile; /* allocation bitmap file */ + HFSPlusForkData extentsFile; /* extents B-tree file */ + HFSPlusForkData catalogFile; /* catalog B-tree file */ + HFSPlusForkData attributesFile; /* extended attributes B-tree file */ + HFSPlusForkData startupFile; /* boot file */ +}; +typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader; +/* ---------- HFS and HFS Plus B-tree structures ---------- */ +/* BTNodeDescriptor -- Every B-tree node starts with these fields. */ +struct BTNodeDescriptor { + UInt32 fLink; /* next node at this level*/ + UInt32 bLink; /* previous node at this level*/ + SInt8 kind; /* kind of node (leaf, index, header, map)*/ + UInt8 height; /* zero for header, map; child is one more than parent*/ + UInt16 numRecords; /* number of records in this node*/ + UInt16 reserved; /* reserved; set to zero*/ +}; +typedef struct BTNodeDescriptor BTNodeDescriptor; +/* Constants for BTNodeDescriptor kind */ +enum { + kBTLeafNode = -1, + kBTIndexNode = 0, + kBTHeaderNode = 1, + kBTMapNode = 2 +}; + +/* BTHeaderRec -- The first record of a B-tree header node */ +struct BTHeaderRec { + UInt16 treeDepth; /* maximum height (usually leaf nodes)*/ + UInt32 rootNode; /* node number of root node*/ + UInt32 leafRecords; /* number of leaf records in all leaf nodes*/ + UInt32 firstLeafNode; /* node number of first leaf node*/ + UInt32 lastLeafNode; /* node number of last leaf node*/ + UInt16 nodeSize; /* size of a node, in bytes*/ + UInt16 maxKeyLength; /* reserved*/ + UInt32 totalNodes; /* total number of nodes in tree*/ + UInt32 freeNodes; /* number of unused (free) nodes in tree*/ + UInt16 reserved1; /* unused*/ + UInt32 clumpSize; /* reserved*/ + UInt8 btreeType; /* reserved*/ + UInt8 reserved2; /* reserved*/ + UInt32 attributes; /* persistent attributes about the tree*/ + UInt32 reserved3[16]; /* reserved*/ +}; +typedef struct BTHeaderRec BTHeaderRec; +/* Constants for BTHeaderRec attributes */ +enum { + kBTBadCloseMask = 0x00000001, /* reserved*/ + kBTBigKeysMask = 0x00000002, /* key length field is 16 bits*/ + kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length*/ +}; + + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=reset +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(pop) +#elif PRAGMA_STRUCT_PACK + #pragma pack() +#endif + +#ifdef PRAGMA_IMPORT_OFF +#pragma import off +#elif PRAGMA_IMPORT +#pragma import reset +#endif + + +#endif /* __HFSVOLUMES__ */ + |