VirtualBox

source: vbox/trunk/include/iprt/formats/apfs.h@ 93488

Last change on this file since 93488 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1/* $Id: apfs.h 93115 2022-01-01 11:31:46Z vboxsync $ */
2/** @file
3 * IPRT, APFS (Apple File System) format.
4 */
5
6/*
7 * Copyright (C) 2019-2022 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef IPRT_INCLUDED_formats_apfs_h
28#define IPRT_INCLUDED_formats_apfs_h
29#ifndef RT_WITHOUT_PRAGMA_ONCE
30# pragma once
31#endif
32
33#include <iprt/types.h>
34#include <iprt/assertcompile.h>
35
36
37/** @defgroup grp_rt_formats_apfs Apple File System structures and definitions
38 * @ingroup grp_rt_formats
39 * @{
40 */
41
42/*
43 * The filesystem structures were retrieved from:
44 * https://developer.apple.com/support/downloads/Apple-File-System-Reference.pdf
45 */
46
47/** Physical address of an on-disk block. */
48typedef int64_t APFSPADDR;
49/** Object identifier. */
50typedef uint64_t APFSOID;
51/** Transaction identifier. */
52typedef uint64_t APFSXID;
53
54/** Invalid object ID. */
55#define APFS_OID_INVALID UINT64_C(0)
56/** Number of reserved object IDs for special structures. */
57#define APFS_OID_RSVD_CNT 1024
58/** Object ID of a super block. */
59#define APFS_OID_NX_SUPERBLOCK UINT64_C(1)
60
61
62/**
63 * Range of physical addresses.
64 */
65typedef struct
66{
67 /** Start address of the range. */
68 APFSPADDR PAddrStart;
69 /** Size of the range in blocks.*/
70 uint64_t cBlocks;
71} APFSPRANGE;
72/** Pointer to a APFS range. */
73typedef APFSPRANGE *PAPFSPRANGE;
74/** Pointer to a const APFS range. */
75typedef const APFSPRANGE *PCAPFSPRANGE;
76
77/** APFS UUID (compatible with our UUID definition). */
78typedef RTUUID APFSUUID;
79
80/** Maximum object checksum size. */
81#define APFS_OBJ_MAX_CHKSUM_SZ 8
82
83/**
84 * APFS Object header.
85 */
86typedef struct APFSOBJPHYS
87{
88 /** The stored checksum of the object. */
89 uint8_t abChkSum[APFS_OBJ_MAX_CHKSUM_SZ];
90 /** Object ID. */
91 APFSOID Oid;
92 /** Transaction ID. */
93 APFSXID Xid;
94 /** Object type. */
95 uint32_t u32Type;
96 /** Object sub type. */
97 uint32_t u32SubType;
98} APFSOBJPHYS;
99/** Pointer to an APFS object header. */
100typedef APFSOBJPHYS *PAPFSOBJPHYS;
101/** Pointer to a const APFS object header. */
102typedef const APFSOBJPHYS *PCAPFSOBJPHYS;
103
104#define APFS_OBJECT_TYPE_MASK UINT32_C(0x0000ffff)
105#define APFS_OBJECT_TYPE_FLAGS_MASK UINT32_C(0xffff0000)
106
107/**
108 * APFS EFI jumpstart information.
109 */
110typedef struct APFSEFIJMPSTART
111{
112 /** Object header. */
113 APFSOBJPHYS ObjHdr;
114 /** The magic value. */
115 uint32_t u32Magic;
116 /** The version of the structure. */
117 uint32_t u32Version;
118 /** EFI file length in bytes. */
119 uint32_t cbEfiFile;
120 /** Number of extents describing the on disk blocks the file is stored in. */
121 uint32_t cExtents;
122 /** Reserved. */
123 uint64_t au64Rsvd0[16];
124 /** After this comes a variable size of APFSPRANGE extent structures. */
125} APFSEFIJMPSTART;
126/** Pointer to an APFS EFI jumpstart structure. */
127typedef APFSEFIJMPSTART *PAPFSEFIJMPSTART;
128/** Pointer to a const APFS EFI jumpstart structure. */
129typedef const APFSEFIJMPSTART *PCAPFSEFIJMPSTART;
130
131/** EFI jumpstart magic ('RDSJ'). */
132#define APFS_EFIJMPSTART_MAGIC RT_MAKE_U32_FROM_U8('J', 'S', 'D', 'R')
133/** EFI jumpstart version. */
134#define APFS_EFIJMPSTART_VERSION UINT32_C(1)
135
136/** Maximum number of filesystems supported in a single container. */
137#define APFS_NX_SUPERBLOCK_FS_MAX UINT32_C(100)
138/** Maximum number of counters in the superblock. */
139#define APFS_NX_SUPERBLOCK_COUNTERS_MAX UINT32_C(32)
140/** Number of entries in the ephemeral information array. */
141#define APFS_NX_SUPERBLOCK_EPH_INFO_COUNT UINT32_C(4)
142
143/**
144 * APFS super block.
145 */
146typedef struct
147{
148 /** Object header. */
149 APFSOBJPHYS ObjHdr;
150 /** The magic value. */
151 uint32_t u32Magic;
152 /** Block size in bytes. */
153 uint32_t cbBlock;
154 /** Number of blocks in the volume. */
155 uint64_t cBlocks;
156 /** Feature flags of the volume. */
157 uint64_t fFeatures;
158 /** Readonly compatible features. */
159 uint64_t fRdOnlyCompatFeatures;
160 /** Incompatible features. */
161 uint64_t fIncompatFeatures;
162 /** UUID of the volume. */
163 APFSUUID Uuid;
164 /** Next free object identifier to use for new objects. */
165 APFSOID OidNext;
166 /** Next free transaction identifier to use for new transactions. */
167 APFSOID XidNext;
168 /** Number of blocks used by the checkpoint descriptor area. */
169 uint32_t cXpDescBlocks;
170 /** Number of blocks used by the checkpoint data area. */
171 uint32_t cXpDataBlocks;
172 /** Base address of checkpoint descriptor area. */
173 APFSPADDR PAddrXpDescBase;
174 /** Base address of checkpoint data area. */
175 APFSPADDR PAddrXpDataBase;
176 /** Next index to use in the checkpoint descriptor area. */
177 uint32_t idxXpDescNext;
178 /** Next index to use in the checkpoint data area. */
179 uint32_t idxXpDataNext;
180 /** Number of blocks in the checkpoint descriptor area used by the checkpoint that this superblock belongs to. */
181 uint32_t cXpDescLen;
182 /** Index of the first valid item in the checkpoint data area. */
183 uint32_t idxXpDataFirst;
184 /** Number of blocks in the checkpoint data area used by the checkpoint that this superblock belongs to. */
185 uint32_t cXpDataLen;
186 /** Ephemeral object identifer of the space manager. */
187 APFSOID OidSpaceMgr;
188 /** Physical object identifier for the containers object map. */
189 APFSOID OidOMap;
190 /** Ephemeral object identifer for the reaper. */
191 APFSOID OidReaper;
192 /** Reserved for testing should be always zero on disk. */
193 uint32_t u32TestType;
194 /** Maximum number of filesystems which can be stored in this container. */
195 uint32_t cFsMax;
196 /** Array of filesystem object identifiers. */
197 APFSOID aFsOids[APFS_NX_SUPERBLOCK_FS_MAX];
198 /** Array of counters primarily used during debugging. */
199 uint64_t aCounters[APFS_NX_SUPERBLOCK_COUNTERS_MAX];
200 /** Range of blocks where no space will be allocated, used for shrinking a partition. */
201 APFSPRANGE RangeBlocked;
202 /** Physical object identifier of a tree keeping track of objects needing to be moved out of the block range. */
203 APFSOID OidTreeEvictMapping;
204 /** Container flags. */
205 uint64_t fFlags;
206 /** Address of the EFI jumpstart structure. */
207 APFSPADDR PAddrEfiJmpStart;
208 /** UUID of the containers Fusion set if available. */
209 APFSUUID UuidFusion;
210 /** Address of the containers keybag. */
211 APFSPADDR PAddrKeyLocker;
212 /** Array of fields used in the management of ephemeral data. */
213 uint64_t au64EphemeralInfo[APFS_NX_SUPERBLOCK_EPH_INFO_COUNT];
214 /** Reserved for testing. */
215 APFSOID OidTest;
216 /** Physical object identifier of the Fusion middle tree. */
217 APFSOID OidFusionMt;
218 /** Ephemeral object identifier of the Fusion write-back cache state. */
219 APFSOID OidFusionWbc;
220 /** Blocks used for the Fusion write-back cache area. */
221 APFSPRANGE RangeFusionWbc;
222} APFSNXSUPERBLOCK;
223/** Pointer to a APFS super block structure. */
224typedef APFSNXSUPERBLOCK *PAPFSNXSUPERBLOCK;
225/** Pointer to a const APFS super block structure. */
226typedef const APFSNXSUPERBLOCK *PCAPFSNXSUPERBLOCK;
227
228/** Superblock magic value ('BSXN'). */
229#define APFS_NX_SUPERBLOCK_MAGIC RT_MAKE_U32_FROM_U8('N', 'X', 'S', 'B')
230
231/** @} */
232
233#endif /* !IPRT_INCLUDED_formats_apfs_h */
234
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette