/** The XPRESS compression format. This format combines Lempel-Ziv
* factorization with Huffman encoding. Compression and decompression
* are both fast. This format supports chunk sizes that are powers of 2
- * between <c>2^12</c> and <c>2^26</c>, inclusively. */
+ * between <c>2^12</c> and <c>2^16</c>, inclusively. */
WIMLIB_COMPRESSION_TYPE_XPRESS = 1,
/** The LZX compression format. This format combines Lempel-Ziv
* ::wimlib_progress_info.done_with_file. This message is only received
* if ::WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES was provided. */
WIMLIB_PROGRESS_MSG_DONE_WITH_FILE = 26,
+
+ /** wimlib_verify_wim() is starting to verify the metadata for an image.
+ * @p info will point to ::wimlib_progress_info.verify_image. */
+ WIMLIB_PROGRESS_MSG_BEGIN_VERIFY_IMAGE = 27,
+
+ /** wimlib_verify_wim() has finished verifying the metadata for an
+ * image. @p info will point to ::wimlib_progress_info.verify_image.
+ */
+ WIMLIB_PROGRESS_MSG_END_VERIFY_IMAGE = 28,
+
+ /** wimlib_verify_wim() is verifying stream integrity. @p info will
+ * point to ::wimlib_progress_info.verify_streams. */
+ WIMLIB_PROGRESS_MSG_VERIFY_STREAMS = 29,
};
/** Valid return values from user-provided progress functions
*/
const wimlib_tchar *path_to_file;
} done_with_file;
+
+ /** Valid on messages ::WIMLIB_PROGRESS_MSG_BEGIN_VERIFY_IMAGE and
+ * ::WIMLIB_PROGRESS_MSG_END_VERIFY_IMAGE. */
+ struct wimlib_progress_info_verify_image {
+ const wimlib_tchar *wimfile;
+ uint32_t total_images;
+ uint32_t current_image;
+ } verify_image;
+
+ /** Valid on messages ::WIMLIB_PROGRESS_MSG_VERIFY_STREAMS. */
+ struct wimlib_progress_info_verify_streams {
+ const wimlib_tchar *wimfile;
+ uint64_t total_streams;
+ uint64_t total_bytes;
+ uint64_t completed_streams;
+ uint64_t completed_bytes;
+ } verify_streams;
};
/**
/** @addtogroup G_modifying_wims
* @{ */
-/** Directly capture an NTFS volume rather than a generic directory. This flag
- * cannot be combined with ::WIMLIB_ADD_FLAG_DEREFERENCE or
- * ::WIMLIB_ADD_FLAG_UNIX_DATA. */
+/** UNIX-like systems only: Directly capture an NTFS volume rather than a
+ * generic directory. This requires that wimlib was compiled with support for
+ * libntfs-3g.
+ *
+ * This flag cannot be combined with ::WIMLIB_ADD_FLAG_DEREFERENCE or
+ * ::WIMLIB_ADD_FLAG_UNIX_DATA.
+ *
+ * Do not use this flag on Windows, where wimlib already supports all
+ * Windows-native filesystems, including NTFS, through the Windows APIs. */
#define WIMLIB_ADD_FLAG_NTFS 0x00000001
-/** Follow symlinks; archive and dump the files they point to. Currently only
+/** Follow symbolic links when scanning the directory tree. Currently only
* supported on UNIX-like systems. */
#define WIMLIB_ADD_FLAG_DEREFERENCE 0x00000002
* scanned. */
#define WIMLIB_ADD_FLAG_VERBOSE 0x00000004
-/** Mark the image being added as the bootable image of the WIM. Not valid for
- * wimlib_update_image(). */
+/** Mark the image being added as the bootable image of the WIM. This flag is
+ * valid only for wimlib_add_image() and wimlib_add_image_multisource().
+ *
+ * Note that you can also change the bootable image of a WIM using
+ * wimlib_set_wim_info().
+ *
+ * Note: ::WIMLIB_ADD_FLAG_BOOT does something different from, and independent
+ * from, ::WIMLIB_ADD_FLAG_WIMBOOT. */
#define WIMLIB_ADD_FLAG_BOOT 0x00000008
/** UNIX-like systems only: Store the UNIX owner, group, mode, and device ID
- * (major and minor number) of each file. See the documentation for the
+ * (major and minor number) of each file. Also allows capturing special files
+ * such as device nodes and FIFOs. See the documentation for the
* <b>--unix-data</b> option to <b>wimlib-imagex capture</b> for more
* information. */
#define WIMLIB_ADD_FLAG_UNIX_DATA 0x00000010
/** Do not capture security descriptors. Only has an effect in NTFS capture
- * mode, or in Windows native builds. */
+ * mode, or in Windows native builds. */
#define WIMLIB_ADD_FLAG_NO_ACLS 0x00000020
/** Fail immediately if the full security descriptor of any file or directory
* cannot be accessed. Only has an effect in Windows native builds. The
* default behavior without this flag is to first try omitting the SACL from the
* security descriptor, then to try omitting the security descriptor entirely.
- * */
+ */
#define WIMLIB_ADD_FLAG_STRICT_ACLS 0x00000040
/** Call the progress function with the message
* ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY when a directory or file is excluded from
* capture. This is a subset of the messages provided by
- * ::WIMLIB_ADD_FLAG_VERBOSE. */
+ * ::WIMLIB_ADD_FLAG_VERBOSE. */
#define WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE 0x00000080
-/** Reparse-point fixups: Modify absolute symbolic links (or junction points,
- * in the case of Windows) that point inside the directory being captured to
- * instead be absolute relative to the directory being captured, rather than the
- * current root.
+/** Reparse-point fixups: Modify absolute symbolic links (and junctions, in the
+ * case of Windows) that point inside the directory being captured to instead be
+ * absolute relative to the directory being captured.
*
- * Without this flag, the default is to do this if WIM_HDR_FLAG_RP_FIX is set in
- * the WIM header or if this is the first image being added.
- * WIM_HDR_FLAG_RP_FIX is set if the first image in a WIM is captured with
- * reparse point fixups enabled and currently cannot be unset. */
+ * Without this flag, the default is to do reparse-point fixups if
+ * WIM_HDR_FLAG_RP_FIX is set in the WIM header or if this is the first image
+ * being added. WIM_HDR_FLAG_RP_FIX is set if the first image in a WIM is
+ * captured with reparse point fixups enabled and currently cannot be unset. */
#define WIMLIB_ADD_FLAG_RPFIX 0x00000100
-/** Don't do reparse point fixups. The default behavior is described in the
- * documentation for ::WIMLIB_ADD_FLAG_RPFIX. */
+/** Don't do reparse point fixups. See ::WIMLIB_ADD_FLAG_RPFIX. */
#define WIMLIB_ADD_FLAG_NORPFIX 0x00000200
/** Do not automatically exclude unsupported files or directories from capture;
* e.g. encrypted files in NTFS-3g capture mode, or device files and FIFOs on
- * UNIX-like systems. Instead, fail with ::WIMLIB_ERR_UNSUPPORTED_FILE when
- * such a file is encountered. */
+ * UNIX-like systems when not also using ::WIMLIB_ADD_FLAG_UNIX_DATA. Instead,
+ * fail with ::WIMLIB_ERR_UNSUPPORTED_FILE when such a file is encountered. */
#define WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE 0x00000400
/**
* Automatically select a capture configuration appropriate for capturing
* filesystems containing Windows operating systems. For example,
- * "pagefile.sys" and "System Volume Information" will be excluded.
+ * "/pagefile.sys" and "System Volume Information" will be excluded.
*
- * When this flag is specified, the corresponding @p config parameter or member
- * must be @c NULL.
+ * When this flag is specified, the corresponding @p config parameter (for
+ * wimlib_add_image()) or member (for wimlib_update_image()) must be @c NULL.
+ * Otherwise, ::WIMLIB_ERR_INVALID_PARAM will be returned.
*
- * Note that the default behavior--- that is, when this flag is not specified
- * and @p config is @c NULL--- is to use no capture configuration, meaning that
- * no files are excluded from capture.
+ * Note that the default behavior--- that is, when neither
+ * ::WIMLIB_ADD_FLAG_WINCONFIG nor ::WIMLIB_ADD_FLAG_WIMBOOT is specified and @p
+ * config is @c NULL--- is to use no capture configuration, meaning that no
+ * files are excluded from capture.
*/
#define WIMLIB_ADD_FLAG_WINCONFIG 0x00000800
*
* since that makes access to the data faster (at the cost of a worse
* compression ratio compared to the 32768-byte LZX chunks usually used).
+ *
+ * Note: ::WIMLIB_ADD_FLAG_WIMBOOT does something different from, and
+ * independent from, ::WIMLIB_ADD_FLAG_BOOT.
*/
#define WIMLIB_ADD_FLAG_WIMBOOT 0x00001000
* all streams recompressed in solid mode.
*
* Currently, new solid blocks will, by default, be written using LZMS
- * compression with 64 MiB (67108864 byte) chunks. Use
+ * compression with 32 MiB (33554432 byte) chunks. Use
* wimlib_set_output_pack_compression_type() and/or
* wimlib_set_output_pack_chunk_size() to change this. This is independent of
* the WIM's main compression type and chunk size; you can have a WIM that
* The error code returned by one of wimlib's functions.
*
* @return
- * Pointer to a statically allocated string describing the error code,
- * or @c NULL if the error code is not valid.
+ * Pointer to a statically allocated string describing the error code. If
+ * the error code is for some reason not recognized by the library, the
+ * string will be "Unknown error".
*/
extern const wimlib_tchar *
wimlib_get_error_string(enum wimlib_error_code code);
const wimlib_tchar *image_name_or_num);
/**
+ * @ingroup G_general
+ *
* Sets the file to which the library will print error and warning messages.
*
* This version of the function takes a C library <c>FILE *</c> opened for
wimlib_set_error_file(FILE *fp);
/**
+ * @ingroup G_general
+ *
* Sets the path to the file to which the library will print error and warning
* messages. The library will open this file for appending.
*
uint64_t part_size,
int write_flags);
+/**
+ * @ingroup G_general
+ *
+ * Perform verification checks on a WIM file.
+ *
+ * @param wim
+ * The ::WIMStruct for the WIM file to verify. Note: for an extra layer of
+ * verification, it is a good idea to have used
+ * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY when you opened the file.
+ * <br/>
+ * If verifying a split WIM, specify the first part of the split WIM here,
+ * and reference the other parts using wimlib_reference_resource_files()
+ * before calling this function.
+ *
+ * @param verify_flags
+ * Reserved; must be 0.
+ *
+ * @retval 0 if the WIM file was successfully verified; nonzero if it failed
+ * verification or another error occurred. Some of the possible error codes
+ * are:
+ *
+ * @retval ::WIMLIB_ERR_DECOMPRESSION
+ * A compressed resource could not be decompressed.
+ * @retval ::WIMLIB_ERR_INVALID_METADATA_RESOURCE
+ * The metadata resource for an image is invalid.
+ * @retval ::WIMLIB_ERR_INVALID_RESOURCE_HASH
+ * One of the files did not decompress to its original data, as given by a
+ * cryptographic checksum.
+ * @retval ::WIMLIB_ERR_RESOURCE_NOT_FOUND
+ * One of the files referenced by an image could not be located.
+ *
+ * If a progress function is registered with @p wim, it will receive the
+ * following progress messages: ::WIMLIB_PROGRESS_MSG_BEGIN_VERIFY_IMAGE,
+ * ::WIMLIB_PROGRESS_MSG_END_VERIFY_IMAGE, and
+ * ::WIMLIB_PROGRESS_MSG_VERIFY_STREAMS.
+ */
+extern int
+wimlib_verify_wim(WIMStruct *wim, int verify_flags);
+
/**
* @ingroup G_mounting_wim_images
*
* @{
*/
-/** Header for compression parameters to pass to wimlib_create_compressor() or
- * wimlib_set_default_compressor_params(). */
-struct wimlib_compressor_params_header {
- /** Size of the parameters, in bytes. */
- uint32_t size;
-};
-
-/** Header for decompression parameters to pass to wimlib_create_decompressor()
- * or wimlib_set_default_decompressor_params() */
-struct wimlib_decompressor_params_header {
- /** Size of the parameters, in bytes. */
- uint32_t size;
-};
-
-/** LZX compression parameters that can optionally be passed to
- * wimlib_create_compressor() with the compression type
- * ::WIMLIB_COMPRESSION_TYPE_LZX. */
-struct wimlib_lzx_compressor_params {
- /** hdr.size Must be set to the size of this structure, in bytes. */
- struct wimlib_compressor_params_header hdr;
-
- /** Relatively fast LZX compression algorithm with a decent compression
- * ratio. */
-#define WIMLIB_LZX_ALGORITHM_FAST 0
-
- /** Slower LZX compression algorithm that provides a better compression
- * ratio. This is the default. */
-#define WIMLIB_LZX_ALGORITHM_SLOW 1
-
- /** Algorithm to use to perform the compression: either
- * ::WIMLIB_LZX_ALGORITHM_FAST or ::WIMLIB_LZX_ALGORITHM_SLOW. The
- * format is still LZX; this refers to the method the code will use to
- * perform LZX-compatible compression. */
- uint32_t algorithm : 3;
-
- /** If set to 1, the default parameters for the specified algorithm are
- * used rather than the ones specified in the following union. */
- uint32_t use_defaults : 1;
-
- union {
- /** Parameters for the fast algorithm. */
- struct wimlib_lzx_fast_params {
- uint32_t fast_reserved1[10];
- } fast;
-
- /** Parameters for the "slow" algorithm. */
- struct wimlib_lzx_slow_params {
- /** If set to 1, the compressor can output length 2
- * matches. If set 0, the compressor can only output
- * matches of length 3 or greater. Suggested value: 1
- */
- uint32_t use_len2_matches : 1;
-
- uint32_t slow_reserved1 : 31;
-
- /** Matches with length (in bytes) greater than or equal
- * to this value are immediately taken without spending
- * time on minimum-cost measurements. Suggested value:
- * 32. */
- uint32_t nice_match_length;
-
- /** Number of passes to compute a match/literal sequence
- * for each LZX block. This is for an iterative
- * algorithm that attempts to minimize the cost of the
- * match/literal sequence by using a cost model provided
- * by the previous iteration. Must be at least 1.
- * Suggested value: 2. */
- uint32_t num_optim_passes;
-
- /** Reserved; set to 0. */
- uint32_t slow_reserved_blocksplit;
-
- /** Maximum depth to search for matches at each
- * position. Suggested value: 50. */
- uint32_t max_search_depth;
-
- /* Note: max_matches_per_pos has been removed and no
- * longer has any effect. */
-
- uint32_t slow_reserved2[3];
-
- /** Assumed cost of a main symbol with zero frequency.
- * Must be at least 1 and no more than 16. Suggested
- * value: 15. */
- uint8_t main_nostat_cost;
-
- /** Assumed cost of a length symbol with zero frequency.
- * Must be at least 1 and no more than 16. Suggested
- * value: 15. */
- uint8_t len_nostat_cost;
-
- /** Assumed cost of an aligned symbol with zero
- * frequency. Must be at least 1 and no more than 8.
- * Suggested value: 7. */
- uint8_t aligned_nostat_cost;
-
- uint8_t slow_reserved3[5];
- } slow;
- } alg_params;
-};
-
-/** LZMS compression parameters that can optionally be passed to
- * wimlib_create_compressor() with the compression type
- * ::WIMLIB_COMPRESSION_TYPE_LZMS. */
-struct wimlib_lzms_compressor_params {
- /** hdr.size Must be set to the size of this structure, in bytes. */
- struct wimlib_compressor_params_header hdr;
-
- /** Minimum match length to output. This must be at least 2. Suggested
- * value: 2 */
- uint32_t min_match_length;
-
- /** Maximum match length to output. This must be at least @p
- * min_match_length. Suggested value: @p UINT32_MAX. */
- uint32_t max_match_length;
-
- /** Matches with length (in bytes) greater than or equal to this value
- * are immediately taken without spending time on minimum-cost
- * measurements. The minimum of @p max_match_length and @p
- * nice_match_length may not exceed 65536. Suggested value: 32. */
- uint32_t nice_match_length;
-
- /** Maximum depth to search for matches at each position. Suggested
- * value: 50. */
- uint32_t max_search_depth;
-
- /* Note: max_matches_per_pos has been removed and no longer has any
- * effect. */
-
- uint32_t reserved1;
-
- /** Length of the array for the near-optimal LZ parsing algorithm. This
- * must be at least 1. Suggested value: 1024. */
- uint32_t optim_array_length;
-
- uint64_t reserved2[4];
-};
-
/** Opaque compressor handle. */
struct wimlib_compressor;
struct wimlib_decompressor;
/**
- * Set the default compression parameters for the specified compression type.
- * This will affect both explicit and library-internal calls to
+ * Set the default compression level for the specified compression type. This
+ * will affect both explicit and library-internal calls to
* wimlib_create_compressor().
*
* @param ctype
- * Compression type for which to set the default compression parameters.
- * @param params
- * Compression-type specific parameters. This may be @c NULL, in which
- * case the "default default" parameters are restored.
+ * Compression type for which to set the default compression level, as one
+ * of the ::wimlib_compression_type constants. Or, if this is the special
+ * value -1, the default compression levels for all known compression types
+ * will be set.
+ * @param compression_level
+ * The default compression level to set. If 0, the "default default" level
+ * is restored. Otherwise, a higher value indicates higher compression.
+ * The values are scaled so that 10 is low compression, 50 is medium
+ * compression, and 100 is high compression.
*
* @return 0 on success; nonzero on error.
*
* @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE
- * @p ctype was not a supported compression type.
- * @retval ::WIMLIB_ERR_INVALID_PARAM
- * @p params were invalid.
- * @retval ::WIMLIB_ERR_NOMEM
- * Not enough memory to duplicate the parameters (perhaps @c params->size
- * was invalid).
+ * @p ctype was neither a supported compression type nor -1.
*/
extern int
-wimlib_set_default_compressor_params(enum wimlib_compression_type ctype,
- const struct wimlib_compressor_params_header *params);
+wimlib_set_default_compression_level(int ctype, unsigned int compression_level);
/**
* Returns the approximate number of bytes needed to allocate a compressor with
* wimlib_create_compressor() for the specified compression type, block size,
- * and parameters. @p params may be @c NULL, in which case the current default
- * parameters for @p ctype are used. Returns 0 if the compression type or
- * parameters are invalid.
+ * and compression level. @p compression_level may be 0, in which case the
+ * current default compression level for @p ctype is used. Returns 0 if the
+ * compression type is invalid.
*/
extern uint64_t
wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype,
size_t max_block_size,
- const struct wimlib_compressor_params_header *params);
+ unsigned int compression_level);
/**
* Allocate a compressor for the specified compression type using the specified
* Maximum block size to support. The exact meaning and allowed values for
* this parameter depend on the compression type, but it at least specifies
* the maximum allowed value for @p uncompressed_size to wimlib_compress().
- * @param extra_params
- * An optional pointer to extra compressor parameters for the specified
- * compression type. For LZX, a pointer to ::wimlib_lzx_compressor_params
- * may be specified here. For LZMS, a pointer to
- * ::wimlib_lzms_compressor_params may be specified here. If left @c NULL,
- * the default parameters are used.
+ * @param compression_level
+ * The compression level to use. If 0, the default compression level is
+ * used. Otherwise, a higher value indicates higher compression. The
+ * values are scaled so that 10 is low compression, 50 is medium
+ * compression, and 100 is high compression.
* @param compressor_ret
* A location into which to return the pointer to the allocated compressor,
* which can be used for any number of calls to wimlib_compress() before
* @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE
* @p ctype was not a supported compression type.
* @retval ::WIMLIB_ERR_INVALID_PARAM
- * The compression parameters were invalid.
+ * The compressor does not support the specified maximum block size.
* @retval ::WIMLIB_ERR_NOMEM
* Insufficient memory to allocate the compressor.
*/
extern int
wimlib_create_compressor(enum wimlib_compression_type ctype,
size_t max_block_size,
- const struct wimlib_compressor_params_header *extra_params,
+ unsigned int compression_level,
struct wimlib_compressor **compressor_ret);
/**
extern void
wimlib_free_compressor(struct wimlib_compressor *compressor);
-/**
- * Set the default decompression parameters for the specified compression type.
- * This will affect both explicit and library-internal calls to
- * wimlib_create_decompressor().
- *
- * @param ctype
- * Compression type for which to set the default decompression parameters.
- * @param params
- * Compression-type specific parameters. This may be @c NULL, in which
- * case the "default default" parameters are restored.
- *
- * @return 0 on success; nonzero on error.
- *
- * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE
- * @p ctype was not a supported compression type.
- * @retval ::WIMLIB_ERR_NOMEM
- * Not enough memory to duplicate the parameters (perhaps @c params->size
- * was invalid).
- */
-extern int
-wimlib_set_default_decompressor_params(enum wimlib_compression_type ctype,
- const struct wimlib_decompressor_params_header *params);
-
/**
* Allocate a decompressor for the specified compression type using the
* specified parameters. This function is part of wimlib's compression API; it
* this parameter depend on the compression type, but it at least specifies
* the maximum allowed value for @p uncompressed_size to
* wimlib_decompress().
- * @param extra_params
- * An optional pointer to extra decompressor parameters for the specified
- * compression type. If @c NULL, the default parameters are used.
* @param decompressor_ret
* A location into which to return the pointer to the allocated
* decompressor, which can be used for any number of calls to
*
* @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE
* @p ctype was not a supported compression type.
- * @retval ::WIMLIB_ERR_INVALID_PARAM
- * The decompression parameters were invalid.
* @retval ::WIMLIB_ERR_NOMEM
* Insufficient memory to allocate the decompressor.
*/
extern int
wimlib_create_decompressor(enum wimlib_compression_type ctype,
size_t max_block_size,
- const struct wimlib_decompressor_params_header *extra_params,
struct wimlib_decompressor **decompressor_ret);
/**