From: Eric Biggers Date: Wed, 13 Nov 2013 08:05:59 +0000 (-0600) Subject: Add notes about possible new WIM format and LZMS compression X-Git-Tag: v1.5.2~6 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=7da3252cecc5f8fd25672d3f5ffd3d16d4d7b675 Add notes about possible new WIM format and LZMS compression --- diff --git a/include/wimlib/header.h b/include/wimlib/header.h index efca2749..cd68486b 100644 --- a/include/wimlib/header.h +++ b/include/wimlib/header.h @@ -21,6 +21,14 @@ * 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 */ diff --git a/src/header.c b/src/header.c index 13b098dc..ad7f3ce0 100644 --- a/src/header.c +++ b/src/header.c @@ -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; }