1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
|
/* $Id: apfs.h $ */
/** @file
* IPRT, APFS (Apple File System) format.
*/
/*
* Copyright (C) 2019-2025 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 <https://www.gnu.org/licenses>.
*
* 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 <iprt/types.h>
#include <iprt/assertcompile.h>
/** @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 */
|