summaryrefslogtreecommitdiffstats
path: root/include/iprt/formats/wim.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/iprt/formats/wim.h')
-rw-r--r--include/iprt/formats/wim.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/include/iprt/formats/wim.h b/include/iprt/formats/wim.h
new file mode 100644
index 00000000..b0fb7036
--- /dev/null
+++ b/include/iprt/formats/wim.h
@@ -0,0 +1,160 @@
+/** @file
+ * IPRT - Windows Imaging (WIM) format.
+ */
+
+/*
+ * Copyright (C) 2022 Oracle and/or its affiliates.
+ *
+ * This file is part of VirtualBox base platform packages, as
+ * available from https://www.virtualbox.org.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, in version 3 of the
+ * License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses>.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
+ * in the VirtualBox distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ *
+ * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
+ */
+
+#ifndef IPRT_INCLUDED_formats_wim_h
+#define IPRT_INCLUDED_formats_wim_h
+#ifndef RT_WITHOUT_PRAGMA_ONCE
+# pragma once
+#endif
+
+#include <iprt/types.h>
+#include <iprt/assertcompile.h>
+#include <iprt/uuid.h>
+
+
+/** @defgroup grp_rt_formats_win Windows Imaging (WIM) format
+ * @ingroup grp_rt_formats
+ *
+ * Specification:
+ * http://download.microsoft.com/download/f/e/f/fefdc36e-392d-4678-9e4e-771ffa2692ab/Windows%20Imaging%20File%20Format.rtf
+ *
+ * @{ */
+
+
+/**
+ * A short WIM resource entry.
+ *
+ * This is a simplified version of the specs.
+ */
+typedef struct RESHDRDISKSHORT
+{
+ /** 0x00 - The compressed size. */
+ RT_GCC_EXTENSION
+ uint64_t cb : 56;
+ /** 0x07 - Flags, RESHDR_FLAGS_XXX. */
+ RT_GCC_EXTENSION
+ uint64_t bFlags : 8;
+ /** 0x08 - Offset.
+ * @note This is signed in the specficiation... */
+ uint64_t off;
+ /** 0x10 - The uncompressed original size.
+ * @note This is signed in the specficiation... */
+ uint64_t cbOriginal;
+} RESHDRDISKSHORT;
+AssertCompileSize(RESHDRDISKSHORT, 0x18);
+/** Pointer to a short WIM resource entry. */
+typedef RESHDRDISKSHORT *PRESHDRDISKSHORT;
+/** Pointer to a const short WIM resource entry. */
+typedef RESHDRDISKSHORT *PCRESHDRDISKSHORT;
+
+/** @name RESHDR_FLAGS_XXX
+ * @{ */
+#define RESHDR_FLAGS_FREE UINT8_C(0x01)
+#define RESHDR_FLAGS_METADATA UINT8_C(0x02)
+#define RESHDR_FLAGS_COMPRESSED UINT8_C(0x04)
+#define RESHDR_FLAGS_SPANNED UINT8_C(0x08)
+/** @} */
+
+/**
+ * WIM file header, version 1.
+ *
+ * The field names have been normalized to our coding style.
+ */
+#pragma pack(4)
+typedef struct WIMHEADERV1
+{
+ /** 0x00 - Magic value WIMHEADER_MAGIC. */
+ char szMagic[8];
+ /** 0x08 - The size of this header structure. */
+ uint32_t cbHeader;
+ /** 0x0c - The header version structure. */
+ uint32_t uVersion;
+ /** 0x10 - Flags. */
+ uint32_t fFlags;
+ /** 0x14 - ??. */
+ uint32_t cbCompression;
+ /** 0x18 - Unique identifier. */
+ RTUUID WIMGuid;
+ /** 0x28 - Part number in spanned (split) wim set. Unsplit use part number 1. */
+ uint16_t idxPartNumber;
+ /** 0x2a - Total number of parts in spanned set. */
+ uint16_t cTotalParts;
+ /** 0x2c - Number of images in the archive. */
+ uint32_t cImages;
+ /** 0x30 - Resource lookup table offset & size. */
+ RESHDRDISKSHORT OffsetTable;
+ /** 0x48 - XML data offset & size. */
+ RESHDRDISKSHORT XmlData;
+ /** 0x60 - Boot metadata offset & size. */
+ RESHDRDISKSHORT BootMetadata;
+ /** 0x78 - Bootable image index, zero if no bootable image. */
+ uint32_t idxBoot;
+ /** 0x7c - Integrity data offset & size.
+ * @note Misaligned! */
+ RESHDRDISKSHORT Integrity;
+ /** 0x94 - Reserved */
+ uint8_t abUnused[60];
+} WIMHEADERV1;
+#pragma pack()
+AssertCompileSize(WIMHEADERV1, 0xd0);
+/** Pointer to a XAR header. */
+typedef WIMHEADERV1 *PWIMHEADERV1;
+/** Pointer to a const XAR header. */
+typedef WIMHEADERV1 const *PCWIMHEADERV1;
+
+/** The WIMHEADERV1::szMagic value. */
+#define WIMHEADER_MAGIC "MSWIM\0\0"
+AssertCompile(sizeof(WIMHEADER_MAGIC) == 8);
+
+/** @name WIMHEADER_FLAGS_XXX - WINHEADERV1::fFlags.
+ * @note Specfication names these FLAG_HEADER_XXX.
+ * @{ */
+#define WIMHEADER_FLAGS_RESERVED RT_BIT_32(0)
+#define WIMHEADER_FLAGS_COMPRESSION RT_BIT_32(1)
+#define WIMHEADER_FLAGS_READONLY RT_BIT_32(2)
+#define WIMHEADER_FLAGS_SPANNED RT_BIT_32(3)
+#define WIMHEADER_FLAGS_RESOURCE_ONLY RT_BIT_32(4)
+#define WIMHEADER_FLAGS_METADATA_ONLY RT_BIT_32(5)
+#define WIMHEADER_FLAGS_WRITE_IN_PROGRESS RT_BIT_32(5)
+#define WIMHEADER_FLAGS_RP_FIX RT_BIT_32(6)
+#define WIMHEADER_FLAGS_COMPRESS_RESERVED RT_BIT_32(16)
+#define WIMHEADER_FLAGS_COMPRESS_XPRESS RT_BIT_32(17)
+#define WIMHEADER_FLAGS_COMPRESS_LZX RT_BIT_32(18)
+/** @} */
+
+/** @} */
+
+#endif /* !IPRT_INCLUDED_formats_wim_h */
+