Add notes about possible new WIM format and LZMS compression
authorEric Biggers <ebiggers3@gmail.com>
Wed, 13 Nov 2013 08:05:59 +0000 (02:05 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Wed, 13 Nov 2013 08:08:04 +0000 (02:08 -0600)
include/wimlib/header.h
src/header.c

index efca274..cd68486 100644 (file)
  * between the versions are undocumented.  */
 #define WIM_VERSION 0x10d00
 
+/* Version number used for a different WIM format, which as of Windows 8 can be
+ * created by passing 0x20000000 in dwFlagsAndAttributes to WIMGAPI's
+ * WIMCreateFile() and specifying either NONE, XPRESS, or LZMS compression.
+ * This format is, however, currently undocumented by Microsoft and is seemingly
+ * incompatible with their own ImageX and Dism programs.  wimlib does not yet
+ * support this format.  */
+#define WIM_MYSTERY_VERSION 0xe00
+
 /* WIM magic characters, translated to a single 64-bit little endian number.  */
 #define WIM_MAGIC \
                cpu_to_le64(((u64)'M' << 0) |           \
@@ -189,11 +197,19 @@ struct wim_header {
 #define WIM_HDR_FLAG_COMPRESS_RESERVED  0x00010000
 
 /* Resources within the WIM are compressed using "XPRESS" compression, which is
- * a LZ77-based compression algorithm. */
+ * a LZ77-based compression algorithm.  */
 #define WIM_HDR_FLAG_COMPRESS_XPRESS    0x00020000
 
 /* Resources within the WIM are compressed using "LZX" compression.  This is also
  * a LZ77-based algorithm. */
 #define WIM_HDR_FLAG_COMPRESS_LZX       0x00040000
 
+/* Starting in Windows 8, WIMGAPI can create WIMs using LZMS compression, and
+ * this flag is set on such WIMs.  However, an additional undocumented flag
+ * needs to be provided to WIMCreateFile() to create such WIMs, and the version
+ * number in the header of the resulting WIMs is different (3584).  None of this
+ * is actually documented, and wimlib does not yet support this compression
+ * format.  */
+#define WIM_HDR_FLAG_COMPRESS_LZMS      0x00080000
+
 #endif /* _WIMLIB_HEADER_H */
index 13b098d..ad7f3ce 100644 (file)
@@ -117,6 +117,10 @@ read_wim_header(const tchar *filename, struct filedes *in_fd,
                ERROR("\"%"TS"\": The WIM header says the WIM version is %u, "
                      "but wimlib only knows about version %u",
                      filename, le32_to_cpu(disk_hdr.wim_version), WIM_VERSION);
+               if (le32_to_cpu(disk_hdr.wim_flags) & WIM_HDR_FLAG_COMPRESS_LZMS) {
+                       ERROR("\"%"TS"\": This WIM uses LZMS compression, "
+                             "which is not supported by wimlib.", filename);
+               }
                return WIMLIB_ERR_UNKNOWN_VERSION;
        }