From 16f504a9dca3fe3b70568f67b7d41241ae485288 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 18:49:04 +0200 Subject: Adding upstream version 7.0.6-dfsg. Signed-off-by: Daniel Baumann --- include/iprt/formats/apfs.h | 244 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 include/iprt/formats/apfs.h (limited to 'include/iprt/formats/apfs.h') diff --git a/include/iprt/formats/apfs.h b/include/iprt/formats/apfs.h new file mode 100644 index 00000000..f45a37df --- /dev/null +++ b/include/iprt/formats/apfs.h @@ -0,0 +1,244 @@ +/* $Id: apfs.h $ */ +/** @file + * IPRT, APFS (Apple File System) format. + */ + +/* + * Copyright (C) 2019-2022 Oracle and/or its affiliates. + * + * This file is part of VirtualBox base platform packages, as + * available from https://www.virtualbox.org. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, in version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * The contents of this file may alternatively be used under the terms + * of the Common Development and Distribution License Version 1.0 + * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included + * in the VirtualBox distribution, in which case the provisions of the + * CDDL are applicable instead of those of the GPL. + * + * You may elect to license modified versions of this file under the + * terms and conditions of either the GPL or the CDDL or both. + * + * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0 + */ + +#ifndef IPRT_INCLUDED_formats_apfs_h +#define IPRT_INCLUDED_formats_apfs_h +#ifndef RT_WITHOUT_PRAGMA_ONCE +# pragma once +#endif + +#include +#include + + +/** @defgroup grp_rt_formats_apfs Apple File System structures and definitions + * @ingroup grp_rt_formats + * @{ + */ + +/* + * The filesystem structures were retrieved from: + * https://developer.apple.com/support/downloads/Apple-File-System-Reference.pdf + */ + +/** Physical address of an on-disk block. */ +typedef int64_t APFSPADDR; +/** Object identifier. */ +typedef uint64_t APFSOID; +/** Transaction identifier. */ +typedef uint64_t APFSXID; + +/** Invalid object ID. */ +#define APFS_OID_INVALID UINT64_C(0) +/** Number of reserved object IDs for special structures. */ +#define APFS_OID_RSVD_CNT 1024 +/** Object ID of a super block. */ +#define APFS_OID_NX_SUPERBLOCK UINT64_C(1) + + +/** + * Range of physical addresses. + */ +typedef struct +{ + /** Start address of the range. */ + APFSPADDR PAddrStart; + /** Size of the range in blocks.*/ + uint64_t cBlocks; +} APFSPRANGE; +/** Pointer to a APFS range. */ +typedef APFSPRANGE *PAPFSPRANGE; +/** Pointer to a const APFS range. */ +typedef const APFSPRANGE *PCAPFSPRANGE; + +/** APFS UUID (compatible with our UUID definition). */ +typedef RTUUID APFSUUID; + +/** Maximum object checksum size. */ +#define APFS_OBJ_MAX_CHKSUM_SZ 8 + +/** + * APFS Object header. + */ +typedef struct APFSOBJPHYS +{ + /** The stored checksum of the object. */ + uint8_t abChkSum[APFS_OBJ_MAX_CHKSUM_SZ]; + /** Object ID. */ + APFSOID Oid; + /** Transaction ID. */ + APFSXID Xid; + /** Object type. */ + uint32_t u32Type; + /** Object sub type. */ + uint32_t u32SubType; +} APFSOBJPHYS; +/** Pointer to an APFS object header. */ +typedef APFSOBJPHYS *PAPFSOBJPHYS; +/** Pointer to a const APFS object header. */ +typedef const APFSOBJPHYS *PCAPFSOBJPHYS; + +#define APFS_OBJECT_TYPE_MASK UINT32_C(0x0000ffff) +#define APFS_OBJECT_TYPE_FLAGS_MASK UINT32_C(0xffff0000) + +/** + * APFS EFI jumpstart information. + */ +typedef struct APFSEFIJMPSTART +{ + /** Object header. */ + APFSOBJPHYS ObjHdr; + /** The magic value. */ + uint32_t u32Magic; + /** The version of the structure. */ + uint32_t u32Version; + /** EFI file length in bytes. */ + uint32_t cbEfiFile; + /** Number of extents describing the on disk blocks the file is stored in. */ + uint32_t cExtents; + /** Reserved. */ + uint64_t au64Rsvd0[16]; + /** After this comes a variable size of APFSPRANGE extent structures. */ +} APFSEFIJMPSTART; +/** Pointer to an APFS EFI jumpstart structure. */ +typedef APFSEFIJMPSTART *PAPFSEFIJMPSTART; +/** Pointer to a const APFS EFI jumpstart structure. */ +typedef const APFSEFIJMPSTART *PCAPFSEFIJMPSTART; + +/** EFI jumpstart magic ('RDSJ'). */ +#define APFS_EFIJMPSTART_MAGIC RT_MAKE_U32_FROM_U8('J', 'S', 'D', 'R') +/** EFI jumpstart version. */ +#define APFS_EFIJMPSTART_VERSION UINT32_C(1) + +/** Maximum number of filesystems supported in a single container. */ +#define APFS_NX_SUPERBLOCK_FS_MAX UINT32_C(100) +/** Maximum number of counters in the superblock. */ +#define APFS_NX_SUPERBLOCK_COUNTERS_MAX UINT32_C(32) +/** Number of entries in the ephemeral information array. */ +#define APFS_NX_SUPERBLOCK_EPH_INFO_COUNT UINT32_C(4) + +/** + * APFS super block. + */ +typedef struct +{ + /** Object header. */ + APFSOBJPHYS ObjHdr; + /** The magic value. */ + uint32_t u32Magic; + /** Block size in bytes. */ + uint32_t cbBlock; + /** Number of blocks in the volume. */ + uint64_t cBlocks; + /** Feature flags of the volume. */ + uint64_t fFeatures; + /** Readonly compatible features. */ + uint64_t fRdOnlyCompatFeatures; + /** Incompatible features. */ + uint64_t fIncompatFeatures; + /** UUID of the volume. */ + APFSUUID Uuid; + /** Next free object identifier to use for new objects. */ + APFSOID OidNext; + /** Next free transaction identifier to use for new transactions. */ + APFSOID XidNext; + /** Number of blocks used by the checkpoint descriptor area. */ + uint32_t cXpDescBlocks; + /** Number of blocks used by the checkpoint data area. */ + uint32_t cXpDataBlocks; + /** Base address of checkpoint descriptor area. */ + APFSPADDR PAddrXpDescBase; + /** Base address of checkpoint data area. */ + APFSPADDR PAddrXpDataBase; + /** Next index to use in the checkpoint descriptor area. */ + uint32_t idxXpDescNext; + /** Next index to use in the checkpoint data area. */ + uint32_t idxXpDataNext; + /** Number of blocks in the checkpoint descriptor area used by the checkpoint that this superblock belongs to. */ + uint32_t cXpDescLen; + /** Index of the first valid item in the checkpoint data area. */ + uint32_t idxXpDataFirst; + /** Number of blocks in the checkpoint data area used by the checkpoint that this superblock belongs to. */ + uint32_t cXpDataLen; + /** Ephemeral object identifer of the space manager. */ + APFSOID OidSpaceMgr; + /** Physical object identifier for the containers object map. */ + APFSOID OidOMap; + /** Ephemeral object identifer for the reaper. */ + APFSOID OidReaper; + /** Reserved for testing should be always zero on disk. */ + uint32_t u32TestType; + /** Maximum number of filesystems which can be stored in this container. */ + uint32_t cFsMax; + /** Array of filesystem object identifiers. */ + APFSOID aFsOids[APFS_NX_SUPERBLOCK_FS_MAX]; + /** Array of counters primarily used during debugging. */ + uint64_t aCounters[APFS_NX_SUPERBLOCK_COUNTERS_MAX]; + /** Range of blocks where no space will be allocated, used for shrinking a partition. */ + APFSPRANGE RangeBlocked; + /** Physical object identifier of a tree keeping track of objects needing to be moved out of the block range. */ + APFSOID OidTreeEvictMapping; + /** Container flags. */ + uint64_t fFlags; + /** Address of the EFI jumpstart structure. */ + APFSPADDR PAddrEfiJmpStart; + /** UUID of the containers Fusion set if available. */ + APFSUUID UuidFusion; + /** Address of the containers keybag. */ + APFSPADDR PAddrKeyLocker; + /** Array of fields used in the management of ephemeral data. */ + uint64_t au64EphemeralInfo[APFS_NX_SUPERBLOCK_EPH_INFO_COUNT]; + /** Reserved for testing. */ + APFSOID OidTest; + /** Physical object identifier of the Fusion middle tree. */ + APFSOID OidFusionMt; + /** Ephemeral object identifier of the Fusion write-back cache state. */ + APFSOID OidFusionWbc; + /** Blocks used for the Fusion write-back cache area. */ + APFSPRANGE RangeFusionWbc; +} APFSNXSUPERBLOCK; +/** Pointer to a APFS super block structure. */ +typedef APFSNXSUPERBLOCK *PAPFSNXSUPERBLOCK; +/** Pointer to a const APFS super block structure. */ +typedef const APFSNXSUPERBLOCK *PCAPFSNXSUPERBLOCK; + +/** Superblock magic value ('BSXN'). */ +#define APFS_NX_SUPERBLOCK_MAGIC RT_MAKE_U32_FROM_U8('N', 'X', 'S', 'B') + +/** @} */ + +#endif /* !IPRT_INCLUDED_formats_apfs_h */ + -- cgit v1.2.3