INTRODUCTION
-This is wimlib version 1.7.2-BETA (August 2014). wimlib is a C library for
+This is wimlib version 1.8.0 (February 2015). wimlib is a C library for
creating, modifying, extracting, and mounting files in the Windows Imaging
Format (WIM files). wimlib and its command-line frontend 'wimlib-imagex'
provide a free and cross-platform alternative to Microsoft's WIMGAPI, ImageX,
COMPRESSION RATIO
wimlib (and wimlib-imagex) can create XPRESS, LZX, or LZMS compressed WIM files.
-wimlib includes its own compression codecs and does not use the compression API
-available on some versions of Windows.
-
-I have gradually been improving the compression codecs in wimlib. For XPRESS
-and LZX, they now usually outperform and outcompress the equivalent Microsoft
-implementations. Although results will vary depending on the data being
-compressed, in the table below I present the results for a common use case:
-compressing an x86 Windows PE image. Each row displays the compression type,
-the size of the resulting WIM file in bytes, and how many seconds it took to
-create the file. When applicable, the results with the equivalent Microsoft
-implementation in WIMGAPI is included.
+wimlib's compression codecs usually outperform and outcompress their Microsoft
+equivalents. Although results will vary depending on the data being compressed,
+the table below shows results for a common use case: creating an x86 Windows PE
+image ("boot.wim"). Each row shows the compression type, the size of the
+resulting WIM file in bytes, and the time it took to create the file. When
+possible, the results with the Microsoft equivalent are included.
=============================================================================
- | Compression || wimlib (v1.7.2-BETA) | WIMGAPI (Windows 8.1) |
+ | Compression || wimlib (v1.8.0) | WIMGAPI (Windows 8.1) |
=============================================================================
- | None [1] || 361,404,682 in 3.4s | 361,364,994 in 4.2s |
- | XPRESS [2] || 138,398,747 in 4.2s | 140,468,002 in 5.1s |
- | XPRESS (slow) [3] || 135,284,950 in 10.3s | N/A |
- | LZX (quick) [4] || 131,861,913 in 4.7s | N/A |
- | LZX (normal) [5] || 126,855,247 in 14.9s | 127,301,774 in 18.2s |
- | LZX (slow) [6] || 126,245,561 in 32.1s | N/A |
- | LZMS (non-solid) [7] || 122,126,328 in 16.4s | N/A |
- | LZMS (solid) [8] || 93,795,440 in 47.4s | 88,789,426 in 96.8s |
- | "WIMBoot" [9] || 167,121,495 in 5.3s | 169,124,968 in 9.3s |
- | "WIMBoot" (slow) [10] || 165,219,818 in 9.4s | N/A |
+ | None [1] || 361,314,224 in 2.4s | 361,315,338 in 4.5s |
+ | XPRESS [2] || 138,218,750 in 3.0s | 140,457,436 in 6.0s |
+ | XPRESS (slow) [3] || 135,173,511 in 8.9s | N/A |
+ | LZX (quick) [4] || 130,207,195 in 3.8s | N/A |
+ | LZX (normal) [5] || 126,522,539 in 10.4s | 127,293,240 in 19.2s |
+ | LZX (slow) [6] || 126,042,313 in 17.3s | N/A |
+ | LZMS (non-solid) [7] || 116,150,682 in 25.3s | N/A |
+ | LZMS (solid) [8] || 88,107,484 in 61.7s | 88,769,830 in 102.3s |
+ | "WIMBoot" [9] || 167,023,719 in 3.5s | 169,109,211 in 10.4s |
+ | "WIMBoot" (slow) [10] || 165,027,583 in 7.9s | N/A |
=============================================================================
Notes:
[8] '--solid' for wimlib-imagex. Should be '/compress:recovery' for DISM,
but only works for /Export-Image, not /Capture-Image. Compression chunk
- size in solid blocks defaults to 33554432 for wimlib, 67108864 for DISM.
+ size in solid resources defaults to 67108864 bytes in both cases.
[9] '--wimboot' for wimlib-imagex; '/wimboot' for DISM.
This is really XPRESS compression with 4096 byte chunks, so the same as
The compression ratio provided by wimlib is also competitive with commonly used
archive formats. Below are file sizes that result when the Canterbury corpus is
-compressed with wimlib (v1.7.0), WIMGAPI (Windows 8), and some other
+compressed with wimlib (v1.8.0), WIMGAPI (Windows 8.1), and some other
formats/programs:
- =================================================
- | Format | Size (bytes) |
- =================================================
- | tar | 2,826,240 |
- | WIM (WIMGAPI, None) | 2,814,278 |
- | WIM (wimlib, None) | 2,813,856 |
- | WIM (WIMGAPI, XPRESS) | 825,410 |
- | WIM (wimlib, XPRESS) | 792,024 |
- | tar.gz (gzip, default) | 738,796 |
- | ZIP (Info-ZIP, default) | 735,334 |
- | tar.gz (gzip, -9) | 733,971 |
- | ZIP (Info-ZIP, -9) | 732,297 |
- | WIM (wimlib, LZX quick) | 722,196 |
- | WIM (WIMGAPI, LZX) | 651,766 |
- | WIM (wimlib, LZX normal) | 649,204 |
- | WIM (wimlib, LZX slow) | 639,618 |
- | WIM (wimlib, LZMS non-solid) | 592,136 |
- | tar.bz2 (bzip, default) | 565,008 |
- | tar.bz2 (bzip, -9) | 565,008 |
- | WIM (wimlib, LZMS solid) | 525,270 |
- | WIM (wimlib, LZMS solid, slow) | 521,700 |
- | WIM (WIMGAPI, LZMS solid) | 521,232 |
- | tar.xz (xz, default) | 486,916 |
- | tar.xz (xz, -9) | 486,904 |
- | 7z (7-zip, default) | 484,700 |
- | 7z (7-zip, -9) | 483,239 |
- =================================================
+ =====================================================
+ | Format | Size (bytes) |
+ =====================================================
+ | tar | 2,826,240 |
+ | WIM (WIMGAPI, None) | 2,814,254 |
+ | WIM (wimlib, None) | 2,814,216 |
+ | WIM (WIMGAPI, XPRESS) | 825,536 |
+ | WIM (wimlib, XPRESS) | 789,296 |
+ | tar.gz (gzip, default) | 738,796 |
+ | ZIP (Info-ZIP, default) | 735,334 |
+ | tar.gz (gzip, -9) | 733,971 |
+ | ZIP (Info-ZIP, -9) | 732,297 |
+ | WIM (wimlib, LZX quick) | 690,110 |
+ | WIM (WIMGAPI, LZX) | 651,866 |
+ | WIM (wimlib, LZX normal) | 624,634 |
+ | WIM (wimlib, LZX slow) | 620,728 |
+ | WIM (wimlib, LZMS non-solid) | 581,046 |
+ | tar.bz2 (bzip, default) | 565,008 |
+ | tar.bz2 (bzip, -9) | 565,008 |
+ | WIM (WIMGAPI, LZMS solid) | 521,366 |
+ | WIM (wimlib, LZMS solid) | 515,800 |
+ | tar.xz (xz, default) | 486,916 |
+ | tar.xz (xz, -9) | 486,904 |
+ | 7z (7-zip, default) | 484,700 |
+ | 7z (7-zip, -9) | 483,239 |
+ =====================================================
Note: WIM does even better on directory trees containing duplicate files, which
the Canterbury corpus doesn't have.
mode), to ensure a fast and feature-rich implementation of each platform/mode.
wimlib is mainly used on x86 and x86_64 CPUs, but it should also work on a
-number of other GCC-supported 32-bit or 64-bit architectures. No assumptions
-are made about endianness, but some code assumes that unaligned memory accesses
-are supported and relatively efficient.
+number of other GCC-supported 32-bit or 64-bit architectures. It has been
+tested on the ARM architecture.
Currently, gcc and clang are the only supported compilers. A few nonstandard
extensions are used in the code.
The WIM file format is partially specified in a document that can be found in
the Microsoft Download Center. However, this document really only provides an
overview of the format and is not a formal specification. It also does not
-cover later extensions of the format, such as solid blocks.
+cover later extensions of the format, such as solid resources.
With regards to the supported compression formats:
neither of which is completely applicable to its use in the WIM format, and
the first of which contains multiple errors.
- There does not seem to be any official documentation for LZMS, so my comments
- and code in src/lzms-decompress.c may in fact be the best documentation
+ and code in src/lzms_decompress.c may in fact be the best documentation
available for this particular compression format.
The algorithms used by wimlib's compression and decompression codecs are