04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @file
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * IPRT - Hierarchical File System (HFS).
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/*
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * Copyright (C) 2009-2013 Oracle Corporation
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync *
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * available from http://www.virtualbox.org. This file is free software;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * General Public License (GPL) as published by the Free Software
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync *
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * The contents of this file may alternatively be used under the terms
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * of the Common Development and Distribution License Version 1.0
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * VirtualBox OSE distribution, in which case the provisions of the
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * CDDL are applicable instead of those of the GPL.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync *
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * You may elect to license modified versions of this file under the
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * terms and conditions of either the GPL or the CDDL or both.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#ifndef ___iprt_formats_hfs_h
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define ___iprt_formats_hfs_h
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#include <iprt/types.h>
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#include <iprt/assert.h>
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @defgroup grp_rt_fmt_hfs HFS - Hierarchical File System.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name HFS signature words (HFSPlusVolumeHeader::signature)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSSigWord UINT16_C(0x4244)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusSigWord UINT16_C(0x482b)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSXSigWord UINT16_C(0x4858)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name HFS version numbers (HFSPlusVolumeHeader::version).
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusVersion UINT16_C(4)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSXVersion UINT16_C(5)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name HFS mount version numbers (HFSPlusVolumeHeader::lastMountedVersion).
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusMountVersion UINT32_C(0x31302e30)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSJMountVersion UINT32_C(0x4846534a)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kFSKMountVersion UINT32_C(0x46534b21)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Hard link file creators & types.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHardLinkFileType UINT32_C(0x686c6e6b)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusCreator UINT32_C(0x6866732b)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Symlink file creators & types.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kSymLinkFileType UINT32_C(0x736c6e6b)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kSymLinkCreator UINT32_C(0x72686170)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Name limits.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSMaxVolumeNameChars UINT8_C(0x1b)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSMaxFileNameChars UINT8_C(0x1f)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusMaxFileNameChars UINT8_C(0xff)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSMaxAttrNameLen UINT8_C(0x7f)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Extent descriptor record densities
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSExtentDensity UINT8_C(3)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusExtentDensity UINT8_C(8)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name File IDs (various fileID members).
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSRootParentID UINT32_C(0x00000001)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSRootFolderID UINT32_C(0x00000002)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSExtentsFileID UINT32_C(0x00000003)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCatalogFileID UINT32_C(0x00000004)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSBadBlockFileID UINT32_C(0x00000005)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSAllocationFileID UINT32_C(0x00000006)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSStartupFileID UINT32_C(0x00000007)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSAttributesFileID UINT32_C(0x00000008)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSAttributeDataFileID UINT32_C(0x0000000c)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSRepairCatalogFileID UINT32_C(0x0000000e)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSBogusExtentFileID UINT32_C(0x0000000f)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSFirstUserCatalogNodeID UINT32_C(0x00000010)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync/** @name Catalog record types.
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync * @{ */
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFolderRecord UINT16_C(0x0100)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFileRecord UINT16_C(0x0200)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFolderThreadRecord UINT16_C(0x0300)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFileThreadRecord UINT16_C(0x0400)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSPlusFolderRecord UINT16_C(0x0001)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSPlusFileRecord UINT16_C(0x0002)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSPlusFolderThreadRecord UINT16_C(0x0003)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSPlusFileThreadRecord UINT16_C(0x0004)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync/** @} */
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync/** @name File record bits and masks.
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync * @{ */
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFileLockedBit 0
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSThreadExistsBit 1
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasAttributesBit 2
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasSecurityBit 3
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasFolderCountBit 4
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasLinkChainBit 5
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasChildLinkBit 6
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasDateAddedBit 7
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSFileLockedMask RT_BIT(kHFSFileLockedBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSThreadExistsMask RT_BIT(kHFSThreadExistsBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasAttributesMask RT_BIT(kHFSHasAttributesBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasSecurityMask RT_BIT(kHFSHasSecurityBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasFolderCountMask RT_BIT(kHFSHasFolderCountBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasLinkChainMask RT_BIT(kHFSHasLinkChainBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasChildLinkMask RT_BIT(kHFSHasChildLinkBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync#define kHFSHasDateAddedMask RT_BIT(kHFSHasDateAddedBit)
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync/** @} */
3b6c75a220781d6589147e6a9e3987ea65fbb912vboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Key and node lengths.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusAttrKeyMaximumLength ( sizeof(HFSPlusAttrKey) - sizeof(uint16_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusAttrKeyMinimumLength ( kHFSPlusAttrKeyMaximumLength - (kHFSMaxAttrNameLen * sizeof(uint16_t)) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusExtentKeyMaximumLength ( sizeof(HFSPlusExtentKey) - sizeof(uint16_t),
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSExtentKeyMaximumLength ( sizeof(HFSExtentKey) - sizeof(uint8_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusCatalogKeyMaximumLength ( sizeof(HFSPlusCatalogKey) - sizeof(uint16_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusCatalogKeyMinimumLength ( kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(uint16_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCatalogKeyMaximumLength ( sizeof(HFSCatalogKey) - sizeof(uint8_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCatalogKeyMinimumLength ( kHFSCatalogKeyMaximumLength - kHFSMaxFileNameChars - 1 + sizeof(uint8_t) )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusCatalogMinNodeSize UINT16_C(0x1000)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusExtentMinNodeSize UINT16_C(0x0200)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSPlusAttrMinNodeSize UINT16_C(0x1000)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Volume Attribute bits and masks.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @remarks HFS has only 16-bit wide field, HFS+ has 32-bit.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeHardwareLockBit 7
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeUnmountedBit 8
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeSparedBlocksBit 9
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeNoCacheRequiredBit 10
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSBootVolumeInconsistentBit 11
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCatalogNodeIDsReusedBit 12
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeJournaledBit 13
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeInconsistentBit 14
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeSoftwareLockBit 15
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSUnusedNodeFixBit 31
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSContentProtectionBit 30
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeHardwareLockMask RT_BIT(kHFSVolumeHardwareLockBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeUnmountedMask RT_BIT(kHFSVolumeUnmountedBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeSparedBlocksMask RT_BIT(kHFSVolumeSparedBlocksBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeNoCacheRequiredMask RT_BIT(kHFSVolumeNoCacheRequiredBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSBootVolumeInconsistentMask RT_BIT(kHFSBootVolumeInconsistentBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCatalogNodeIDsReusedMask RT_BIT(kHFSCatalogNodeIDsReusedBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeJournaledMask RT_BIT(kHFSVolumeJournaledBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeInconsistentMask RT_BIT(kHFSVolumeInconsistentBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSVolumeSoftwareLockMask RT_BIT(kHFSVolumeSoftwareLockBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSUnusedNodeFixMask RT_BIT(kHFSUnusedNodeFixBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSContentProtectionMask RT_BIT(kHFSContentProtectionBit)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSMDBAttributesMask UINT16_C(0x8380)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Misc
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSUnusedNodesFixDate UINT32_C(0xc5ef2480)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFSPLUSMETADATAFOLDER "\xE2\x90\x80\xE2\x90\x80\xE2\x90\x80\xE2\x90\x80HFS+ Private Data"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFSPLUS_DIR_METADATA_FOLDER ".HFS+ Private Directory Data\xd"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFS_INODE_PREFIX "iNode"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFS_DELETE_PREFIX "temp"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFS_DIRINODE_PREFIX "dir_"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define FIRST_LINK_XATTR_NAME "com.apple.system.hfs.firstlink"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define FIRST_LINK_XATTR_REC_SIZE ( sizeof(HFSPlusAttrData) + 10 )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/* {b3e20f39-f292-11d6-97a4-00306543ecac} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define HFS_UUID_NAMESPACE_ID "\xB3\xE2\x0F\x39\xF2\x92\x11\xD6\x97\xA4\x00\x30\x65\x43\xEC\xAC"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define SET_HFS_TEXT_ENCODING(a_uHint) (UINT32_C(0x656e6300) | (uint8_t)(a_uHint))
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define GET_HFS_TEXT_ENCODING(a_uHint) ( ((a_uHint) & UINT32_C(0xffffff00)) == UINT32_C(0x656e6300) \
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync ? UINT32_C(0x000000ff)(a_uHint) : UINT32_MAX)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name B-tree stuff.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kMaxKeyLength 520
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTLeafNode (-1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTIndexNode 0
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTHeaderNode 1
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTMapNode 2
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTBadCloseMask RT_BIT_32(0)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTBigKeysMask RT_BIT_32(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kBTVariableIndexKeysMask RT_BIT_32(2)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name B-tree compare types (BTHeaderRec::keyCompareType) */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSCaseFolding UINT8_C(0xcf)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kHFSBinaryCompare UINT8_C(0xbc)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @name Journal stuff.
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync * @{ */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define JIB_RESERVED_SIZE ( sizeof(uint32_t) * 32 - 85 )
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kJIJournalInFSMask RT_BIT_32(0)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kJIJournalOnOtherDeviceMask RT_BIT_32(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define kJIJournalNeedInitMask RT_BIT_32(2)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#define EXTJNL_CONTENT_TYPE_UUID "4a6f7572-6e61-11aa-aa11-00306543ecac"
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSUniStr255
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t length;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync RTUTF16 unicode[255];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSUniStr255;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSUniStr255, 0x200);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef const HFSUniStr255 * ConstHFSUniStr255Param;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSExtentKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t keyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t forkType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileID; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t startBLock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSExtentKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSExtentKey, 8);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusExtentKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t keyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t forkType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t pad;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t startBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusExtentKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusExtentKey, 12);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSExtentDescriptor
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t startBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t blockCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSExtentDescriptor;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSExtentDescriptor, 4);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusExtentDescriptor
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t startBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t blockCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusExtentDescriptor;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusExtentDescriptor, 8);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef HFSExtentDescriptor HFSExtentRecord[3];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct FndrFileInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fdType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fdCreator;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t fdFlags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync struct
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync {
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t v;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t h;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync } fdLocation;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t opaque;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} FndrFileInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(FndrFileInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct FndrDirInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync struct
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync {
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t top;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t left;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t bottom;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t right;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync } frRect;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t frFlags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync struct
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync {
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t v;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t h;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync } fdLocation;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t opaque;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} FndrDirInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(FndrDirInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct FndrOpaqueInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int8_t opaque[16];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} FndrOpaqueInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(FndrOpaqueInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct FndrExtendedFileInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved1;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t date_added;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t extended_flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t reserved2;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved3;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} FndrExtendedFileInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(FndrExtendedFileInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct FndrExtendedDirInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t point;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t date_added;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t extended_flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t reserved3;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved4;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} FndrExtendedDirInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(FndrExtendedDirInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusForkData
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint64_t logicalSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t clumpSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t totalBlocks;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusExtentRecord extents;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusForkData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusForkData, 80);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusBSDInfo
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t ownerID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t groupID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t adminFlags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t ownerFlags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t fileMode;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync union
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync {
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t iNodeNum;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t linkCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t rawDevice;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync } special;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusBSDInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusBSDInfo, 16);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSCatalogKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t keyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t reserved;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t parentID; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t nodeName[kHFSMaxFileNameChars + 1];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSCatalogKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSCatalogKey, 0x26);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusCatalogKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t keyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t parentID; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSUniStr255 nodeName;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusCatalogKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusCatalogKey, 0x206);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSCatalogFolder
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t valence;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t folderID; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t createDate; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t modifyDate; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t backupDate; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrDirInfo userInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrOpaqueInfo finderInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved[4]; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSCatalogFolder;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSCatalogFolder, 70);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusCatalogFolder
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t valence;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t folderID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t createDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t contentModDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t attributeModDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t accessDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t backupDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusBSDInfo bsdInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrDirInfo userInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrOpaqueInfo finderInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t textEncoding;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t folderCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusCatalogFolder;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusCatalogFolder, 88);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSCatalogFile
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t fileType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrFileInfo userInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t dataStartBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int32_t dataLogicalSize; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int32_t dataPhysicalSize; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t rsrcStartBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int32_t rsrcLogicalSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int32_t rsrcPhysicalSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t createDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t modifyDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t backupDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrOpaqueInfo finderInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t clumpSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSExtentRecord dataExtents; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSExtentRecord rsrcExtents; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSCatalogFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSCatalogFile, 102);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusCatalogFile
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved1;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t createDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t contentModDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t attributeModDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t accessDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t backupDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusBSDInfo bsdInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrFileInfo userInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync FndrOpaqueInfo finderInfo;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t textEncoding;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved2;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData dataFork;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData resourceFork;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusCatalogFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileMemberAlignment(HFSPlusCatalogFile, dataFork, 8);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusCatalogFile, 248);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSCatalogThread
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int32_t reserved[2];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t parentID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t nodeName[kHFSMaxFileNameChars + 1];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSCatalogThread;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSCatalogThread, 46);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusCatalogThread
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int16_t reserved;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t parentID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSUniStr255 nodeName;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusCatalogThread;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusCatalogThread, 0x208);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusAttrForkData
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData theFork;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrForkData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrForkData, 88);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusAttrExtents
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusExtentRecord extents;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrExtents;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrExtents, 72);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusAttrData
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved[2];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t attrSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t attrData[2]; /**< Causes misaligned struct size. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrData, 18);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusAttrInlineData
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t logicalSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t userData[2]; /**< Causes misaligned struct size. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrInlineData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrInlineData, 14);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef union HFSPlusAttrRecord
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t recordType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusAttrInlineData inlineData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusAttrData attrData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusAttrForkData forkData;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusAttrExtents overflowExtents;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrRecord;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrRecord, 88);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusAttrKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t keyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t pad;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t startBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t attrNameLen;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync RTUTF16 attrName[kHFSMaxAttrNameLen];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusAttrKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusAttrKey, 268);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSMasterDirectoryBlock
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drSigWord;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drCrDate; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drLsMod; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drAtrb;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drNmFls;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drVBMSt;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drAllocPtr;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drNmAlBlks;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drAlBlkSiz;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drClpSiz;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drAlBlSt;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drNxCNID; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drFreeBks;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t drVN[kHFSMaxVolumeNameChars + 1];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drVolBkUp;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drVSeqNum;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drWrCnt; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drXTClpSiz; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drCTClpSiz; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drNmRtDirs;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drFilCnt;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drDirCnt;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drFndrInfo[8];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t drEmbedSigWord;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSExtentDescriptor drEmbedExtent;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drXTFlSize; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSExtentRecord drXTExtRec;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t drCTFlSize; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSExtentRecord drCTExtRec;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSMasterDirectoryBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSMasterDirectoryBlock, 162);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct HFSPlusVolumeHeader
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t signature;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t version;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t attributes;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t lastMountedVersion;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t journalInfoBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t createDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t modifyDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t backupDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t checkedDate;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fileCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t folderCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t blockSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t totalBlocks;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t freeBlocks;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t nextAllocation;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t rsrcClumpSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t dataClumpSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t nextCatalogID;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t writeCount;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint64_t encodingsBitmap;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t finderInfo[32];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData allocationFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData extentsFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData catalogFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData attributesFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync HFSPlusForkData startupFile;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} HFSPlusVolumeHeader;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileMemberAlignment(HFSPlusVolumeHeader, nextCatalogID, 8);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(HFSPlusVolumeHeader, 512);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef union BTreeKey
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t length8;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t length16;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t rawData[kMaxKeyLength + 2];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} BTreeKey;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(BTreeKey, 522);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct BTNodeDescriptor
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t fLink;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t bLink;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync int8_t kind;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t height;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t numRecords;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t reserved; /**< Causes struct size misalignment. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} BTNodeDescriptor;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(BTNodeDescriptor, 14);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct BTHeaderRec
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t treeDepth;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t rootNode; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t leafRecords; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t firstLeafNode; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t lastLeafNode; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t nodeSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t maxKeyLength;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t totalNodes; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t freeNodes; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint16_t reserved1;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t clumpSize;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t btreeType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint8_t keyCompareType;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t attributes; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t reserved3[16]; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} BTHeaderRec;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(BTHeaderRec, 106);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack(1)
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsynctypedef struct JournalInfoBlock
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync{
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t flags;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint32_t devices_signature[8];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint64_t offset; /**< Misaligned (morons). */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync uint64_t size; /**< Misaligned. */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync char ext_jnl_uuid[37];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync char machine_serial_num[48];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync char reserved[JIB_RESERVED_SIZE];
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync} JournalInfoBlock;
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#pragma pack()
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsyncAssertCompileSize(JournalInfoBlock, 180);
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync/** @} */
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync#endif
04e99ab06175db8adcd8ddaf15976588f22327cfvboxsync