+/**
+ * In combination with ::WIMLIB_UNMOUNT_FLAG_COMMIT for a read-write mounted WIM
+ * image, forces all file descriptors to the open WIM image to be closed before
+ * committing it.
+ *
+ * Without ::WIMLIB_UNMOUNT_FLAG_COMMIT or with a read-only mounted WIM image,
+ * this flag has no effect.
+ */
+#define WIMLIB_UNMOUNT_FLAG_FORCE 0x00000010
+
+/** In combination with ::WIMLIB_UNMOUNT_FLAG_COMMIT for a read-write mounted
+ * WIM image, causes the modified image to be committed to the WIM file as a
+ * new, unnamed image appended to the archive. The original image in the WIM
+ * file will be unmodified. */
+#define WIMLIB_UNMOUNT_FLAG_NEW_IMAGE 0x00000020
+
+/** @} */
+/** @addtogroup G_modifying_wims
+ * @{ */
+
+/** Send ::WIMLIB_PROGRESS_MSG_UPDATE_BEGIN_COMMAND and
+ * ::WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND messages. */
+#define WIMLIB_UPDATE_FLAG_SEND_PROGRESS 0x00000001
+
+/** @} */
+/** @addtogroup G_writing_and_overwriting_wims
+ * @{ */
+
+/**
+ * Include an integrity table in the resulting WIM file.
+ *
+ * For ::WIMStruct's created with wimlib_open_wim(), the default behavior is to
+ * include an integrity table if and only if one was present before. For
+ * ::WIMStruct's created with wimlib_create_new_wim(), the default behavior is
+ * to not include an integrity table.
+ */
+#define WIMLIB_WRITE_FLAG_CHECK_INTEGRITY 0x00000001
+
+/**
+ * Do not include an integrity table in the resulting WIM file. This is the
+ * default behavior, unless the ::WIMStruct was created by opening a WIM with an
+ * integrity table.
+ */
+#define WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY 0x00000002
+
+/**
+ * Write the WIM as "pipable". After writing a WIM with this flag specified,
+ * images from it can be applied directly from a pipe using
+ * wimlib_extract_image_from_pipe(). See the documentation for the
+ * <b>--pipable</b> option of <b>wimlib-imagex capture</b> for more information.
+ * Beware: WIMs written with this flag will not be compatible with Microsoft's
+ * software.
+ *
+ * For ::WIMStruct's created with wimlib_open_wim(), the default behavior is to
+ * write the WIM as pipable if and only if it was pipable before. For
+ * ::WIMStruct's created with wimlib_create_new_wim(), the default behavior is
+ * to write the WIM as non-pipable.
+ */
+#define WIMLIB_WRITE_FLAG_PIPABLE 0x00000004
+
+/**
+ * Do not write the WIM as "pipable". This is the default behavior, unless the
+ * ::WIMStruct was created by opening a pipable WIM.
+ */
+#define WIMLIB_WRITE_FLAG_NOT_PIPABLE 0x00000008
+
+/**
+ * When writing streams to the WIM file, recompress them, even if their data is
+ * already available in the desired compressed form (for example, in a WIM file
+ * from which an image has been exported using wimlib_export_image()).
+ *
+ * ::WIMLIB_WRITE_FLAG_RECOMPRESS can be used to recompress with a higher
+ * compression ratio for the same compression type and chunk size. Simply using
+ * the default compression settings may suffice for this, especially if the WIM
+ * file was created using another program/library that may not use as
+ * sophisticated compression algorithms. Or,
+ * wimlib_set_default_compression_level() can be called beforehand to set an
+ * even higher compression level than the default.
+ *
+ * If the WIM contains solid blocks, then ::WIMLIB_WRITE_FLAG_RECOMPRESS can be
+ * used in combination with ::WIMLIB_WRITE_FLAG_PACK_STREAMS to prevent any
+ * solid blocks from being re-used. Otherwise, solid blocks are re-used
+ * somewhat more liberally than normal compressed blocks.
+ *
+ * ::WIMLIB_WRITE_FLAG_RECOMPRESS does <b>not</b> cause recompression of streams
+ * that would not otherwise be written. For example, a call to
+ * wimlib_overwrite() with ::WIMLIB_WRITE_FLAG_RECOMPRESS will not, by itself,
+ * cause already-existing streams in the WIM file to be recompressed. To force
+ * the WIM file to be fully rebuilt and recompressed, combine
+ * ::WIMLIB_WRITE_FLAG_RECOMPRESS with ::WIMLIB_WRITE_FLAG_REBUILD.
+ */
+#define WIMLIB_WRITE_FLAG_RECOMPRESS 0x00000010
+
+/**
+ * Immediately before closing the WIM file, sync its data to disk.
+ *
+ * This flag forces the function to wait until the data is safely on disk before
+ * returning success. Otherwise, modern operating systems tend to cache data
+ * for some time (in some cases, 30+ seconds) before actually writing it to
+ * disk, even after reporting to the application that the writes have succeeded.
+ *
+ * wimlib_overwrite() will set this flag automatically if it decides to
+ * overwrite the WIM file via a temporary file instead of in-place. This is
+ * necessary on POSIX systems; it will, for example, avoid problems with delayed
+ * allocation on ext4.
+ */
+#define WIMLIB_WRITE_FLAG_FSYNC 0x00000020
+
+/**
+ * For wimlib_overwrite(), rebuild the entire WIM file, even if it otherwise
+ * could be updated in-place by appending to it.
+ *
+ * When rebuilding the WIM file, stream reference counts will be recomputed, and
+ * any streams with 0 reference count (e.g. from deleted files or images) will
+ * not be included in the resulting WIM file. This can free up space that is
+ * currently not being used.
+ *
+ * This flag can be combined with ::WIMLIB_WRITE_FLAG_RECOMPRESS to force all
+ * data to be recompressed. Otherwise, compressed data is re-used if possible.
+ *
+ * wimlib_write() ignores this flag.
+ */
+#define WIMLIB_WRITE_FLAG_REBUILD 0x00000040
+
+/**
+ * For wimlib_overwrite(), override the default behavior after one or more calls
+ * to wimlib_delete_image(), which is to rebuild the entire WIM file. With this
+ * flag, only minimal changes to correctly remove the image from the WIM file
+ * will be taken. In particular, all streams will be retained, even if they are
+ * no longer referenced. This may not be what you want, because no space will
+ * be saved by deleting an image in this way.
+ *
+ * wimlib_write() ignores this flag.
+ */
+#define WIMLIB_WRITE_FLAG_SOFT_DELETE 0x00000080
+
+/**
+ * For wimlib_overwrite(), allow overwriting the WIM file even if the readonly
+ * flag (WIM_HDR_FLAG_READONLY) is set in the WIM header. This can be used
+ * following a call to wimlib_set_wim_info() with the
+ * ::WIMLIB_CHANGE_READONLY_FLAG flag to actually set the readonly flag on the
+ * on-disk WIM file.
+ *
+ * wimlib_write() ignores this flag.
+ */
+#define WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG 0x00000100
+
+/**
+ * Do not include streams already present in other WIMs. This flag can be used
+ * to write a "delta" WIM after resources from the WIM on which the delta is to
+ * be based were referenced with wimlib_reference_resource_files() or
+ * wimlib_reference_resources().
+ */
+#define WIMLIB_WRITE_FLAG_SKIP_EXTERNAL_WIMS 0x00000200
+
+/**
+ * Advises the library that for writes of all WIM images, all streams needed for
+ * the WIM are already present (not in external resource WIMs) and their
+ * reference counts are correct, so the code does not need to recalculate which
+ * streams are referenced. This is for optimization purposes only, since with
+ * this flag specified, the metadata resources may not need to be decompressed
+ * and parsed.
+ *
+ * wimlib_overwrite() will set this flag automatically.
+ */
+#define WIMLIB_WRITE_FLAG_STREAMS_OK 0x00000400
+
+/**
+ * For wimlib_write(), retain the WIM's GUID instead of generating a new one.
+ *
+ * wimlib_overwrite() sets this by default, since the WIM remains, logically,
+ * the same file.
+ */
+#define WIMLIB_WRITE_FLAG_RETAIN_GUID 0x00000800
+
+/**
+ * When writing streams in the resulting WIM file, pack multiple streams into a
+ * single compressed resource instead of compressing them independently. This
+ * is also known as creating a "solid archive". This tends to produce a better
+ * compression ratio at the cost of much slower random access.
+ *
+ * WIM files created with this flag are only compatible with wimlib v1.6.0 or
+ * later, WIMGAPI Windows 8 or later, and DISM Windows 8.1 or later. WIM files
+ * created with this flag use a different version number in their header (3584
+ * instead of 68864) and are also called "ESD files".
+ *
+ * If this flag is passed to wimlib_overwrite(), any new data streams will be
+ * written in solid mode. Use both ::WIMLIB_WRITE_FLAG_REBUILD and
+ * ::WIMLIB_WRITE_FLAG_RECOMPRESS to force the entire WIM file be rebuilt with
+ * all streams recompressed in solid mode.
+ *
+ * Currently, new solid blocks will, by default, be written using LZMS
+ * 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
+ * nominally uses LZX compression and 32768 byte chunks but actually contains
+ * LZMS-compressed solid blocks, for example. However, if including solid
+ * blocks, I suggest that you set the WIM's main compression type to LZMS as
+ * well, either by creating the WIM with
+ * ::wimlib_create_new_wim(::WIMLIB_COMPRESSION_TYPE_LZMS, ...) or by calling
+ * ::wimlib_set_output_compression_type(..., ::WIMLIB_COMPRESSION_TYPE_LZMS).
+ *
+ * This flag will be set by default when writing or overwriting a WIM file that
+ * either already contains packed streams, or has had packed streams exported
+ * into it and the WIM's main compression type is LZMS.
+ */
+#define WIMLIB_WRITE_FLAG_PACK_STREAMS 0x00001000
+
+/**
+ * Send ::WIMLIB_PROGRESS_MSG_DONE_WITH_FILE messages while writing the WIM
+ * file. This is only needed in the unusual case that the library user needs to
+ * know exactly when wimlib has read each file for the last time.
+ */
+#define WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES 0x00002000
+
+/** @} */
+/** @addtogroup G_general
+ * @{ */
+
+/** Assume that strings are represented in UTF-8, even if this is not the
+ * locale's character encoding. This flag is ignored on Windows, where wimlib
+ * always uses UTF-16LE. */
+#define WIMLIB_INIT_FLAG_ASSUME_UTF8 0x00000001
+
+/** Windows-only: do not attempt to acquire additional privileges (currently
+ * SeBackupPrivilege, SeRestorePrivilege, SeSecurityPrivilege, and
+ * SeTakeOwnershipPrivilege) when initializing the library. This is intended
+ * for the case where the calling program manages these privileges itself.
+ * Note: no error is issued if privileges cannot be acquired, although related
+ * errors may be reported later, depending on if the operations performed
+ * actually require additional privileges or not. */
+#define WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES 0x00000002
+
+/** Windows only: If ::WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES not specified,
+ * return ::WIMLIB_ERR_INSUFFICIENT_PRIVILEGES if privileges that may be needed
+ * to read all possible data and metadata for a capture operation could not be
+ * acquired. Can be combined with ::WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES.
+ */
+#define WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES 0x00000004
+
+/** Windows only: If ::WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES not specified,
+ * return ::WIMLIB_ERR_INSUFFICIENT_PRIVILEGES if privileges that may be needed
+ * to restore all possible data and metadata for an apply operation could not be
+ * acquired. Can be combined with ::WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES.
+ */
+#define WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES 0x00000008
+
+/** Default to interpreting WIM paths case sensitively (default on UNIX-like
+ * systems). */
+#define WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE 0x00000010
+
+/** Default to interpreting WIM paths case insensitively (default on Windows).
+ * This does not apply to mounted images. */
+#define WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE 0x00000020
+
+/** @} */
+/** @addtogroup G_nonstandalone_wims
+ * @{ */
+
+/** For wimlib_reference_resource_files(), enable shell-style filename globbing.
+ * Ignored by wimlib_reference_resources(). */
+#define WIMLIB_REF_FLAG_GLOB_ENABLE 0x00000001
+
+/** For wimlib_reference_resource_files(), issue an error
+ * (::WIMLIB_ERR_GLOB_HAD_NO_MATCHES) if a glob did not match any files. The
+ * default behavior without this flag is to issue no error at that point, but
+ * then attempt to open the glob as a literal path, which of course will fail
+ * anyway if no file exists at that path. No effect if
+ * ::WIMLIB_REF_FLAG_GLOB_ENABLE is not also specified. Ignored by
+ * wimlib_reference_resources(). */
+#define WIMLIB_REF_FLAG_GLOB_ERR_ON_NOMATCH 0x00000002
+
+/** @} */
+/** @addtogroup G_modifying_wims
+ * @{ */
+
+/** The specific type of update to perform. */
+enum wimlib_update_op {
+ /** Add a new file or directory tree to the WIM image in a
+ * certain location. */
+ WIMLIB_UPDATE_OP_ADD = 0,
+
+ /** Delete a file or directory tree from the WIM image. */
+ WIMLIB_UPDATE_OP_DELETE,
+
+ /** Rename a file or directory tree in the WIM image. */
+ WIMLIB_UPDATE_OP_RENAME,
+};
+
+/** Data for a ::WIMLIB_UPDATE_OP_ADD operation. */
+struct wimlib_add_command {
+ /** Filesystem path to the file or directory tree to add. */
+ wimlib_tchar *fs_source_path;