Index: trunk/include/iprt/formats/apfs.h
===================================================================
--- trunk/include/iprt/formats/apfs.h	(revision 81595)
+++ trunk/include/iprt/formats/apfs.h	(revision 81595)
@@ -0,0 +1,234 @@
+/* $Id$ */
+/** @file
+ * IPRT, APFS (Apple File System) format.
+ */
+
+/*
+ * Copyright (C) 2019 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE 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.
+ */
+
+#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 */
+
