1
0
Fork 0
virtualbox/include/iprt/formats/apfs.h
Daniel Baumann df1bda4fe9
Adding upstream version 7.0.20-dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 09:56:04 +02:00

244 lines
9.2 KiB
C

/* $Id: apfs.h $ */
/** @file
* IPRT, APFS (Apple File System) format.
*/
/*
* Copyright (C) 2019-2023 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 */