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. */
|
---|
48 | typedef int64_t APFSPADDR;
|
---|
49 | /** Object identifier. */
|
---|
50 | typedef uint64_t APFSOID;
|
---|
51 | /** Transaction identifier. */
|
---|
52 | typedef 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 | */
|
---|
65 | typedef 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. */
|
---|
73 | typedef APFSPRANGE *PAPFSPRANGE;
|
---|
74 | /** Pointer to a const APFS range. */
|
---|
75 | typedef const APFSPRANGE *PCAPFSPRANGE;
|
---|
76 |
|
---|
77 | /** APFS UUID (compatible with our UUID definition). */
|
---|
78 | typedef RTUUID APFSUUID;
|
---|
79 |
|
---|
80 | /** Maximum object checksum size. */
|
---|
81 | #define APFS_OBJ_MAX_CHKSUM_SZ 8
|
---|
82 |
|
---|
83 | /**
|
---|
84 | * APFS Object header.
|
---|
85 | */
|
---|
86 | typedef 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. */
|
---|
100 | typedef APFSOBJPHYS *PAPFSOBJPHYS;
|
---|
101 | /** Pointer to a const APFS object header. */
|
---|
102 | typedef 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 | */
|
---|
110 | typedef 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. */
|
---|
127 | typedef APFSEFIJMPSTART *PAPFSEFIJMPSTART;
|
---|
128 | /** Pointer to a const APFS EFI jumpstart structure. */
|
---|
129 | typedef 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 | */
|
---|
146 | typedef 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. */
|
---|
224 | typedef APFSNXSUPERBLOCK *PAPFSNXSUPERBLOCK;
|
---|
225 | /** Pointer to a const APFS super block structure. */
|
---|
226 | typedef 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 |
|
---|