summaryrefslogtreecommitdiff
path: root/include/iprt/formats
diff options
context:
space:
mode:
Diffstat (limited to 'include/iprt/formats')
-rw-r--r--include/iprt/formats/Makefile.kup0
-rw-r--r--include/iprt/formats/codeview.h82
-rw-r--r--include/iprt/formats/hfs.h677
-rw-r--r--include/iprt/formats/mach-o.h626
-rw-r--r--include/iprt/formats/mz.mac56
-rw-r--r--include/iprt/formats/pe.mac722
-rw-r--r--include/iprt/formats/xar.h68
7 files changed, 2231 insertions, 0 deletions
diff --git a/include/iprt/formats/Makefile.kup b/include/iprt/formats/Makefile.kup
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/include/iprt/formats/Makefile.kup
diff --git a/include/iprt/formats/codeview.h b/include/iprt/formats/codeview.h
new file mode 100644
index 00000000..b40e8f64
--- /dev/null
+++ b/include/iprt/formats/codeview.h
@@ -0,0 +1,82 @@
+/** @file
+ * IPRT - Microsoft CodeView Debug Information.
+ */
+
+/*
+ * Copyright (C) 2009-2013 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_formats_codeview_h
+#define ___iprt_formats_codeview_h
+
+
+#include <iprt/types.h>
+#include <iprt/assert.h>
+
+
+/** @defgroup grp_rt_fmt_codeview Microsoft CodeView Debug Information
+ * @{
+ */
+/**
+ * PDB v2.0 in image debug info.
+ * The URL is constructed from the timestamp and age?
+ */
+typedef struct CVPDB20INFO
+{
+ uint32_t u32Magic; /**< CVPDB20INFO_SIGNATURE. */
+ int32_t offDbgInfo; /**< Always 0. Used to be the offset to the real debug info. */
+ uint32_t uTimestamp;
+ uint32_t uAge;
+ uint8_t szPdbFilename[4];
+} CVPDB20INFO;
+/** Pointer to in executable image PDB v2.0 info. */
+typedef CVPDB20INFO *PCVPDB20INFO;
+/** Pointer to read only in executable image PDB v2.0 info. */
+typedef CVPDB20INFO const *PCCVPDB20INFO;
+/** The CVPDB20INFO magic value. */
+#define CVPDB20INFO_MAGIC RT_MAKE_U32_FROM_U8('N','B','1','0')
+
+/**
+ * PDB v7.0 in image debug info.
+ * The URL is constructed from the signature and the age.
+ */
+#pragma pack(4)
+typedef struct CVPDB70INFO
+{
+ uint32_t u32Magic; /**< CVPDB70INFO_SIGNATURE. */
+ RTUUID PdbUuid;
+ uint32_t uAge;
+ uint8_t szPdbFilename[4];
+} CVPDB70INFO;
+#pragma pack()
+AssertCompileMemberOffset(CVPDB70INFO, PdbUuid, 4);
+AssertCompileMemberOffset(CVPDB70INFO, uAge, 4 + 16);
+/** Pointer to in executable image PDB v7.0 info. */
+typedef CVPDB70INFO *PCVPDB70INFO;
+/** Pointer to read only in executable image PDB v7.0 info. */
+typedef CVPDB70INFO const *PCCVPDB70INFO;
+/** The CVPDB70INFO magic value. */
+#define CVPDB70INFO_MAGIC RT_MAKE_U32_FROM_U8('R','S','D','S')
+
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/formats/hfs.h b/include/iprt/formats/hfs.h
new file mode 100644
index 00000000..77d31b6a
--- /dev/null
+++ b/include/iprt/formats/hfs.h
@@ -0,0 +1,677 @@
+/** @file
+ * IPRT - Hierarchical File System (HFS).
+ */
+
+/*
+ * Copyright (C) 2009-2013 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_formats_hfs_h
+#define ___iprt_formats_hfs_h
+
+
+#include <iprt/types.h>
+#include <iprt/assert.h>
+
+
+/** @defgroup grp_rt_fmt_hfs HFS - Hierarchical File System.
+ * @{
+ */
+
+
+/** @name HFS signature words (HFSPlusVolumeHeader::signature)
+ * @{ */
+#define kHFSSigWord UINT16_C(0x4244)
+#define kHFSPlusSigWord UINT16_C(0x482b)
+#define kHFSXSigWord UINT16_C(0x4858)
+/** @} */
+
+/** @name HFS version numbers (HFSPlusVolumeHeader::version).
+ * @{ */
+#define kHFSPlusVersion UINT16_C(4)
+#define kHFSXVersion UINT16_C(5)
+/** @} */
+
+/** @name HFS mount version numbers (HFSPlusVolumeHeader::lastMountedVersion).
+ * @{ */
+#define kHFSPlusMountVersion UINT32_C(0x31302e30)
+#define kHFSJMountVersion UINT32_C(0x4846534a)
+#define kFSKMountVersion UINT32_C(0x46534b21)
+/** @} */
+
+/** @name Hard link file creators & types.
+ * @{ */
+#define kHardLinkFileType UINT32_C(0x686c6e6b)
+#define kHFSPlusCreator UINT32_C(0x6866732b)
+/** @} */
+
+/** @name Symlink file creators & types.
+ * @{ */
+#define kSymLinkFileType UINT32_C(0x736c6e6b)
+#define kSymLinkCreator UINT32_C(0x72686170)
+/** @} */
+
+/** @name Name limits.
+ * @{ */
+#define kHFSMaxVolumeNameChars UINT8_C(0x1b)
+#define kHFSMaxFileNameChars UINT8_C(0x1f)
+#define kHFSPlusMaxFileNameChars UINT8_C(0xff)
+#define kHFSMaxAttrNameLen UINT8_C(0x7f)
+/** @} */
+
+/** @name Extent descriptor record densities
+ * @{ */
+#define kHFSExtentDensity UINT8_C(3)
+#define kHFSPlusExtentDensity UINT8_C(8)
+/** @} */
+
+
+/** @name File IDs (various fileID members).
+ * @{ */
+#define kHFSRootParentID UINT32_C(0x00000001)
+#define kHFSRootFolderID UINT32_C(0x00000002)
+#define kHFSExtentsFileID UINT32_C(0x00000003)
+#define kHFSCatalogFileID UINT32_C(0x00000004)
+#define kHFSBadBlockFileID UINT32_C(0x00000005)
+#define kHFSAllocationFileID UINT32_C(0x00000006)
+#define kHFSStartupFileID UINT32_C(0x00000007)
+#define kHFSAttributesFileID UINT32_C(0x00000008)
+#define kHFSAttributeDataFileID UINT32_C(0x0000000c)
+#define kHFSRepairCatalogFileID UINT32_C(0x0000000e)
+#define kHFSBogusExtentFileID UINT32_C(0x0000000f)
+#define kHFSFirstUserCatalogNodeID UINT32_C(0x00000010)
+/** @} */
+
+/** @name Catalog record types.
+ * @{ */
+#define kHFSFolderRecord UINT16_C(0x0100)
+#define kHFSFileRecord UINT16_C(0x0200)
+#define kHFSFolderThreadRecord UINT16_C(0x0300)
+#define kHFSFileThreadRecord UINT16_C(0x0400)
+#define kHFSPlusFolderRecord UINT16_C(0x0001)
+#define kHFSPlusFileRecord UINT16_C(0x0002)
+#define kHFSPlusFolderThreadRecord UINT16_C(0x0003)
+#define kHFSPlusFileThreadRecord UINT16_C(0x0004)
+/** @} */
+
+/** @name File record bits and masks.
+ * @{ */
+#define kHFSFileLockedBit 0
+#define kHFSThreadExistsBit 1
+#define kHFSHasAttributesBit 2
+#define kHFSHasSecurityBit 3
+#define kHFSHasFolderCountBit 4
+#define kHFSHasLinkChainBit 5
+#define kHFSHasChildLinkBit 6
+#define kHFSHasDateAddedBit 7
+
+#define kHFSFileLockedMask RT_BIT(kHFSFileLockedBit)
+#define kHFSThreadExistsMask RT_BIT(kHFSThreadExistsBit)
+#define kHFSHasAttributesMask RT_BIT(kHFSHasAttributesBit)
+#define kHFSHasSecurityMask RT_BIT(kHFSHasSecurityBit)
+#define kHFSHasFolderCountMask RT_BIT(kHFSHasFolderCountBit)
+#define kHFSHasLinkChainMask RT_BIT(kHFSHasLinkChainBit)
+#define kHFSHasChildLinkMask RT_BIT(kHFSHasChildLinkBit)
+#define kHFSHasDateAddedMask RT_BIT(kHFSHasDateAddedBit)
+/** @} */
+
+/** @name Key and node lengths.
+ * @{ */
+#define kHFSPlusAttrKeyMaximumLength ( sizeof(HFSPlusAttrKey) - sizeof(uint16_t) )
+#define kHFSPlusAttrKeyMinimumLength ( kHFSPlusAttrKeyMaximumLength - (kHFSMaxAttrNameLen * sizeof(uint16_t)) )
+#define kHFSPlusExtentKeyMaximumLength ( sizeof(HFSPlusExtentKey) - sizeof(uint16_t),
+#define kHFSExtentKeyMaximumLength ( sizeof(HFSExtentKey) - sizeof(uint8_t) )
+#define kHFSPlusCatalogKeyMaximumLength ( sizeof(HFSPlusCatalogKey) - sizeof(uint16_t) )
+#define kHFSPlusCatalogKeyMinimumLength ( kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(uint16_t) )
+#define kHFSCatalogKeyMaximumLength ( sizeof(HFSCatalogKey) - sizeof(uint8_t) )
+#define kHFSCatalogKeyMinimumLength ( kHFSCatalogKeyMaximumLength - kHFSMaxFileNameChars - 1 + sizeof(uint8_t) )
+#define kHFSPlusCatalogMinNodeSize UINT16_C(0x1000)
+#define kHFSPlusExtentMinNodeSize UINT16_C(0x0200)
+#define kHFSPlusAttrMinNodeSize UINT16_C(0x1000)
+/** @} */
+
+/** @name Volume Attribute bits and masks.
+ * @remarks HFS has only 16-bit wide field, HFS+ has 32-bit.
+ * @{ */
+#define kHFSVolumeHardwareLockBit 7
+#define kHFSVolumeUnmountedBit 8
+#define kHFSVolumeSparedBlocksBit 9
+#define kHFSVolumeNoCacheRequiredBit 10
+#define kHFSBootVolumeInconsistentBit 11
+#define kHFSCatalogNodeIDsReusedBit 12
+#define kHFSVolumeJournaledBit 13
+#define kHFSVolumeInconsistentBit 14
+#define kHFSVolumeSoftwareLockBit 15
+#define kHFSUnusedNodeFixBit 31
+#define kHFSContentProtectionBit 30
+
+#define kHFSVolumeHardwareLockMask RT_BIT(kHFSVolumeHardwareLockBit)
+#define kHFSVolumeUnmountedMask RT_BIT(kHFSVolumeUnmountedBit)
+#define kHFSVolumeSparedBlocksMask RT_BIT(kHFSVolumeSparedBlocksBit)
+#define kHFSVolumeNoCacheRequiredMask RT_BIT(kHFSVolumeNoCacheRequiredBit)
+#define kHFSBootVolumeInconsistentMask RT_BIT(kHFSBootVolumeInconsistentBit)
+#define kHFSCatalogNodeIDsReusedMask RT_BIT(kHFSCatalogNodeIDsReusedBit)
+#define kHFSVolumeJournaledMask RT_BIT(kHFSVolumeJournaledBit)
+#define kHFSVolumeInconsistentMask RT_BIT(kHFSVolumeInconsistentBit)
+#define kHFSVolumeSoftwareLockMask RT_BIT(kHFSVolumeSoftwareLockBit)
+#define kHFSUnusedNodeFixMask RT_BIT(kHFSUnusedNodeFixBit)
+#define kHFSContentProtectionMask RT_BIT(kHFSContentProtectionBit)
+
+#define kHFSMDBAttributesMask UINT16_C(0x8380)
+/** @} */
+
+/** @name Misc
+ * @{ */
+#define kHFSUnusedNodesFixDate UINT32_C(0xc5ef2480)
+
+#define HFSPLUSMETADATAFOLDER "\xE2\x90\x80\xE2\x90\x80\xE2\x90\x80\xE2\x90\x80HFS+ Private Data"
+#define HFSPLUS_DIR_METADATA_FOLDER ".HFS+ Private Directory Data\xd"
+#define HFS_INODE_PREFIX "iNode"
+#define HFS_DELETE_PREFIX "temp"
+#define HFS_DIRINODE_PREFIX "dir_"
+#define FIRST_LINK_XATTR_NAME "com.apple.system.hfs.firstlink"
+#define FIRST_LINK_XATTR_REC_SIZE ( sizeof(HFSPlusAttrData) + 10 )
+
+/* {b3e20f39-f292-11d6-97a4-00306543ecac} */
+#define HFS_UUID_NAMESPACE_ID "\xB3\xE2\x0F\x39\xF2\x92\x11\xD6\x97\xA4\x00\x30\x65\x43\xEC\xAC"
+
+#define SET_HFS_TEXT_ENCODING(a_uHint) (UINT32_C(0x656e6300) | (uint8_t)(a_uHint))
+#define GET_HFS_TEXT_ENCODING(a_uHint) ( ((a_uHint) & UINT32_C(0xffffff00)) == UINT32_C(0x656e6300) \
+ ? UINT32_C(0x000000ff)(a_uHint) : UINT32_MAX)
+/** @} */
+
+/** @name B-tree stuff.
+ * @{ */
+#define kMaxKeyLength 520
+
+#define kBTLeafNode (-1)
+#define kBTIndexNode 0
+#define kBTHeaderNode 1
+#define kBTMapNode 2
+
+#define kBTBadCloseMask RT_BIT_32(0)
+#define kBTBigKeysMask RT_BIT_32(1)
+#define kBTVariableIndexKeysMask RT_BIT_32(2)
+
+/** @} */
+
+/** @name B-tree compare types (BTHeaderRec::keyCompareType) */
+#define kHFSCaseFolding UINT8_C(0xcf)
+#define kHFSBinaryCompare UINT8_C(0xbc)
+/** @} */
+
+/** @name Journal stuff.
+ * @{ */
+#define JIB_RESERVED_SIZE ( sizeof(uint32_t) * 32 - 85 )
+
+#define kJIJournalInFSMask RT_BIT_32(0)
+#define kJIJournalOnOtherDeviceMask RT_BIT_32(1)
+#define kJIJournalNeedInitMask RT_BIT_32(2)
+
+#define EXTJNL_CONTENT_TYPE_UUID "4a6f7572-6e61-11aa-aa11-00306543ecac"
+/** @} */
+
+
+
+typedef struct HFSUniStr255
+{
+ uint16_t length;
+ RTUTF16 unicode[255];
+} HFSUniStr255;
+AssertCompileSize(HFSUniStr255, 0x200);
+typedef const HFSUniStr255 * ConstHFSUniStr255Param;
+
+#pragma pack(1)
+typedef struct HFSExtentKey
+{
+ uint8_t keyLength;
+ uint8_t forkType;
+ uint32_t fileID; /**< Misaligned. */
+ uint16_t startBLock;
+} HFSExtentKey;
+#pragma pack()
+AssertCompileSize(HFSExtentKey, 8);
+
+typedef struct HFSPlusExtentKey
+{
+ uint16_t keyLength;
+ uint8_t forkType;
+ uint8_t pad;
+ uint32_t fileID;
+ uint32_t startBlock;
+} HFSPlusExtentKey;
+AssertCompileSize(HFSPlusExtentKey, 12);
+
+typedef struct HFSExtentDescriptor
+{
+ uint16_t startBlock;
+ uint16_t blockCount;
+} HFSExtentDescriptor;
+AssertCompileSize(HFSExtentDescriptor, 4);
+
+typedef struct HFSPlusExtentDescriptor
+{
+ uint32_t startBlock;
+ uint32_t blockCount;
+} HFSPlusExtentDescriptor;
+AssertCompileSize(HFSPlusExtentDescriptor, 8);
+
+typedef HFSExtentDescriptor HFSExtentRecord[3];
+typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
+
+typedef struct FndrFileInfo
+{
+ uint32_t fdType;
+ uint32_t fdCreator;
+ uint16_t fdFlags;
+ struct
+ {
+ int16_t v;
+ int16_t h;
+ } fdLocation;
+ uint16_t opaque;
+} FndrFileInfo;
+AssertCompileSize(FndrFileInfo, 16);
+
+typedef struct FndrDirInfo
+{
+ struct
+ {
+ int16_t top;
+ int16_t left;
+ int16_t bottom;
+ int16_t right;
+ } frRect;
+ uint16_t frFlags;
+ struct
+ {
+ int16_t v;
+ int16_t h;
+ } fdLocation;
+ uint16_t opaque;
+} FndrDirInfo;
+AssertCompileSize(FndrDirInfo, 16);
+
+typedef struct FndrOpaqueInfo
+{
+ int8_t opaque[16];
+} FndrOpaqueInfo;
+AssertCompileSize(FndrOpaqueInfo, 16);
+
+typedef struct FndrExtendedFileInfo
+{
+ uint32_t reserved1;
+ uint32_t date_added;
+ uint16_t extended_flags;
+ uint16_t reserved2;
+ uint32_t reserved3;
+} FndrExtendedFileInfo;
+AssertCompileSize(FndrExtendedFileInfo, 16);
+
+typedef struct FndrExtendedDirInfo
+{
+ uint32_t point;
+ uint32_t date_added;
+ uint16_t extended_flags;
+ uint16_t reserved3;
+ uint32_t reserved4;
+} FndrExtendedDirInfo;
+AssertCompileSize(FndrExtendedDirInfo, 16);
+
+typedef struct HFSPlusForkData
+{
+ uint64_t logicalSize;
+ uint32_t clumpSize;
+ uint32_t totalBlocks;
+ HFSPlusExtentRecord extents;
+} HFSPlusForkData;
+AssertCompileSize(HFSPlusForkData, 80);
+
+typedef struct HFSPlusBSDInfo
+{
+ uint32_t ownerID;
+ uint32_t groupID;
+ uint8_t adminFlags;
+ uint8_t ownerFlags;
+ uint16_t fileMode;
+ union
+ {
+ uint32_t iNodeNum;
+ uint32_t linkCount;
+ uint32_t rawDevice;
+ } special;
+} HFSPlusBSDInfo;
+AssertCompileSize(HFSPlusBSDInfo, 16);
+
+#pragma pack(1)
+typedef struct HFSCatalogKey
+{
+ uint8_t keyLength;
+ uint8_t reserved;
+ uint32_t parentID; /**< Misaligned. */
+ uint8_t nodeName[kHFSMaxFileNameChars + 1];
+} HFSCatalogKey;
+#pragma pack()
+AssertCompileSize(HFSCatalogKey, 0x26);
+
+#pragma pack(1)
+typedef struct HFSPlusCatalogKey
+{
+ uint16_t keyLength;
+ uint32_t parentID; /**< Misaligned. */
+ HFSUniStr255 nodeName;
+} HFSPlusCatalogKey;
+#pragma pack()
+AssertCompileSize(HFSPlusCatalogKey, 0x206);
+
+#pragma pack(1)
+typedef struct HFSCatalogFolder
+{
+ int16_t recordType;
+ uint16_t flags;
+ uint16_t valence;
+ uint32_t folderID; /**< Misaligned. */
+ uint32_t createDate; /**< Misaligned. */
+ uint32_t modifyDate; /**< Misaligned. */
+ uint32_t backupDate; /**< Misaligned. */
+ FndrDirInfo userInfo;
+ FndrOpaqueInfo finderInfo;
+ uint32_t reserved[4]; /**< Misaligned. */
+} HFSCatalogFolder;
+#pragma pack()
+AssertCompileSize(HFSCatalogFolder, 70);
+
+typedef struct HFSPlusCatalogFolder
+{
+ int16_t recordType;
+ uint16_t flags;
+ uint32_t valence;
+ uint32_t folderID;
+ uint32_t createDate;
+ uint32_t contentModDate;
+ uint32_t attributeModDate;
+ uint32_t accessDate;
+ uint32_t backupDate;
+ HFSPlusBSDInfo bsdInfo;
+ FndrDirInfo userInfo;
+ FndrOpaqueInfo finderInfo;
+ uint32_t textEncoding;
+ uint32_t folderCount;
+} HFSPlusCatalogFolder;
+AssertCompileSize(HFSPlusCatalogFolder, 88);
+
+#pragma pack(1)
+typedef struct HFSCatalogFile
+{
+ int16_t recordType;
+ uint8_t flags;
+ uint8_t fileType;
+ FndrFileInfo userInfo;
+ uint32_t fileID;
+ uint16_t dataStartBlock;
+ int32_t dataLogicalSize; /**< Misaligned. */
+ int32_t dataPhysicalSize; /**< Misaligned. */
+ uint16_t rsrcStartBlock;
+ int32_t rsrcLogicalSize;
+ int32_t rsrcPhysicalSize;
+ uint32_t createDate;
+ uint32_t modifyDate;
+ uint32_t backupDate;
+ FndrOpaqueInfo finderInfo;
+ uint16_t clumpSize;
+ HFSExtentRecord dataExtents; /**< Misaligned. */
+ HFSExtentRecord rsrcExtents; /**< Misaligned. */
+ uint32_t reserved; /**< Misaligned. */
+} HFSCatalogFile;
+#pragma pack()
+AssertCompileSize(HFSCatalogFile, 102);
+
+#pragma pack(1)
+typedef struct HFSPlusCatalogFile
+{
+ int16_t recordType;
+ uint16_t flags;
+ uint32_t reserved1;
+ uint32_t fileID;
+ uint32_t createDate;
+ uint32_t contentModDate;
+ uint32_t attributeModDate;
+ uint32_t accessDate;
+ uint32_t backupDate;
+ HFSPlusBSDInfo bsdInfo;
+ FndrFileInfo userInfo;
+ FndrOpaqueInfo finderInfo;
+ uint32_t textEncoding;
+ uint32_t reserved2;
+ HFSPlusForkData dataFork;
+ HFSPlusForkData resourceFork;
+} HFSPlusCatalogFile;
+#pragma pack()
+AssertCompileMemberAlignment(HFSPlusCatalogFile, dataFork, 8);
+AssertCompileSize(HFSPlusCatalogFile, 248);
+
+#pragma pack(1)
+typedef struct HFSCatalogThread
+{
+ int16_t recordType;
+ int32_t reserved[2];
+ uint32_t parentID;
+ uint8_t nodeName[kHFSMaxFileNameChars + 1];
+} HFSCatalogThread;
+#pragma pack()
+AssertCompileSize(HFSCatalogThread, 46);
+
+typedef struct HFSPlusCatalogThread
+{
+ int16_t recordType;
+ int16_t reserved;
+ uint32_t parentID;
+ HFSUniStr255 nodeName;
+} HFSPlusCatalogThread;
+AssertCompileSize(HFSPlusCatalogThread, 0x208);
+
+typedef struct HFSPlusAttrForkData
+{
+ uint32_t recordType;
+ uint32_t reserved;
+ HFSPlusForkData theFork;
+} HFSPlusAttrForkData;
+AssertCompileSize(HFSPlusAttrForkData, 88);
+
+typedef struct HFSPlusAttrExtents
+{
+ uint32_t recordType;
+ uint32_t reserved;
+ HFSPlusExtentRecord extents;
+} HFSPlusAttrExtents;
+AssertCompileSize(HFSPlusAttrExtents, 72);
+
+#pragma pack(1)
+typedef struct HFSPlusAttrData
+{
+ uint32_t recordType;
+ uint32_t reserved[2];
+ uint32_t attrSize;
+ uint8_t attrData[2]; /**< Causes misaligned struct size. */
+} HFSPlusAttrData;
+#pragma pack()
+AssertCompileSize(HFSPlusAttrData, 18);
+
+#pragma pack(1)
+typedef struct HFSPlusAttrInlineData
+{
+ uint32_t recordType;
+ uint32_t reserved;
+ uint32_t logicalSize;
+ uint8_t userData[2]; /**< Causes misaligned struct size. */
+} HFSPlusAttrInlineData;
+#pragma pack()
+AssertCompileSize(HFSPlusAttrInlineData, 14);
+
+typedef union HFSPlusAttrRecord
+{
+ uint32_t recordType;
+ HFSPlusAttrInlineData inlineData;
+ HFSPlusAttrData attrData;
+ HFSPlusAttrForkData forkData;
+ HFSPlusAttrExtents overflowExtents;
+} HFSPlusAttrRecord;
+AssertCompileSize(HFSPlusAttrRecord, 88);
+
+typedef struct HFSPlusAttrKey
+{
+ uint16_t keyLength;
+ uint16_t pad;
+ uint32_t fileID;
+ uint32_t startBlock;
+ uint16_t attrNameLen;
+ RTUTF16 attrName[kHFSMaxAttrNameLen];
+} HFSPlusAttrKey;
+AssertCompileSize(HFSPlusAttrKey, 268);
+
+#pragma pack(1)
+typedef struct HFSMasterDirectoryBlock
+{
+ uint16_t drSigWord;
+ uint32_t drCrDate; /**< Misaligned. */
+ uint32_t drLsMod; /**< Misaligned. */
+ uint16_t drAtrb;
+ uint16_t drNmFls;
+ uint16_t drVBMSt;
+ uint16_t drAllocPtr;
+ uint16_t drNmAlBlks;
+ uint32_t drAlBlkSiz;
+ uint32_t drClpSiz;
+ uint16_t drAlBlSt;
+ uint32_t drNxCNID; /**< Misaligned. */
+ uint16_t drFreeBks;
+ uint8_t drVN[kHFSMaxVolumeNameChars + 1];
+ uint32_t drVolBkUp;
+ uint16_t drVSeqNum;
+ uint32_t drWrCnt; /**< Misaligned. */
+ uint32_t drXTClpSiz; /**< Misaligned. */
+ uint32_t drCTClpSiz; /**< Misaligned. */
+ uint16_t drNmRtDirs;
+ uint32_t drFilCnt;
+ uint32_t drDirCnt;
+ uint32_t drFndrInfo[8];
+ uint16_t drEmbedSigWord;
+ HFSExtentDescriptor drEmbedExtent;
+ uint32_t drXTFlSize; /**< Misaligned. */
+ HFSExtentRecord drXTExtRec;
+ uint32_t drCTFlSize; /**< Misaligned. */
+ HFSExtentRecord drCTExtRec;
+} HFSMasterDirectoryBlock;
+#pragma pack()
+AssertCompileSize(HFSMasterDirectoryBlock, 162);
+
+typedef struct HFSPlusVolumeHeader
+{
+ uint16_t signature;
+ uint16_t version;
+ uint32_t attributes;
+ uint32_t lastMountedVersion;
+ uint32_t journalInfoBlock;
+ uint32_t createDate;
+ uint32_t modifyDate;
+ uint32_t backupDate;
+ uint32_t checkedDate;
+ uint32_t fileCount;
+ uint32_t folderCount;
+ uint32_t blockSize;
+ uint32_t totalBlocks;
+ uint32_t freeBlocks;
+ uint32_t nextAllocation;
+ uint32_t rsrcClumpSize;
+ uint32_t dataClumpSize;
+ uint32_t nextCatalogID;
+ uint32_t writeCount;
+ uint64_t encodingsBitmap;
+ uint8_t finderInfo[32];
+ HFSPlusForkData allocationFile;
+ HFSPlusForkData extentsFile;
+ HFSPlusForkData catalogFile;
+ HFSPlusForkData attributesFile;
+ HFSPlusForkData startupFile;
+} HFSPlusVolumeHeader;
+AssertCompileMemberAlignment(HFSPlusVolumeHeader, nextCatalogID, 8);
+AssertCompileSize(HFSPlusVolumeHeader, 512);
+
+typedef union BTreeKey
+{
+ uint8_t length8;
+ uint16_t length16;
+ uint8_t rawData[kMaxKeyLength + 2];
+} BTreeKey;
+AssertCompileSize(BTreeKey, 522);
+
+#pragma pack(1)
+typedef struct BTNodeDescriptor
+{
+ uint32_t fLink;
+ uint32_t bLink;
+ int8_t kind;
+ uint8_t height;
+ uint16_t numRecords;
+ uint16_t reserved; /**< Causes struct size misalignment. */
+} BTNodeDescriptor;
+#pragma pack()
+AssertCompileSize(BTNodeDescriptor, 14);
+
+#pragma pack(1)
+typedef struct BTHeaderRec
+{
+ uint16_t treeDepth;
+ uint32_t rootNode; /**< Misaligned. */
+ uint32_t leafRecords; /**< Misaligned. */
+ uint32_t firstLeafNode; /**< Misaligned. */
+ uint32_t lastLeafNode; /**< Misaligned. */
+ uint16_t nodeSize;
+ uint16_t maxKeyLength;
+ uint32_t totalNodes; /**< Misaligned. */
+ uint32_t freeNodes; /**< Misaligned. */
+ uint16_t reserved1;
+ uint32_t clumpSize;
+ uint8_t btreeType;
+ uint8_t keyCompareType;
+ uint32_t attributes; /**< Misaligned. */
+ uint32_t reserved3[16]; /**< Misaligned. */
+} BTHeaderRec;
+#pragma pack()
+AssertCompileSize(BTHeaderRec, 106);
+
+#pragma pack(1)
+typedef struct JournalInfoBlock
+{
+ uint32_t flags;
+ uint32_t devices_signature[8];
+ uint64_t offset; /**< Misaligned (morons). */
+ uint64_t size; /**< Misaligned. */
+ char ext_jnl_uuid[37];
+ char machine_serial_num[48];
+ char reserved[JIB_RESERVED_SIZE];
+} JournalInfoBlock;
+#pragma pack()
+AssertCompileSize(JournalInfoBlock, 180);
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/formats/mach-o.h b/include/iprt/formats/mach-o.h
new file mode 100644
index 00000000..6f51c8d3
--- /dev/null
+++ b/include/iprt/formats/mach-o.h
@@ -0,0 +1,626 @@
+/* $Id: mach-o.h $ */
+/** @file
+ * IPRT - Mach-O Structures and Constants.
+ */
+
+/*
+ * Copyright (C) 2011-2012 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 ___internal_ldrMach_O_h
+#define ___internal_ldrMach_O_h
+
+#include <iprt/types.h>
+
+#ifndef CPU_ARCH_MASK
+
+/* cputype */
+#define CPU_ARCH_MASK INT32_C(0xff000000)
+#define CPU_ARCH_ABI64 INT32_C(0x01000000)
+#define CPU_TYPE_ANY INT32_C(-1)
+#define CPU_TYPE_VAX INT32_C(1)
+#define CPU_TYPE_MC680x0 INT32_C(6)
+#define CPU_TYPE_X86 INT32_C(7)
+#define CPU_TYPE_I386 CPU_TYPE_X86
+#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64)
+#define CPU_TYPE_MC98000 INT32_C(10)
+#define CPU_TYPE_HPPA INT32_C(11)
+#define CPU_TYPE_MC88000 INT32_C(13)
+#define CPU_TYPE_SPARC INT32_C(14)
+#define CPU_TYPE_I860 INT32_C(15)
+#define CPU_TYPE_POWERPC INT32_C(18)
+#define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)
+
+/* cpusubtype */
+#define CPU_SUBTYPE_MULTIPLE INT32_C(-1)
+#define CPU_SUBTYPE_LITTLE_ENDIAN INT32_C(0)
+#define CPU_SUBTYPE_BIG_ENDIAN INT32_C(1)
+
+#define CPU_SUBTYPE_VAX_ALL INT32_C(0)
+#define CPU_SUBTYPE_VAX780 INT32_C(1)
+#define CPU_SUBTYPE_VAX785 INT32_C(2)
+#define CPU_SUBTYPE_VAX750 INT32_C(3)
+#define CPU_SUBTYPE_VAX730 INT32_C(4)
+#define CPU_SUBTYPE_UVAXI INT32_C(5)
+#define CPU_SUBTYPE_UVAXII INT32_C(6)
+#define CPU_SUBTYPE_VAX8200 INT32_C(7)
+#define CPU_SUBTYPE_VAX8500 INT32_C(8)
+#define CPU_SUBTYPE_VAX8600 INT32_C(9)
+#define CPU_SUBTYPE_VAX8650 INT32_C(10)
+#define CPU_SUBTYPE_VAX8800 INT32_C(11)
+#define CPU_SUBTYPE_UVAXIII INT32_C(12)
+
+#define CPU_SUBTYPE_MC680x0_ALL INT32_C(1)
+#define CPU_SUBTYPE_MC68030 INT32_C(1)
+#define CPU_SUBTYPE_MC68040 INT32_C(2)
+#define CPU_SUBTYPE_MC68030_ONLY INT32_C(3)
+
+#define CPU_SUBTYPE_INTEL(fam, model) ( (int32_t )(((model) << 4) | (fam)) )
+#define CPU_SUBTYPE_INTEL_FAMILY(subtype) ( (subtype) & 0xf )
+#define CPU_SUBTYPE_INTEL_MODEL(subtype) ( (subtype) >> 4 )
+#define CPU_SUBTYPE_INTEL_FAMILY_MAX 0xf
+#define CPU_SUBTYPE_INTEL_MODEL_ALL 0
+
+#define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0)
+#define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0)
+#define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0)
+#define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8)
+#define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0)
+#define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0)
+#define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1)
+#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3)
+#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5)
+#define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6)
+#define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7)
+#define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0)
+#define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1)
+#define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2)
+#define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0)
+#define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0)
+#define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1)
+#define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0)
+#define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1)
+#define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0)
+#define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1)
+
+#define CPU_SUBTYPE_X86_ALL INT32_C(3)
+#define CPU_SUBTYPE_X86_64_ALL INT32_C(3)
+#define CPU_SUBTYPE_X86_ARCH1 INT32_C(4)
+
+#define CPU_SUBTYPE_MIPS_ALL INT32_C(0)
+#define CPU_SUBTYPE_MIPS_R2300 INT32_C(1)
+#define CPU_SUBTYPE_MIPS_R2600 INT32_C(2)
+#define CPU_SUBTYPE_MIPS_R2800 INT32_C(3)
+#define CPU_SUBTYPE_MIPS_R2000a INT32_C(4)
+#define CPU_SUBTYPE_MIPS_R2000 INT32_C(5)
+#define CPU_SUBTYPE_MIPS_R3000a INT32_C(6)
+#define CPU_SUBTYPE_MIPS_R3000 INT32_C(7)
+
+#define CPU_SUBTYPE_MC98000_ALL INT32_C(0)
+#define CPU_SUBTYPE_MC98601 INT32_C(1)
+
+#define CPU_SUBTYPE_HPPA_ALL INT32_C(0)
+#define CPU_SUBTYPE_HPPA_7100 INT32_C(0)
+#define CPU_SUBTYPE_HPPA_7100LC INT32_C(1)
+
+#define CPU_SUBTYPE_MC88000_ALL INT32_C(0)
+#define CPU_SUBTYPE_MC88100 INT32_C(1)
+#define CPU_SUBTYPE_MC88110 INT32_C(2)
+
+#define CPU_SUBTYPE_SPARC_ALL INT32_C(0)
+
+#define CPU_SUBTYPE_I860_ALL INT32_C(0)
+#define CPU_SUBTYPE_I860_860 INT32_C(1)
+
+#define CPU_SUBTYPE_POWERPC_ALL INT32_C(0)
+#define CPU_SUBTYPE_POWERPC_601 INT32_C(1)
+#define CPU_SUBTYPE_POWERPC_602 INT32_C(2)
+#define CPU_SUBTYPE_POWERPC_603 INT32_C(3)
+#define CPU_SUBTYPE_POWERPC_603e INT32_C(4)
+#define CPU_SUBTYPE_POWERPC_603ev INT32_C(5)
+#define CPU_SUBTYPE_POWERPC_604 INT32_C(6)
+#define CPU_SUBTYPE_POWERPC_604e INT32_C(7)
+#define CPU_SUBTYPE_POWERPC_620 INT32_C(8)
+#define CPU_SUBTYPE_POWERPC_750 INT32_C(9)
+#define CPU_SUBTYPE_POWERPC_7400 INT32_C(10)
+#define CPU_SUBTYPE_POWERPC_7450 INT32_C(11)
+#define CPU_SUBTYPE_POWERPC_Max INT32_C(10)
+#define CPU_SUBTYPE_POWERPC_SCVger INT32_C(11)
+#define CPU_SUBTYPE_POWERPC_970 INT32_C(100)
+
+#define CPU_SUBTYPE_MASK UINT32_C(0xff000000)
+#define CPU_SUBTYPE_LIB64 UINT32_C(0x80000000)
+
+#endif /* !CPU_ARCH_MASK */
+
+
+typedef struct fat_header
+{
+ uint32_t magic;
+ uint32_t nfat_arch;
+} fat_header_t;
+
+#ifndef IMAGE_FAT_SIGNATURE
+# define IMAGE_FAT_SIGNATURE UINT32_C(0xcafebabe)
+#endif
+#ifndef IMAGE_FAT_SIGNATURE_OE
+# define IMAGE_FAT_SIGNATURE_OE UINT32_C(0xbebafeca)
+#endif
+
+typedef struct fat_arch
+{
+ int32_t cputype;
+ int32_t cpusubtype;
+ uint32_t offset;
+ uint32_t size;
+ uint32_t align;
+} fat_arch_t;
+
+typedef struct mach_header_32
+{
+ uint32_t magic;
+ int32_t cputype;
+ int32_t cpusubtype;
+ uint32_t filetype;
+ uint32_t ncmds;
+ uint32_t sizeofcmds;
+ uint32_t flags;
+} mach_header_32_t;
+
+/* magic */
+#ifndef IMAGE_MACHO32_SIGNATURE
+# define IMAGE_MACHO32_SIGNATURE UINT32_C(0xfeedface)
+#endif
+#ifndef IMAGE_MACHO32_SIGNATURE_OE
+# define IMAGE_MACHO32_SIGNATURE_OE UINT32_C(0xcefaedfe)
+#endif
+#define MH_MAGIC IMAGE_MACHO32_SIGNATURE
+#define MH_CIGAM IMAGE_MACHO32_SIGNATURE_OE
+
+typedef struct mach_header_64
+{
+ uint32_t magic;
+ int32_t cputype;
+ int32_t cpusubtype;
+ uint32_t filetype;
+ uint32_t ncmds;
+ uint32_t sizeofcmds;
+ uint32_t flags;
+ uint32_t reserved;
+} mach_header_64_t;
+
+/* magic */
+#ifndef IMAGE_MACHO64_SIGNATURE
+# define IMAGE_MACHO64_SIGNATURE UINT32_C(0xfeedfacf)
+#endif
+#ifndef IMAGE_MACHO64_SIGNATURE_OE
+# define IMAGE_MACHO64_SIGNATURE_OE UINT32_C(0xfefaedfe)
+#endif
+#define MH_MAGIC_64 IMAGE_MACHO64_SIGNATURE
+#define MH_CIGAM_64 IMAGE_MACHO64_SIGNATURE_OE
+
+/* mach_header_* filetype */
+#define MH_OBJECT UINT32_C(1)
+#define MH_EXECUTE UINT32_C(2)
+#define MH_FVMLIB UINT32_C(3)
+#define MH_CORE UINT32_C(4)
+#define MH_PRELOAD UINT32_C(5)
+#define MH_DYLIB UINT32_C(6)
+#define MH_DYLINKER UINT32_C(7)
+#define MH_BUNDLE UINT32_C(8)
+#define MH_DYLIB_STUB UINT32_C(9)
+#define MH_DSYM UINT32_C(10)
+#define MH_KEXT_BUNDLE UINT32_C(11)
+
+/* mach_header_* flags */
+#define MH_NOUNDEFS UINT32_C(0x00000001)
+#define MH_INCRLINK UINT32_C(0x00000002)
+#define MH_DYLDLINK UINT32_C(0x00000004)
+#define MH_BINDATLOAD UINT32_C(0x00000008)
+#define MH_PREBOUND UINT32_C(0x00000010)
+#define MH_SPLIT_SEGS UINT32_C(0x00000020)
+#define MH_LAZY_INIT UINT32_C(0x00000040)
+#define MH_TWOLEVEL UINT32_C(0x00000080)
+#define MH_FORCE_FLAT UINT32_C(0x00000100)
+#define MH_NOMULTIDEFS UINT32_C(0x00000200)
+#define MH_NOFIXPREBINDING UINT32_C(0x00000400)
+#define MH_PREBINDABLE UINT32_C(0x00000800)
+#define MH_ALLMODSBOUND UINT32_C(0x00001000)
+#define MH_SUBSECTIONS_VIA_SYMBOLS UINT32_C(0x00002000)
+#define MH_CANONICAL UINT32_C(0x00004000)
+#define MH_WEAK_DEFINES UINT32_C(0x00008000)
+#define MH_BINDS_TO_WEAK UINT32_C(0x00010000)
+#define MH_ALLOW_STACK_EXECUTION UINT32_C(0x00020000)
+#define MH_ROOT_SAFE UINT32_C(0x00040000)
+#define MH_SETUID_SAFE UINT32_C(0x00080000)
+#define MH_NO_REEXPORTED_DYLIBS UINT32_C(0x00100000)
+#define MH_PIE UINT32_C(0x00200000)
+#define MH_DEAD_STRIPPABLE_DYLIB UINT32_C(0x00400000)
+#define MH_HAS_TLV_DESCRIPTORS UINT32_C(0x00800000)
+#define MH_NO_HEAP_EXECUTION UINT32_C(0x01000000)
+#define MH_VALID_FLAGS UINT32_C(0x01ffffff)
+
+
+typedef struct load_command
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+} load_command_t;
+
+/* load cmd */
+#define LC_REQ_DYLD UINT32_C(0x80000000)
+#define LC_SEGMENT_32 UINT32_C(0x01)
+#define LC_SYMTAB UINT32_C(0x02)
+#define LC_SYMSEG UINT32_C(0x03)
+#define LC_THREAD UINT32_C(0x04)
+#define LC_UNIXTHREAD UINT32_C(0x05)
+#define LC_LOADFVMLIB UINT32_C(0x06)
+#define LC_IDFVMLIB UINT32_C(0x07)
+#define LC_IDENT UINT32_C(0x08)
+#define LC_FVMFILE UINT32_C(0x09)
+#define LC_PREPAGE UINT32_C(0x0a)
+#define LC_DYSYMTAB UINT32_C(0x0b)
+#define LC_LOAD_DYLIB UINT32_C(0x0c)
+#define LC_ID_DYLIB UINT32_C(0x0d)
+#define LC_LOAD_DYLINKER UINT32_C(0x0e)
+#define LC_ID_DYLINKER UINT32_C(0x0f)
+#define LC_PREBOUND_DYLIB UINT32_C(0x10)
+#define LC_ROUTINES UINT32_C(0x11)
+#define LC_SUB_FRAMEWORK UINT32_C(0x12)
+#define LC_SUB_UMBRELLA UINT32_C(0x13)
+#define LC_SUB_CLIENT UINT32_C(0x14)
+#define LC_SUB_LIBRARY UINT32_C(0x15)
+#define LC_TWOLEVEL_HINTS UINT32_C(0x16)
+#define LC_PREBIND_CKSUM UINT32_C(0x17)
+#define LC_LOAD_WEAK_DYLIB (UINT32_C(0x18) | LC_REQ_DYLD)
+#define LC_SEGMENT_64 UINT32_C(0x19)
+#define LC_ROUTINES_64 UINT32_C(0x1a)
+#define LC_UUID UINT32_C(0x1b)
+#define LC_RPATH (UINT32_C(0x1c) | LC_REQ_DYLD)
+#define LC_CODE_SIGNATURE UINT32_C(0x1d)
+#define LC_SEGMENT_SPLIT_INFO UINT32_C(0x1e)
+#define LC_REEXPORT_DYLIB (UINT32_C(0x1f) | LC_REQ_DYLD)
+#define LC_LAZY_LOAD_DYLIB UINT32_C(0x20)
+#define LC_ENCRYPTION_INFO UINT32_C(0x21)
+#define LC_DYLD_INFO UINT32_C(0x22)
+#define LC_DYLD_INFO_ONLY (UINT32_C(0x22) | LC_REQ_DYLD)
+#define LC_LOAD_UPWARD_DYLIB (UINT32_C(0x23) | LC_REQ_DYLD)
+#define LC_VERSION_MIN_MACOSX UINT32_C(0x24)
+#define LC_VERSION_MIN_IPHONEOS UINT32_C(0x25)
+#define LC_FUNCTION_STARTS UINT32_C(0x26)
+#define LC_DYLD_ENVIRONMENT UINT32_C(0x27)
+#define LC_MAIN (UINT32_C(0x28) | LC_REQ_DYLD)
+#define LC_DATA_IN_CODE UINT32_C(0x29)
+#define LC_SOURCE_VERSION UINT32_C(0x2a)
+#define LC_DYLIB_CODE_SIGN_DRS UINT32_C(0x2b)
+
+
+typedef struct lc_str
+{
+ uint32_t offset;
+} lc_str_t;
+
+typedef struct segment_command_32
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+ char segname[16];
+ uint32_t vmaddr;
+ uint32_t vmsize;
+ uint32_t fileoff;
+ uint32_t filesize;
+ uint32_t maxprot;
+ uint32_t initprot;
+ uint32_t nsects;
+ uint32_t flags;
+} segment_command_32_t;
+
+typedef struct segment_command_64
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+ char segname[16];
+ uint64_t vmaddr;
+ uint64_t vmsize;
+ uint64_t fileoff;
+ uint64_t filesize;
+ uint32_t maxprot;
+ uint32_t initprot;
+ uint32_t nsects;
+ uint32_t flags;
+} segment_command_64_t;
+
+/* segment flags */
+#define SG_HIGHVM UINT32_C(0x00000001)
+#define SG_FVMLIB UINT32_C(0x00000002)
+#define SG_NORELOC UINT32_C(0x00000004)
+#define SG_PROTECTED_VERSION_1 UINT32_C(0x00000008)
+
+/* maxprot/initprot */
+#ifndef VM_PROT_NONE
+# define VM_PROT_NONE UINT32_C(0x00000000)
+# define VM_PROT_READ UINT32_C(0x00000001)
+# define VM_PROT_WRITE UINT32_C(0x00000002)
+# define VM_PROT_EXECUTE UINT32_C(0x00000004)
+# define VM_PROT_ALL UINT32_C(0x00000007)
+#endif
+
+typedef struct section_32
+{
+ char sectname[16];
+ char segname[16];
+ uint32_t addr;
+ uint32_t size;
+ uint32_t offset;
+ uint32_t align;
+ uint32_t reloff;
+ uint32_t nreloc;
+ uint32_t flags;
+ uint32_t reserved1;
+ uint32_t reserved2;
+} section_32_t;
+
+typedef struct section_64
+{
+ char sectname[16];
+ char segname[16];
+ uint64_t addr;
+ uint64_t size;
+ uint32_t offset;
+ uint32_t align;
+ uint32_t reloff;
+ uint32_t nreloc;
+ uint32_t flags;
+ uint32_t reserved1;
+ uint32_t reserved2;
+ uint32_t reserved3;
+} section_64_t;
+
+/* section flags */
+#define SECTION_TYPE UINT32_C(0x000000ff)
+#define S_REGULAR 0x0
+#define S_ZEROFILL 0x1
+#define S_CSTRING_LITERALS 0x2
+#define S_4BYTE_LITERALS 0x3
+#define S_8BYTE_LITERALS 0x4
+#define S_LITERAL_POINTERS 0x5
+#define S_NON_LAZY_SYMBOL_POINTERS 0x6
+#define S_LAZY_SYMBOL_POINTERS 0x7
+#define S_SYMBOL_STUBS 0x8
+#define S_MOD_INIT_FUNC_POINTERS 0x9
+#define S_MOD_TERM_FUNC_POINTERS 0xa
+#define S_COALESCED 0xb
+#define S_GB_ZEROFILL 0xc
+#define S_INTERPOSING 0xd
+#define S_16BYTE_LITERALS 0xe
+#define S_DTRACE_DOF 0xf
+#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10
+
+#define SECTION_ATTRIBUTES UINT32_C(0xffffff00)
+#define SECTION_ATTRIBUTES_USR UINT32_C(0xff000000)
+#define S_ATTR_PURE_INSTRUCTIONS UINT32_C(0x80000000)
+#define S_ATTR_NO_TOC UINT32_C(0x40000000)
+#define S_ATTR_STRIP_STATIC_SYMS UINT32_C(0x20000000)
+#define S_ATTR_NO_DEAD_STRIP UINT32_C(0x10000000)
+#define S_ATTR_LIVE_SUPPORT UINT32_C(0x08000000)
+#define S_ATTR_SELF_MODIFYING_CODE UINT32_C(0x04000000)
+#define S_ATTR_DEBUG UINT32_C(0x02000000)
+#define SECTION_ATTRIBUTES_SYS UINT32_C(0x00ffff00)
+#define S_ATTR_SOME_INSTRUCTIONS UINT32_C(0x00000400)
+#define S_ATTR_EXT_RELOC UINT32_C(0x00000200)
+#define S_ATTR_LOC_RELOC UINT32_C(0x00000100)
+
+/* standard section names */
+#define SEG_PAGEZERO "__PAGEZERO"
+#define SEG_TEXT "__TEXT"
+#define SECT_TEXT "__text"
+#define SECT_FVMLIB_INIT0 "__fvmlib_init0"
+#define SECT_FVMLIB_INIT1 "__fvmlib_init1"
+#define SEG_DATA "__DATA"
+#define SECT_DATA "__data"
+#define SECT_BSS "__bss"
+#define SECT_COMMON "__common"
+#define SEG_OBJC "__OBJC"
+#define SECT_OBJC_SYMBOLS "__symbol_table"
+#define SECT_OBJC_MODULES "__module_info"
+#define SECT_OBJC_STRINGS "__selector_strs"
+#define SECT_OBJC_REFS "__selector_refs"
+#define SEG_ICON "__ICON"
+#define SECT_ICON_HEADER "__header"
+#define SECT_ICON_TIFF "__tiff"
+#define SEG_LINKEDIT "__LINKEDIT"
+#define SEG_UNIXSTACK "__UNIXSTACK"
+#define SEG_IMPORT "__IMPORT"
+
+typedef struct thread_command
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+} thread_command_t;
+
+typedef struct symtab_command
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+ uint32_t symoff;
+ uint32_t nsyms;
+ uint32_t stroff;
+ uint32_t strsize;
+} symtab_command_t;
+
+typedef struct uuid_command
+{
+ uint32_t cmd;
+ uint32_t cmdsize;
+ uint8_t uuid[16];
+} uuid_command_t;
+
+typedef struct macho_nlist_32
+{
+ union
+ {
+ int32_t n_strx;
+ } n_un;
+ uint8_t n_type;
+ uint8_t n_sect;
+ int16_t n_desc;
+ uint32_t n_value;
+} macho_nlist_32_t;
+
+
+typedef struct macho_nlist_64
+{
+ union
+ {
+ uint32_t n_strx;
+ } n_un;
+ uint8_t n_type;
+ uint8_t n_sect;
+ int16_t n_desc;
+ uint64_t n_value;
+} macho_nlist_64_t;
+
+#define MACHO_N_EXT UINT8_C(0x01)
+#define MACHO_N_PEXT UINT8_C(0x10)
+
+#define MACHO_N_TYPE UINT8_C(0x0e)
+#define MACHO_N_UNDF UINT8_C(0x00)
+#define MACHO_N_ABS UINT8_C(0x02)
+#define MACHO_N_INDR UINT8_C(0x0a)
+#define MACHO_N_PBUD UINT8_C(0x0c)
+#define MACHO_N_SECT UINT8_C(0x0e)
+
+#define MACHO_N_STAB UINT8_C(0xe0)
+#define MACHO_N_GSYM UINT8_C(0x20)
+#define MACHO_N_FNAME UINT8_C(0x22)
+#define MACHO_N_FUN UINT8_C(0x24)
+#define MACHO_N_STSYM UINT8_C(0x26)
+#define MACHO_N_LCSYM UINT8_C(0x28)
+#define MACHO_N_BNSYM UINT8_C(0x2e)
+#define MACHO_N_PC UINT8_C(0x30)
+#define MACHO_N_OPT UINT8_C(0x3c)
+#define MACHO_N_RSYM UINT8_C(0x40)
+#define MACHO_N_SLINE UINT8_C(0x44)
+#define MACHO_N_ENSYM UINT8_C(0x4e)
+#define MACHO_N_SSYM UINT8_C(0x60)
+#define MACHO_N_SO UINT8_C(0x64)
+#define MACHO_N_OSO UINT8_C(0x66)
+#define MACHO_N_LSYM UINT8_C(0x80)
+#define MACHO_N_BINCL UINT8_C(0x82)
+#define MACHO_N_SOL UINT8_C(0x84)
+#define MACHO_N_PARAMS UINT8_C(0x86)
+#define MACHO_N_VERSION UINT8_C(0x88)
+#define MACHO_N_OLEVEL UINT8_C(0x8A)
+#define MACHO_N_PSYM UINT8_C(0xa0)
+#define MACHO_N_EINCL UINT8_C(0xa2)
+#define MACHO_N_ENTRY UINT8_C(0xa4)
+#define MACHO_N_LBRAC UINT8_C(0xc0)
+#define MACHO_N_EXCL UINT8_C(0xc2)
+#define MACHO_N_RBRAC UINT8_C(0xe0)
+#define MACHO_N_BCOMM UINT8_C(0xe2)
+#define MACHO_N_ECOMM UINT8_C(0xe4)
+#define MACHO_N_ECOML UINT8_C(0xe8)
+#define MACHO_N_LENG UINT8_C(0xfe)
+
+#define MACHO_NO_SECT UINT8_C(0x00)
+#define MACHO_MAX_SECT UINT8_C(0xff)
+
+#define REFERENCE_TYPE UINT16_C(0x000f)
+#define REFERENCE_FLAG_UNDEFINED_NON_LAZY 0
+#define REFERENCE_FLAG_UNDEFINED_LAZY 1
+#define REFERENCE_FLAG_DEFINED 2
+#define REFERENCE_FLAG_PRIVATE_DEFINED 3
+#define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 4
+#define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 5
+#define REFERENCED_DYNAMICALLY UINT16_C(0x0010)
+
+#define GET_LIBRARY_ORDINAL(a_n_desc) \
+ RT_BYTE2(a_n_desc)
+#define SET_LIBRARY_ORDINAL(a_n_desc, a_ordinal) \
+ do { (a_n_desc) = RT_MAKE_U16(RT_BYTE1(a_n_desc), a_ordinal); } while (0)
+
+#define SELF_LIBRARY_ORDINAL 0x00
+#define MAX_LIBRARY_ORDINAL 0xfd
+#define DYNAMIC_LOOKUP_ORDINAL 0xfe
+#define EXECUTABLE_ORDINAL 0xff
+
+#define N_NO_DEAD_STRIP UINT16_C(0x0020)
+#define N_DESC_DISCARDED UINT16_C(0x0020)
+#define N_WEAK_REF UINT16_C(0x0040)
+#define N_WEAK_DEF UINT16_C(0x0080)
+#define N_REF_TO_WEAK UINT16_C(0x0080)
+
+typedef struct macho_relocation_info
+{
+ int32_t r_address;
+ uint32_t r_symbolnum : 24;
+ uint32_t r_pcrel : 1;
+ uint32_t r_length : 2;
+ uint32_t r_extern : 1;
+ uint32_t r_type : 4;
+} macho_relocation_info_t;
+
+#define R_ABS 0
+#define R_SCATTERED UINT32_C(0x80000000)
+
+typedef struct scattered_relocation_info
+{
+#ifdef RT_LITTLE_ENDIAN
+ uint32_t r_address : 24;
+ uint32_t r_type : 4;
+ uint32_t r_length : 2;
+ uint32_t r_pcrel : 1;
+ uint32_t r_scattered : 1;
+#elif defined(RT_BIG_ENDIAN)
+ uint32_t r_scattered : 1;
+ uint32_t r_pcrel : 1;
+ uint32_t r_length : 2;
+ uint32_t r_type : 4;
+ uint32_t r_address : 24;
+#else
+# error "Neither K_ENDIAN isn't LITTLE or BIG!"
+#endif
+ int32_t r_value;
+} scattered_relocation_info_t;
+
+typedef enum reloc_type_generic
+{
+ GENERIC_RELOC_VANILLA = 0,
+ GENERIC_RELOC_PAIR,
+ GENERIC_RELOC_SECTDIFF,
+ GENERIC_RELOC_PB_LA_PTR,
+ GENERIC_RELOC_LOCAL_SECTDIFF
+} reloc_type_generic_t;
+
+typedef enum reloc_type_x86_64
+{
+ X86_64_RELOC_UNSIGNED = 0,
+ X86_64_RELOC_SIGNED,
+ X86_64_RELOC_BRANCH,
+ X86_64_RELOC_GOT_LOAD,
+ X86_64_RELOC_GOT,
+ X86_64_RELOC_SUBTRACTOR,
+ X86_64_RELOC_SIGNED_1,
+ X86_64_RELOC_SIGNED_2,
+ X86_64_RELOC_SIGNED_4
+} reloc_type_x86_64_t;
+
+#endif
+
diff --git a/include/iprt/formats/mz.mac b/include/iprt/formats/mz.mac
new file mode 100644
index 00000000..bdcd45f7
--- /dev/null
+++ b/include/iprt/formats/mz.mac
@@ -0,0 +1,56 @@
+;; @file
+; IPRT - MZ (DOS Executable Header) definitions for YASM/NASM.
+;
+
+;
+; Copyright (C) 2006-2013 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_formats_mz_mac
+%define ___iprt_formats_mz_mac
+
+struc IMAGE_DOS_HEADER
+ .e_magic resw 1
+ .e_cblp resw 1
+ .e_cp resw 1
+ .e_crlc resw 1
+ .e_cparhdr resw 1
+ .e_minalloc resw 1
+ .e_maxalloc resw 1
+ .e_ss resw 1
+ .e_sp resw 1
+ .e_csum resw 1
+ .e_ip resw 1
+ .e_cs resw 1
+ .e_lfarlc resw 1
+ .e_ovno resw 1
+ .e_res resw 4
+ .e_oemid resw 1
+ .e_oeminfo resw 1
+ .e_res2 resw 10
+ .e_lfanew resd 1
+endstruc
+
+%ifndef IMAGE_DOS_SIGNATURE
+ %define IMAGE_DOS_SIGNATURE 0x5a4d
+%endif
+
+%endif
+
diff --git a/include/iprt/formats/pe.mac b/include/iprt/formats/pe.mac
new file mode 100644
index 00000000..0d23ef54
--- /dev/null
+++ b/include/iprt/formats/pe.mac
@@ -0,0 +1,722 @@
+;; @file
+; IPRT - Windows PE definitions for YASM/NASM.
+;
+
+;
+; Copyright (C) 2006-2013 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_format_pe_mac
+%define ___iprt_format_pe_mac
+
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+
+;*******************************************************************************
+;* Defined Constants And Macros *
+;*******************************************************************************
+%define IMAGE_NT_SIGNATURE 0x00004550
+
+; file header
+%define IMAGE_FILE_MACHINE_I386 0x014c
+%define IMAGE_FILE_MACHINE_AMD64 0x8664
+
+%define IMAGE_FILE_RELOCS_STRIPPED 0x0001
+%define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
+%define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
+%define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
+%define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010
+%define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
+%define IMAGE_FILE_16BIT_MACHINE 0x0040
+%define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
+%define IMAGE_FILE_32BIT_MACHINE 0x0100
+%define IMAGE_FILE_DEBUG_STRIPPED 0x0200
+%define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
+%define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
+%define IMAGE_FILE_SYSTEM 0x1000
+%define IMAGE_FILE_DLL 0x2000
+%define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
+%define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
+
+
+; optional header
+%define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10B
+%define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20B
+
+%define IMAGE_SUBSYSTEM_UNKNOWN 0x0
+%define IMAGE_SUBSYSTEM_NATIVE 0x1
+%define IMAGE_SUBSYSTEM_WINDOWS_GUI 0x2
+%define IMAGE_SUBSYSTEM_WINDOWS_CUI 0x3
+%define IMAGE_SUBSYSTEM_OS2_GUI 0x4
+%define IMAGE_SUBSYSTEM_OS2_CUI 0x5
+%define IMAGE_SUBSYSTEM_POSIX_CUI 0x7
+
+%define IMAGE_LIBRARY_PROCESS_INIT 0x0001
+%define IMAGE_LIBRARY_PROCESS_TERM 0x0002
+%define IMAGE_LIBRARY_THREAD_INIT 0x0004
+%define IMAGE_LIBRARY_THREAD_TERM 0x0008
+%define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
+%define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
+%define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
+%define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
+%define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
+
+%define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 0x10
+
+%define IMAGE_DIRECTORY_ENTRY_EXPORT 0x0
+%define IMAGE_DIRECTORY_ENTRY_IMPORT 0x1
+%define IMAGE_DIRECTORY_ENTRY_RESOURCE 0x2
+%define IMAGE_DIRECTORY_ENTRY_EXCEPTION 0x3
+%define IMAGE_DIRECTORY_ENTRY_SECURITY 0x4
+%define IMAGE_DIRECTORY_ENTRY_BASERELOC 0x5
+%define IMAGE_DIRECTORY_ENTRY_DEBUG 0x6
+%define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 0x7
+%define IMAGE_DIRECTORY_ENTRY_COPYRIGHT IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
+%define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 0x8
+%define IMAGE_DIRECTORY_ENTRY_TLS 0x9
+%define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 0xa
+%define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 0xb
+%define IMAGE_DIRECTORY_ENTRY_IAT 0xc
+%define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 0xd
+%define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 0xe
+
+
+; section header
+%define IMAGE_SIZEOF_SHORT_NAME 0x8
+
+%define IMAGE_SCN_TYPE_REG 0x00000000
+%define IMAGE_SCN_TYPE_DSECT 0x00000001
+%define IMAGE_SCN_TYPE_NOLOAD 0x00000002
+%define IMAGE_SCN_TYPE_GROUP 0x00000004
+%define IMAGE_SCN_TYPE_NO_PAD 0x00000008
+%define IMAGE_SCN_TYPE_COPY 0x00000010
+
+%define IMAGE_SCN_CNT_CODE 0x00000020
+%define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
+%define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
+
+%define IMAGE_SCN_LNK_OTHER 0x00000100
+%define IMAGE_SCN_LNK_INFO 0x00000200
+%define IMAGE_SCN_TYPE_OVER 0x00000400
+%define IMAGE_SCN_LNK_REMOVE 0x00000800
+%define IMAGE_SCN_LNK_COMDAT 0x00001000
+%define IMAGE_SCN_MEM_PROTECTED 0x00004000
+%define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000
+%define IMAGE_SCN_GPREL 0x00008000
+%define IMAGE_SCN_MEM_FARDATA 0x00008000
+%define IMAGE_SCN_MEM_SYSHEAP 0x00010000
+%define IMAGE_SCN_MEM_PURGEABLE 0x00020000
+%define IMAGE_SCN_MEM_16BIT 0x00020000
+%define IMAGE_SCN_MEM_LOCKED 0x00040000
+%define IMAGE_SCN_MEM_PRELOAD 0x00080000
+
+%define IMAGE_SCN_ALIGN_1BYTES 0x00100000
+%define IMAGE_SCN_ALIGN_2BYTES 0x00200000
+%define IMAGE_SCN_ALIGN_4BYTES 0x00300000
+%define IMAGE_SCN_ALIGN_8BYTES 0x00400000
+%define IMAGE_SCN_ALIGN_16BYTES 0x00500000
+%define IMAGE_SCN_ALIGN_32BYTES 0x00600000
+%define IMAGE_SCN_ALIGN_64BYTES 0x00700000
+%define IMAGE_SCN_ALIGN_128BYTES 0x00800000
+%define IMAGE_SCN_ALIGN_256BYTES 0x00900000
+%define IMAGE_SCN_ALIGN_512BYTES 0x00A00000
+%define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000
+%define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000
+%define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000
+%define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000
+%define IMAGE_SCN_ALIGN_MASK 0x00F00000
+%define IMAGE_SCN_ALIGN_SHIFT 20
+
+%define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
+%define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+%define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
+%define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
+%define IMAGE_SCN_MEM_SHARED 0x10000000
+%define IMAGE_SCN_MEM_EXECUTE 0x20000000
+%define IMAGE_SCN_MEM_READ 0x40000000
+%define IMAGE_SCN_MEM_WRITE 0x80000000
+
+
+; relocations
+%define IMAGE_REL_BASED_ABSOLUTE 0x0
+%define IMAGE_REL_BASED_HIGH 0x1
+%define IMAGE_REL_BASED_LOW 0x2
+%define IMAGE_REL_BASED_HIGHLOW 0x3
+%define IMAGE_REL_BASED_HIGHADJ 0x4
+%define IMAGE_REL_BASED_MIPS_JMPADDR 0x5
+%define IMAGE_REL_BASED_MIPS_JMPADDR16 0x9
+%define IMAGE_REL_BASED_IA64_IMM64 0x9
+%define IMAGE_REL_BASED_DIR64 0xa
+%define IMAGE_REL_BASED_HIGH3ADJ 0xb
+
+
+; imports
+%define IMAGE_ORDINAL_FLAG32 0x80000000
+%define IMAGE_ORDINAL_FLAG64 UINT64_MAX(0x8000000000000000)
+
+
+; debug dir
+%define IMAGE_DEBUG_TYPE_UNKNOWN UINT32_C(0x0)
+%define IMAGE_DEBUG_TYPE_COFF UINT32_C(0x1)
+%define IMAGE_DEBUG_TYPE_CODEVIEW UINT32_C(0x2)
+%define IMAGE_DEBUG_TYPE_FPO UINT32_C(0x3)
+%define IMAGE_DEBUG_TYPE_MISC UINT32_C(0x4)
+%define IMAGE_DEBUG_TYPE_EXCEPTION UINT32_C(0x5)
+%define IMAGE_DEBUG_TYPE_FIXUP UINT32_C(0x6)
+%define IMAGE_DEBUG_TYPE_OMAP_TO_SRC UINT32_C(0x7)
+%define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC UINT32_C(0x8)
+%define IMAGE_DEBUG_TYPE_BORLAND UINT32_C(0x9)
+%define IMAGE_DEBUG_TYPE_RESERVED10 UINT32_C(0x10)
+
+%define IMAGE_DEBUG_MISC_EXENAME UINT32_C(1)
+
+; security directory
+%define WIN_CERT_REVISION_1_0 UINT16_C(0x0100)
+%define WIN_CERT_REVISION_2_0 UINT16_C(0x0200)
+
+%define WIN_CERT_TYPE_X509 UINT16_C(1)
+%define WIN_CERT_TYPE_PKCS_SIGNED_DATA UINT16_C(2)
+%define WIN_CERT_TYPE_RESERVED_1 UINT16_C(3)
+%define WIN_CERT_TYPE_TS_STACK_SIGNED UINT16_C(4)
+%define WIN_CERT_TYPE_EFI_PKCS115 UINT16_C(0x0ef0)
+%define WIN_CERT_TYPE_EFI_GUID UINT16_C(0x0ef1)
+
+
+; For .DBG files.
+%define IMAGE_SEPARATE_DEBUG_SIGNATURE UINT16_C(0x4944)
+
+%define IMAGE_SIZE_OF_SYMBOL 18
+%define IMAGE_SIZE_OF_SYMBOL_EX 20
+
+%define IMAGE_SYM_UNDEFINED INT16_C(0)
+%define IMAGE_SYM_ABSOLUTE INT16_C(-1)
+%define IMAGE_SYM_DEBUG INT16_C(-2)
+
+%define IMAGE_SYM_CLASS_END_OF_FUNCTION UINT8_C(0xff) ; -1
+%define IMAGE_SYM_CLASS_NULL UINT8_C(0)
+%define IMAGE_SYM_CLASS_AUTOMATIC UINT8_C(1)
+%define IMAGE_SYM_CLASS_EXTERNAL UINT8_C(2)
+%define IMAGE_SYM_CLASS_STATIC UINT8_C(3)
+%define IMAGE_SYM_CLASS_REGISTER UINT8_C(4)
+%define IMAGE_SYM_CLASS_EXTERNAL_DEF UINT8_C(5)
+%define IMAGE_SYM_CLASS_LABEL UINT8_C(6)
+%define IMAGE_SYM_CLASS_UNDEFINED_LABEL UINT8_C(7)
+%define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT UINT8_C(8)
+%define IMAGE_SYM_CLASS_ARGUMENT UINT8_C(9)
+%define IMAGE_SYM_CLASS_STRUCT_TAG UINT8_C(10)
+%define IMAGE_SYM_CLASS_MEMBER_OF_UNION UINT8_C(11)
+%define IMAGE_SYM_CLASS_UNION_TAG UINT8_C(12)
+%define IMAGE_SYM_CLASS_TYPE_DEFINITION UINT8_C(13)
+%define IMAGE_SYM_CLASS_UNDEFINED_STATIC UINT8_C(14)
+%define IMAGE_SYM_CLASS_ENUM_TAG UINT8_C(15)
+%define IMAGE_SYM_CLASS_MEMBER_OF_ENUM UINT8_C(16)
+%define IMAGE_SYM_CLASS_REGISTER_PARAM UINT8_C(17)
+%define IMAGE_SYM_CLASS_BIT_FIELD UINT8_C(18)
+%define IMAGE_SYM_CLASS_FAR_EXTERNAL UINT8_C(68)
+%define IMAGE_SYM_CLASS_BLOCK UINT8_C(100)
+%define IMAGE_SYM_CLASS_FUNCTION UINT8_C(101)
+%define IMAGE_SYM_CLASS_END_OF_STRUCT UINT8_C(102)
+%define IMAGE_SYM_CLASS_FILE UINT8_C(103)
+%define IMAGE_SYM_CLASS_SECTION UINT8_C(104)
+%define IMAGE_SYM_CLASS_WEAK_EXTERNAL UINT8_C(105)
+%define IMAGE_SYM_CLASS_CLR_TOKEN UINT8_C(107)
+
+
+%define IMAGE_SYM_TYPE_NULL UINT16_C(0x0000)
+%define IMAGE_SYM_TYPE_VOID UINT16_C(0x0001)
+%define IMAGE_SYM_TYPE_CHAR UINT16_C(0x0002)
+%define IMAGE_SYM_TYPE_SHORT UINT16_C(0x0003)
+%define IMAGE_SYM_TYPE_INT UINT16_C(0x0004)
+%define IMAGE_SYM_TYPE_LONG UINT16_C(0x0005)
+%define IMAGE_SYM_TYPE_FLOAT UINT16_C(0x0006)
+%define IMAGE_SYM_TYPE_DOUBLE UINT16_C(0x0007)
+%define IMAGE_SYM_TYPE_STRUCT UINT16_C(0x0008)
+%define IMAGE_SYM_TYPE_UNION UINT16_C(0x0009)
+%define IMAGE_SYM_TYPE_ENUM UINT16_C(0x000a)
+%define IMAGE_SYM_TYPE_MOE UINT16_C(0x000b)
+%define IMAGE_SYM_TYPE_BYTE UINT16_C(0x000c)
+%define IMAGE_SYM_TYPE_WORD UINT16_C(0x000d)
+%define IMAGE_SYM_TYPE_UINT UINT16_C(0x000e)
+%define IMAGE_SYM_TYPE_DWORD UINT16_C(0x000f)
+%define IMAGE_SYM_TYPE_PCODE UINT16_C(0x8000)
+
+%define IMAGE_SYM_DTYPE_NULL UINT16_C(0x0)
+%define IMAGE_SYM_DTYPE_POINTER UINT16_C(0x1)
+%define IMAGE_SYM_DTYPE_FUNCTION UINT16_C(0x2)
+%define IMAGE_SYM_DTYPE_ARRAY UINT16_C(0x3)
+
+
+%define N_BTMASK UINT16_C(0x000f)
+%define N_TMASK UINT16_C(0x0030)
+%define N_TMASK1 UINT16_C(0x00c0)
+%define N_TMASK2 UINT16_C(0x00f0)
+%define N_BTSHFT 4
+%define N_TSHIFT 2
+
+
+;*******************************************************************************
+;* Structures and Typedefs *
+;*******************************************************************************
+
+struc IMAGE_FILE_HEADER
+ .Machine resw 1 ;;< 0x00
+ .NumberOfSections resw 1 ;;< 0x02
+ .TimeDateStamp resd 1 ;;< 0x04
+ .PointerToSymbolTable resd 1 ;;< 0x08
+ .NumberOfSymbols resd 1 ;;< 0x0c
+ .SizeOfOptionalHeader resw 1 ;;< 0x10
+ .Characteristics resw 1 ;;< 0x12
+endstruc
+AssertCompileSize(IMAGE_FILE_HEADER, 0x14)
+
+struc IMAGE_DATA_DIRECTORY
+ .VirtualAddress resd 1
+ .Size resd 1
+endstruc
+
+
+struc IMAGE_OPTIONAL_HEADER32
+ .Magic resw 1 ;;< 0x00
+ .MajorLinkerVersion resb 1 ;;< 0x02
+ .MinorLinkerVersion resb 1 ;;< 0x03
+ .SizeOfCode resd 1 ;;< 0x04
+ .SizeOfInitializedData resd 1 ;;< 0x08
+ .SizeOfUninitializedData resd 1 ;;< 0x0c
+ .AddressOfEntryPoint resd 1 ;;< 0x10
+ .BaseOfCode resd 1 ;;< 0x14
+ .BaseOfData resd 1 ;;< 0x18
+ .ImageBase resd 1 ;;< 0x1c
+ .SectionAlignment resd 1 ;;< 0x20
+ .FileAlignment resd 1 ;;< 0x24
+ .MajorOperatingSystemVersion resw 1 ;;< 0x28
+ .MinorOperatingSystemVersion resw 1 ;;< 0x2a
+ .MajorImageVersion resw 1 ;;< 0x2c
+ .MinorImageVersion resw 1 ;;< 0x2e
+ .MajorSubsystemVersion resw 1 ;;< 0x30
+ .MinorSubsystemVersion resw 1 ;;< 0x32
+ .Win32VersionValue resd 1 ;;< 0x34
+ .SizeOfImage resd 1 ;;< 0x38
+ .SizeOfHeaders resd 1 ;;< 0x3c
+ .CheckSum resd 1 ;;< 0x40
+ .Subsystem resw 1 ;;< 0x44
+ .DllCharacteristics resw 1 ;;< 0x46
+ .SizeOfStackReserve resd 1 ;;< 0x48
+ .SizeOfStackCommit resd 1 ;;< 0x4c
+ .SizeOfHeapReserve resd 1 ;;< 0x50
+ .SizeOfHeapCommit resd 1 ;;< 0x54
+ .LoaderFlags resd 1 ;;< 0x58
+ .NumberOfRvaAndSizes resd 1 ;;< 0x5c
+ .DataDirectory resb IMAGE_DATA_DIRECTORY_size * IMAGE_NUMBEROF_DIRECTORY_ENTRIES ;;< 0x60; 0x10*8 = 0x80
+endstruc
+AssertCompileSize(IMAGE_OPTIONAL_HEADER32, 0xe0);
+
+struc IMAGE_OPTIONAL_HEADER64
+ .Magic resw 1 ;;< 0x00
+ .MajorLinkerVersion resb 1 ;;< 0x02
+ .MinorLinkerVersion resb 1 ;;< 0x03
+ .SizeOfCode resd 1 ;;< 0x04
+ .SizeOfInitializedData resd 1 ;;< 0x08
+ .SizeOfUninitializedData resd 1 ;;< 0x0c
+ .AddressOfEntryPoint resd 1 ;;< 0x10
+ .BaseOfCode resd 1 ;;< 0x14
+ .ImageBase resq 1 ;;< 0x18
+ .SectionAlignment resd 1 ;;< 0x20
+ .FileAlignment resd 1 ;;< 0x24
+ .MajorOperatingSystemVersion resw 1 ;;< 0x28
+ .MinorOperatingSystemVersion resw 1 ;;< 0x2a
+ .MajorImageVersion resw 1 ;;< 0x2c
+ .MinorImageVersion resw 1 ;;< 0x2e
+ .MajorSubsystemVersion resw 1 ;;< 0x30
+ .MinorSubsystemVersion resw 1 ;;< 0x32
+ .Win32VersionValue resd 1 ;;< 0x34
+ .SizeOfImage resd 1 ;;< 0x38
+ .SizeOfHeaders resd 1 ;;< 0x3c
+ .CheckSum resd 1 ;;< 0x40
+ .Subsystem resw 1 ;;< 0x44
+ .DllCharacteristics resw 1 ;;< 0x46
+ .SizeOfStackReserve resq 1 ;;< 0x48
+ .SizeOfStackCommit resq 1 ;;< 0x50
+ .SizeOfHeapReserve resq 1 ;;< 0x58
+ .SizeOfHeapCommit resq 1 ;;< 0x60
+ .LoaderFlags resd 1 ;;< 0x68
+ .NumberOfRvaAndSizes resd 1 ;;< 0x6c
+ .DataDirectory resb IMAGE_DATA_DIRECTORY_size * IMAGE_NUMBEROF_DIRECTORY_ENTRIES ;;< 0x70; 0x10*8 = 0x80
+endstruc ; size: 0xf0
+AssertCompileSize(IMAGE_OPTIONAL_HEADER64, 0xf0);
+
+
+struc IMAGE_NT_HEADERS32
+ .Signature resd 1 ;;< 0x00
+ .FileHeader resb IMAGE_FILE_HEADER_size ; ;;< 0x04
+ .OptionalHeader resb IMAGE_OPTIONAL_HEADER32_size ;;< 0x18
+endstruc ; size: 0xf8
+AssertCompileSize(IMAGE_NT_HEADERS32, 0xf8);
+AssertCompileMemberOffset(IMAGE_NT_HEADERS32, FileHeader, 4);
+AssertCompileMemberOffset(IMAGE_NT_HEADERS32, OptionalHeader, 24);
+
+struc IMAGE_NT_HEADERS64
+ .Signature resd 1 ;;< 0x00
+ .FileHeader resb IMAGE_FILE_HEADER_size ;;< 0x04
+ .OptionalHeader resb IMAGE_OPTIONAL_HEADER64_size ;;< 0x18
+endstruc ; size: 0x108
+AssertCompileSize(IMAGE_NT_HEADERS64, 0x108);
+AssertCompileMemberOffset(IMAGE_NT_HEADERS64, FileHeader, 4);
+AssertCompileMemberOffset(IMAGE_NT_HEADERS64, OptionalHeader, 24);
+
+
+struc IMAGE_SECTION_HEADER
+ .Name resb IMAGE_SIZEOF_SHORT_NAME
+ .Misc.VirtualSize resd 1
+ .VirtualAddress resd 1
+ .SizeOfRawData resd 1
+ .PointerToRawData resd 1
+ .PointerToRelocations resd 1
+ .PointerToLinenumbers resd 1
+ .NumberOfRelocations resw 1
+ .NumberOfLinenumbers resw 1
+ .Characteristics resd 1
+endstruc
+%define IMAGE_SECTION_HEADER.Misc.PhysicalAddress IMAGE_SECTION_HEADER.Misc.VirtualSize
+
+
+struc IMAGE_BASE_RELOCATION
+ .VirtualAddress resd 1
+ .SizeOfBlock resd 1
+endstruc
+
+
+struc IMAGE_EXPORT_DIRECTORY
+ .Characteristics resd 1
+ .TimeDateStamp resd 1
+ .MajorVersion resw 1
+ .MinorVersion resw 1
+ .Name resd 1
+ .Base resd 1
+ .NumberOfFunctions resd 1
+ .NumberOfNames resd 1
+ .AddressOfFunctions resd 1
+ .AddressOfNames resd 1
+ .AddressOfNameOrdinals resd 1
+endstruc
+
+
+struc IMAGE_IMPORT_DESCRIPTOR
+ .u.Characteristics resd 1
+ .TimeDateStamp resd 1
+ .ForwarderChain resd 1
+ .Name resd 1
+ .FirstThunk resd 1
+endstruc
+%define IMAGE_IMPORT_DESCRIPTOR.u.OriginalFirstThunk IMAGE_IMPORT_DESCRIPTOR.u.Characteristics
+
+struc IMAGE_IMPORT_BY_NAME
+ .Hint resw 1
+ .Name resb 1
+endstruc
+
+
+struc IMAGE_THUNK_DATA64
+ .u1.ForwarderString resq 1
+endstruc
+%define IMAGE_THUNK_DATA64.u1.Function IMAGE_THUNK_DATA64.u1.ForwarderString
+%define IMAGE_THUNK_DATA64.u1.Ordinal IMAGE_THUNK_DATA64.u1.ForwarderString
+%define IMAGE_THUNK_DATA64.u1.AddressOfData IMAGE_THUNK_DATA64.u1.ForwarderString
+
+struc IMAGE_THUNK_DATA32
+ .u1.ForwarderString resd 1
+endstruc
+%define IMAGE_THUNK_DATA32.u1.Function IMAGE_THUNK_DATA32.u1.ForwarderString
+%define IMAGE_THUNK_DATA32.u1.Ordinal IMAGE_THUNK_DATA32.u1.ForwarderString
+%define IMAGE_THUNK_DATA32.u1.AddressOfData IMAGE_THUNK_DATA32.u1.ForwarderString
+
+
+struc IMAGE_LOAD_CONFIG_DIRECTORY32
+ .Size resd 1
+ .TimeDateStamp resd 1
+ .MajorVersion resw 1
+ .MinorVersion resw 1
+ .GlobalFlagsClear resd 1
+ .GlobalFlagsSet resd 1
+ .CriticalSectionDefaultTimeout resd 1
+ .DeCommitFreeBlockThreshold resd 1
+ .DeCommitTotalFreeThreshold resd 1
+ .LockPrefixTable resd 1
+ .MaximumAllocationSize resd 1
+ .VirtualMemoryThreshold resd 1
+ .ProcessHeapFlags resd 1
+ .ProcessAffinityMask resd 1
+ .CSDVersion resw 1
+ .Reserved1 resw 1
+ .EditList resd 1
+ .SecurityCookie resd 1
+ .SEHandlerTable resd 1
+ .SEHandlerCount resd 1
+endstruc
+
+struc IMAGE_LOAD_CONFIG_DIRECTORY64
+ .Size resd 1
+ .TimeDateStamp resd 1
+ .MajorVersion resw 1
+ .MinorVersion resw 1
+ .GlobalFlagsClear resd 1
+ .GlobalFlagsSet resd 1
+ .CriticalSectionDefaultTimeout resd 1
+ .DeCommitFreeBlockThreshold resq 1
+ .DeCommitTotalFreeThreshold resq 1
+ .LockPrefixTable resq 1
+ .MaximumAllocationSize resq 1
+ .VirtualMemoryThreshold resq 1
+ .ProcessAffinityMask resq 1
+ .ProcessHeapFlags resd 1
+ .CSDVersion resw 1
+ .Reserved1 resw 1
+ .EditList resq 1
+ .SecurityCookie resq 1
+ .SEHandlerTable resq 1
+ .SEHandlerCount resq 1
+endstruc
+
+
+struc IMAGE_DEBUG_DIRECTORY
+ .Characteristics resd 1
+ .TimeDateStamp resd 1
+ .MajorVersion resw 1
+ .MinorVersion resw 1
+ .Type resd 1
+ .SizeOfData resd 1
+ .AddressOfRawData resd 1
+ .PointerToRawData resd 1
+endstruc
+
+struc IMAGE_DEBUG_MISC
+ .DataType resd 1
+ .Length resd 1
+ .Unicode resb 1
+ .Reserved resb 3
+ .Data resb 1
+endstruc
+
+
+struc WIN_CERTIFICATE
+ .dwLength resd 1
+ .wRevision resw 1
+ .wCertificateType resw 1
+ .bCertificate resb 8
+endstruc
+
+;; The header of a .DBG file (NT4).
+struc IMAGE_SEPARATE_DEBUG_HEADER
+ .Signature resw 1 ;;< 0x00
+ .Flags resw 1 ;;< 0x02
+ .Machine resw 1 ;;< 0x04
+ .Characteristics resw 1 ;;< 0x06
+ .TimeDateStamp resd 1 ;;< 0x08
+ .CheckSum resd 1 ;;< 0x0c
+ .ImageBase resd 1 ;;< 0x10
+ .SizeOfImage resd 1 ;;< 0x14
+ .NumberOfSections resd 1 ;;< 0x18
+ .ExportedNamesSize resd 1 ;;< 0x1c
+ .DebugDirectorySize resd 1 ;;< 0x20
+ .SectionAlignment resd 1 ;;< 0x24
+ .Reserved resd 2 ;;< 0x28
+endstruc ; size: 0x30
+AssertCompileSize(IMAGE_SEPARATE_DEBUG_HEADER, 0x30);
+
+
+struc IMAGE_COFF_SYMBOLS_HEADER
+ .NumberOfSymbols resd 1
+ .LvaToFirstSymbol resd 1
+ .NumberOfLinenumbers resd 1
+ .LvaToFirstLinenumber resd 1
+ .RvaToFirstByteOfCode resd 1
+ .RvaToLastByteOfCode resd 1
+ .RvaToFirstByteOfData resd 1
+ .RvaToLastByteOfData resd 1
+endstruc
+AssertCompileSize(IMAGE_COFF_SYMBOLS_HEADER, 0x20);
+
+
+struc IMAGE_LINENUMBER
+ .Type.VirtualAddress resd 1
+ .Linenumber resw 1
+endstruc
+AssertCompileSize(IMAGE_LINENUMBER, 6);
+%define IMAGE_LINENUMBER.Type.SymbolTableIndex IMAGE_LINENUMBER.Type.VirtualAddress
+
+
+;;#pragma pack(2)
+;;struc IMAGE_SYMBOL
+;;{
+;; union
+;; {
+;; uint8_t ShortName[8];
+;; struct
+;; {
+;; .Short resd 1
+;; .Long resd 1
+;; } Name;
+;; uint32_t LongName[2];
+;; } N;
+;;
+;; .Value resd 1
+;; int16_t SectionNumber;
+;; .Type resw 1
+;; .StorageClass resb 1
+;; .NumberOfAuxSymbols resb 1
+;;} IMAGE_SYMBOL;
+;;#pragma pack()
+;;AssertCompileSize(IMAGE_SYMBOL, IMAGE_SIZE_OF_SYMBOL);
+;;
+;;
+;;#pragma pack(2)
+;;typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF
+;;{
+;; .bAuxType resb 1
+;; .bReserved resb 1
+;; .SymbolTableIndex resd 1
+;; uint8_t rgbReserved[12];
+;;} IMAGE_AUX_SYMBOL_TOKEN_DEF;
+;;#pragma pack()
+;;AssertCompileSize(IMAGE_AUX_SYMBOL_TOKEN_DEF, IMAGE_SIZE_OF_SYMBOL);
+;;
+;;
+;;#pragma pack(1)
+;;typedef union _IMAGE_AUX_SYMBOL
+;;{
+;; struct
+;; {
+;; .TagIndex resd 1
+;; union
+;; {
+;; struct
+;; {
+;; .Linenumber resw 1
+;; .Size resw 1
+;; } LnSz;
+;; } Misc;
+;; union
+;; {
+;; struct
+;; {
+;; .PointerToLinenumber resd 1
+;; .PointerToNextFunction resd 1
+;; } Function;
+;; struct
+;; {
+;; uint16_t Dimension[4];
+;; } Array;
+;; } FcnAry;
+;; .TvIndex resw 1
+;; } Sym;
+;;
+;; struct
+;; {
+;; uint8_t Name[IMAGE_SIZE_OF_SYMBOL];
+;; } File;
+;;
+;; struct
+;; {
+;; .Length resd 1
+;; .NumberOfRelocations resw 1
+;; .NumberOfLinenumbers resw 1
+;; .CheckSum resd 1
+;; .Number resw 1
+;; .Selection resb 1
+;; .bReserved resb 1
+;; .HighNumber resw 1
+;; } Section;
+;;
+;; IMAGE_AUX_SYMBOL_TOKEN_DEF TokenDef;
+;; struct
+;; {
+;; .crc resd 1
+;; uint8_t rgbReserved[14];
+;; } CRC;
+;;} IMAGE_AUX_SYMBOL;
+;;#pragma pack()
+;;AssertCompileSize(IMAGE_AUX_SYMBOL, IMAGE_SIZE_OF_SYMBOL);
+;;
+;;
+;;
+;;struc IMAGE_SYMBOL_EX
+;;{
+;; union
+;; {
+;; uint8_t ShortName[8];
+;; struct
+;; {
+;; .Short resd 1
+;; .Long resd 1
+;; } Name;
+;; uint32_t LongName[2];
+;; } N;
+;;
+;; .Value resd 1
+;; int32_t SectionNumber; /* The difference from IMAGE_SYMBOL
+;; .Type resw 1
+;; .StorageClass resb 1
+;; .NumberOfAuxSymbols resb 1
+;;} IMAGE_SYMBOL_EX;
+;;AssertCompileSize(IMAGE_SYMBOL_EX, IMAGE_SIZE_OF_SYMBOL_EX);
+;;
+;;
+;;typedef union _IMAGE_AUX_SYMBOL_EX
+;;{
+;; struct
+;; {
+;; .WeakDefaultSymIndex resd 1
+;; .WeakSearchType resd 1
+;; uint8_t rgbReserved[12];
+;; } Sym;
+;;
+;; struct
+;; {
+;; uint8_t Name[IMAGE_SIZE_OF_SYMBOL_EX];
+;; } File;
+;;
+;; struct
+;; {
+;; .Length resd 1
+;; .NumberOfRelocations resw 1
+;; .NumberOfLinenumbers resw 1
+;; .CheckSum resd 1
+;; .Number resw 1
+;; .Selection resb 1
+;; .bReserved resb 1
+;; .HighNumber resw 1
+;; uint8_t rgbReserved[2];
+;; } Section;
+;;
+;; IMAGE_AUX_SYMBOL_TOKEN_DEF TokenDef;
+;;
+;; struct
+;; {
+;; .crc resd 1
+;; uint8_t rgbReserved[16];
+;; } CRC;
+;;} IMAGE_AUX_SYMBOL_EX;
+;;AssertCompileSize(IMAGE_AUX_SYMBOL_EX, IMAGE_SIZE_OF_SYMBOL_EX);
+
+%endif
+
diff --git a/include/iprt/formats/xar.h b/include/iprt/formats/xar.h
new file mode 100644
index 00000000..5cb1eaa1
--- /dev/null
+++ b/include/iprt/formats/xar.h
@@ -0,0 +1,68 @@
+/** @file
+ * IPRT - Extensible Archiver (XAR) format.
+ */
+
+/*
+ * Copyright (C) 2013 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_formats_xar_h
+#define ___iprt_formats_xar_h
+
+
+#pragma pack(4) /* Misdesigned header, not 8-byte aligned size. */
+typedef struct XARHEADER
+{
+ /** The magic number 'xar!' (XAR_HEADER_MAGIC). */
+ uint32_t u32Magic;
+ /** The size of this header structure. */
+ uint16_t cbHeader;
+ /** The header version structure. */
+ uint16_t uVersion;
+ /** The size of the compressed table of content (TOC). */
+ uint64_t cbTocCompressed;
+ /** The size of the table of context (TOC) when not compressed. */
+ uint64_t cbTocUncompressed;
+ /** Which cryptographic hash function is used (XAR_HASH_XXX). */
+ uint32_t uHashFunction;
+} XARHEADER;
+#pragma pack()
+/** Pointer to a XAR header. */
+typedef XARHEADER *PXARHEADER;
+/** Pointer to a const XAR header. */
+typedef XARHEADER const *PCXARHEADER;
+
+/** XAR magic value (on disk endian). */
+#define XAR_HEADER_MAGIC RT_H2LE_U32(RT_MAKE_U32_FROM_U8('x', 'a', 'r', '!'))
+/** The current header version value (host endian). */
+#define XAR_HEADER_VERSION 1
+
+/** @name XAR hashing functions.
+ * @{ */
+#define XAR_HASH_NONE 0
+#define XAR_HASH_SHA1 1
+#define XAR_HASH_MD5 2
+#define XAR_HASH_MAX 2
+/** @} */
+
+
+#endif
+