X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=a8ab4ba80e76b316e3e64e2ed063b5147d52d849;hp=fcc88b028cf4c44b3a6a94d4a4effead6fae0e22;hb=cd433ce49f582175063141cc3673840bf321c453;hpb=5695db8f27535e50a8159a226902687fe32ffe9a diff --git a/include/wimlib.h b/include/wimlib.h index fcc88b02..a8ab4ba8 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -10,7 +10,7 @@ */ /* - * Copyright (C) 2012, 2013 Eric Biggers + * Copyright (C) 2012, 2013, 2014 Eric Biggers * * This file is part of wimlib, a library for working with WIM files. * @@ -33,7 +33,7 @@ * * @section sec_intro Introduction * - * This is the documentation for the library interface of wimlib 1.6.0, a C + * This is the documentation for the library interface of wimlib 1.6.2, a C * library for creating, modifying, extracting, and mounting files in the * Windows Imaging Format. This documentation is intended for developers only. * If you have installed wimlib and want to know how to use the @b wimlib-imagex @@ -251,27 +251,22 @@ * * @brief Extract files, directories, and images from a WIM. * - * wimlib_extract_image() extracts, or "applies", an image from a WIM - * (represented, as usual, by a ::WIMStruct). This normally extracts the image - * to a directory, but when supported by the build of the library there is also - * a special NTFS volume extraction mode (entered when - * ::WIMLIB_EXTRACT_FLAG_NTFS is specified) that allows extracting a WIM image - * directly to an unmounted NTFS volume. Various other flags allow further - * customization of image extraction. + * wimlib_extract_image() extracts, or "applies", an image from a WIM, + * represented by a ::WIMStruct. This normally extracts the image to a + * directory, but when supported by the build of the library there is also a + * special NTFS volume extraction mode (entered when ::WIMLIB_EXTRACT_FLAG_NTFS + * is specified) that allows extracting a WIM image directly to an unmounted + * NTFS volume. Various other flags allow further customization of image + * extraction. * - * Another function, wimlib_extract_files(), is also provided. It can extract - * certain files or directories from a WIM image, instead of a full image. + * wimlib_extract_paths() and wimlib_extract_pathlist() allow extracting a list + * of (possibly wildcard) paths from a WIM image. * - * wimlib_extract_paths() and wimlib_extract_pathlist() allow extracting a set - * of paths from a WIM image in a manner that may be easier to use than - * wimlib_extract_files(), and also allow wildcard patterns. + * wimlib_extract_image_from_pipe() extracts an image from a pipable WIM sent + * over a pipe; see @ref subsec_pipable_wims. * - * wimlib_extract_image_from_pipe() allows an image to be extracted from a - * pipable WIM sent over a pipe; see @ref subsec_pipable_wims. - * - * Note that some details of how image extraction/application works are - * documented more fully in the manual pages for wimlib-imagex apply and - * wimlib-imagex extract. + * Some details of how WIM extraction works are documented more fully in the + * manual pages for wimlib-imagex apply and wimlib-imagex extract. */ /** @defgroup G_mounting_wim_images Mounting WIM images @@ -324,7 +319,7 @@ * created from one of these on-disk files initially only partially represents * the full WIM and needs to, in effect, be logically combined with other * ::WIMStruct's before performing certain operations, such as extracting files - * with wimlib_extract_image() or wimlib_extract_files(). This is done by + * with wimlib_extract_image() or wimlib_extract_paths(). This is done by * calling wimlib_reference_resource_files() or wimlib_reference_resources(). * * wimlib_write() can create delta WIMs as well as standalone WIMs, but a @@ -350,7 +345,7 @@ #define WIMLIB_MINOR_VERSION 6 /** Patch version of the library (for example, the 5 in 1.2.5). */ -#define WIMLIB_PATCH_VERSION 0 +#define WIMLIB_PATCH_VERSION 2 #ifdef __cplusplus extern "C" { @@ -415,11 +410,11 @@ enum wimlib_compression_type { /** The WIM does not include any compressed resources. */ WIMLIB_COMPRESSION_TYPE_NONE = 0, - /** Compressed resources in the WIM use LZX compression. */ - WIMLIB_COMPRESSION_TYPE_LZX = 1, - /** Compressed resources in the WIM use XPRESS compression. */ - WIMLIB_COMPRESSION_TYPE_XPRESS = 2, + WIMLIB_COMPRESSION_TYPE_XPRESS = 1, + + /** Compressed resources in the WIM use LZX compression. */ + WIMLIB_COMPRESSION_TYPE_LZX = 2, /** Compressed resources in the WIM use LZMS compression. Note: LZMS * compression is only compatible with wimlib v1.6.0 and later and with @@ -437,92 +432,113 @@ enum wimlib_compression_type { enum wimlib_progress_msg { /** A WIM image is about to be extracted. @p info will point to - * ::wimlib_progress_info.extract. */ + * ::wimlib_progress_info.extract. This message is received once per + * image for calls to wimlib_extract_image() and + * wimlib_extract_image_from_pipe(). */ WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN = 0, - /** One or more file or directory trees within a WIM image (not the full - * image) is about to be extracted. @p info will point to - * ::wimlib_progress_info.extract. */ + /** One or more file or directory trees within a WIM image is about to + * be extracted. @p info will point to ::wimlib_progress_info.extract. + * This message is received only once per wimlib_extract_paths() and + * wimlib_extract_pathlist(), since wimlib combines all paths into a + * single extraction operation for optimization purposes. */ WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN, - /** The directory structure of the WIM image is about to be extracted. - * @p info will point to ::wimlib_progress_info.extract. */ + /** The directory structure and other preliminary metadata is about to + * be extracted. @p info will point to ::wimlib_progress_info.extract. + * This message is received once after either + * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN or + * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN. */ WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN, - /** The directory structure of the WIM image has been successfully - * extracted. @p info will point to ::wimlib_progress_info.extract. */ + /** Confirms that the directory structure and other preliminary metadata + * has been successfully extracted. @p info will point to + * ::wimlib_progress_info.extract. This message is paired with a + * preceding ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN message. + */ WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_END, /** File data is currently being extracted. @p info will point to - * ::wimlib_progress_info.extract. */ + * ::wimlib_progress_info.extract. This is the main message to track + * the progress of an extraction operation. */ WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, /** Starting to read a new part of a split pipable WIM over the pipe. * @p info will point to ::wimlib_progress_info.extract. */ WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN, - /** All the WIM files and directories have been extracted, and - * timestamps are about to be applied. @p info will point to - * ::wimlib_progress_info.extract. */ + /** All data for WIM files and directories have been extracted, and + * final metadata such as timestamps is about to be extracted. @p info + * will point to ::wimlib_progress_info.extract. This message is + * received once before ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END or + * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END. */ WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS, - /** A WIM image has been successfully extracted. @p info will point to - * ::wimlib_progress_info.extract. */ + /** Confirms that the image has been successfully extracted. @p info + * will point to ::wimlib_progress_info.extract. This is paired with + * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN. */ WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END, - /** A file or directory tree within a WIM image (not the full image) has - * been successfully extracted. @p info will point to - * ::wimlib_progress_info.extract. */ + /** Confirms that the files or directory trees have been successfully + * extracted. @p info will point to ::wimlib_progress_info.extract. + * This is paired with ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN. */ WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END, - /** The directory or NTFS volume is about to be scanned to build a tree - * of WIM dentries in-memory. @p info will point to - * ::wimlib_progress_info.scan. */ + /** The directory or NTFS volume is about to be scanned for metadata. + * @p info will point to ::wimlib_progress_info.scan. This message is + * received once per call to wimlib_add_image(), or once per capture + * source passed to wimlib_add_image_multisource(), or once per add + * command passed to wimlib_update_image(). */ WIMLIB_PROGRESS_MSG_SCAN_BEGIN, - /** A directory or file is being scanned. @p info will point to + /** A directory or file has been scanned. @p info will point to * ::wimlib_progress_info.scan, and its @p cur_path member will be - * valid. This message is only sent if ::WIMLIB_ADD_FLAG_VERBOSE - * is passed to wimlib_add_image(). */ + * valid. This message is only sent if ::WIMLIB_ADD_FLAG_VERBOSE has + * been specified. */ WIMLIB_PROGRESS_MSG_SCAN_DENTRY, - /** The directory or NTFS volume has been successfully scanned, and a - * tree of WIM dentries has been built in-memory. @p info will point to - * ::wimlib_progress_info.scan. */ + /** Confirms that the directory or NTFS volume has been successfully + * scanned. @p info will point to ::wimlib_progress_info.scan. This is + * paired with a previous ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN message, + * possibly with many intervening ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY + * messages. */ WIMLIB_PROGRESS_MSG_SCAN_END, - /** - * File resources are currently being written to the WIM. - * @p info will point to ::wimlib_progress_info.write_streams. */ + /** File resources ("streams") are currently being written to the WIM. + * @p info will point to ::wimlib_progress_info.write_streams. This + * message may be received many times while the WIM file is being + * written or appended to with wimlib_write(), wimlib_overwrite(), or + * wimlib_write_to_fd(). */ WIMLIB_PROGRESS_MSG_WRITE_STREAMS, - /** - * The metadata resource for each image is about to be written to the - * WIM. @p info will not be valid. */ + /** Per-image metadata is about to be written to the WIM file. @p info + * will not be valid. */ WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN, - /** - * The metadata resource for each image has successfully been writen to - * the WIM. @p info will not be valid. */ + /** Confirms that per-image metadata has been successfully been written + * to the WIM file. @p info will not be valid. This message is paired + * with a preceding ::WIMLIB_PROGRESS_MSG_WRITE_METADATA_BEGIN message. + */ WIMLIB_PROGRESS_MSG_WRITE_METADATA_END, - /** - * The temporary file has successfully been renamed to the original WIM - * file. Only happens when wimlib_overwrite() is called and the - * overwrite is not done in-place. - * @p info will point to ::wimlib_progress_info.rename. */ + /** wimlib_overwrite() has successfully renamed the temporary file to + * the original WIM file, thereby committing the update. @p info will + * point to ::wimlib_progress_info.rename. Note: this message is not + * received if wimlib_overwrite() chose to append to the WIM file + * in-place. */ WIMLIB_PROGRESS_MSG_RENAME, - /** The contents of the WIM are being checked against the integrity - * table. Only happens when wimlib_open_wim() is called with the - * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY flag. @p info will point to - * ::wimlib_progress_info.integrity. */ + /** The contents of the WIM file are being checked against the integrity + * table. @p info will point to ::wimlib_progress_info.integrity. This + * message is only received (and may be received many times) when + * wimlib_open_wim() is called with the + * ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY flag. */ WIMLIB_PROGRESS_MSG_VERIFY_INTEGRITY, /** An integrity table is being calculated for the WIM being written. - * Only happens when wimlib_write() or wimlib_overwrite() is called with - * the ::WIMLIB_WRITE_FLAG_CHECK_INTEGRITY flag. @p info will point to - * ::wimlib_progress_info.integrity. */ + * @p info will point to ::wimlib_progress_info.integrity. This message + * is only received (and may be received many times) when a WIM file is + * being written with the flag ::WIMLIB_WRITE_FLAG_CHECK_INTEGRITY. */ WIMLIB_PROGRESS_MSG_CALC_INTEGRITY, /** Reserved. */ @@ -530,23 +546,23 @@ enum wimlib_progress_msg { /** A wimlib_split() operation is in progress, and a new split part is * about to be started. @p info will point to - * ::wimlib_progress_info.split. */ + * ::wimlib_progress_info.split. */ WIMLIB_PROGRESS_MSG_SPLIT_BEGIN_PART, /** A wimlib_split() operation is in progress, and a split part has been - * finished. @p info will point to ::wimlib_progress_info.split. */ + * finished. @p info will point to ::wimlib_progress_info.split. */ WIMLIB_PROGRESS_MSG_SPLIT_END_PART, - /** - * A WIM update command is just about to be executed; @p info will point - * to ::wimlib_progress_info.update. - */ + /** A WIM update command is just about to be executed. @p info will + * point to ::wimlib_progress_info.update. This message is received + * once per update command when wimlib_update_image() is called with the + * flag ::WIMLIB_UPDATE_FLAG_SEND_PROGRESS. */ WIMLIB_PROGRESS_MSG_UPDATE_BEGIN_COMMAND, - /** - * A WIM update command has just been executed; @p info will point to - * ::wimlib_progress_info.update. - */ + /** A WIM update command has just been executed. @p info will point to + * ::wimlib_progress_info.update. This message is received once per + * update command when wimlib_update_image() is called with the flag + * ::WIMLIB_UPDATE_FLAG_SEND_PROGRESS. */ WIMLIB_PROGRESS_MSG_UPDATE_END_COMMAND, }; @@ -561,43 +577,83 @@ union wimlib_progress_info { /* N.B. I wanted these to be anonymous structs, but Doxygen won't * document them if they aren't given a name... */ - /** Valid on messages ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS. */ + /** Valid on the message ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS. This is + * the primary message for tracking the progress of writing a WIM file. + */ struct wimlib_progress_info_write_streams { - /** Number of bytes that are going to be written for all the - * streams combined. This is the amount in uncompressed data. - * (The actual number of bytes will be less if the data is being - * written compressed.) */ + /** Total number of uncompressed bytes of stream data being + * written. This can be thought of as the total uncompressed + * size of the files being archived, with some caveats. WIM + * files use single-instance streams, so the size provided here + * only counts distinct streams, except for the following + * exception: the size provided here may include the sizes of + * all newly added (e.g. with wimlib_add_image() streams, + * pending automatic de-duplication during the write operation + * itself. When each such stream de-duplication occurs, this + * number will be decreased by the size of the duplicate stream + * that need not be written. + * + * In the case of a wimlib_overwrite() that the library opted to + * perform in-place, both @p total_streams and @p total_bytes + * will only count the streams actually being written and not + * pre-existing streams in the WIM file. */ uint64_t total_bytes; - /** Number of streams that are going to be written. */ + /** Total number of streams being written. This can be thought + * of as the total number of files being archived, with some + * caveats. In general, a single file or directory may contain + * multiple data streams, each of which will be represented + * separately in this number. Furthermore, WIM files use + * single-instance streams, so the stream count provided here + * only counts distinct streams, except for the following + * exception: the stream count provided here may include newly + * added (e.g. with wimlib_add_image() streams, pending + * automatic de-duplication during the write operation itself. + * When each such stream de-duplication occurs, this number will + * be decreased by 1 to account for the duplicate stream that + * need not be written. */ uint64_t total_streams; - /** Number of uncompressed bytes that have been written so far. - * Will be 0 initially, and equal to @p total_bytes at the end. - * */ + /** Number of uncompressed bytes of stream data that have been + * written so far. This number be 0 initially, and will be + * equal to @p total_bytes at the end of the write operation. + * Note that @p total_bytes (but not @p completed_bytes) may + * decrease throughout the write operation due to the discovery + * of stream duplications. */ uint64_t completed_bytes; - /** Number of streams that have been written. Will be 0 - * initially, and equal to @p total_streams at the end. */ + /** Number of streams that have been written so far. This + * number will be 0 initially, and will be equal to @p + * total_streams at the end of the write operation. Note that + * @p total_streams (but not @p completed_streams) may decrease + * throughout the write operation due to the discovery of stream + * duplications. + * + * For applications that wish to calculate a simple "percent + * complete" for the write operation, it will likely be more + * accurate to calculate the percentage from @p completed_bytes + * and @p total_bytes rather than @p completed_streams and + * @p total_streams because the time for the operation to + * complete is mainly determined by the number of bytes that + * need to be read, compressed, and written, not just the number + * of files being archived. */ uint64_t completed_streams; - /** Number of threads that are being used to compress resources - * (if applicable). */ - unsigned num_threads; + /** Number of threads that are being used to compress streams, + * or 1 if streams are being written uncompressed. */ + uint32_t num_threads; - /** The compression type being used to write the streams; either - * ::WIMLIB_COMPRESSION_TYPE_NONE, - * ::WIMLIB_COMPRESSION_TYPE_XPRESS, or - * ::WIMLIB_COMPRESSION_TYPE_LZX. */ - int compression_type; + /** The compression type being used to write the streams, as one + * of the ::wimlib_compression_type constants. */ + int32_t compression_type; /** Number of split WIM parts from which streams are being * written (may be 0 if irrelevant). */ - unsigned total_parts; + uint32_t total_parts; /** Number of split WIM parts from which streams have been * written (may be 0 if irrelevant). */ - unsigned completed_parts; + uint32_t completed_parts; } write_streams; /** Valid on messages ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN, @@ -649,8 +705,8 @@ union wimlib_progress_info { const wimlib_tchar *wim_target_path; /** For ::WIMLIB_PROGRESS_MSG_SCAN_DENTRY and a status - * of ::WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK, this is the - * target of the absolute symbolic link or junction + * of @p WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK, this is + * the target of the absolute symbolic link or junction * point. */ const wimlib_tchar *symlink_target; }; @@ -715,14 +771,15 @@ union wimlib_progress_info { * general, actually provide information about which "file" is currently * being extracted. This is because wimlib, by default, extracts the * individual data streams in whichever order it determines to be the - * most efficient. */ + * most efficient. + */ struct wimlib_progress_info_extract { /** Number of the image from which files are being extracted * (1-based). */ - int image; + uint32_t image; /** Extraction flags being used. */ - int extract_flags; + uint32_t extract_flags; /** Full path to the WIM file from which files are being * extracted, or @c NULL if the WIMStruct has no associated @@ -762,19 +819,16 @@ union wimlib_progress_info { * data stream, or a reparse data buffer. */ uint64_t num_streams; - /** When extracting files using wimlib_extract_files(), this - * will be the path within the WIM image to the file or - * directory tree currently being extracted. Otherwise, this - * will be the empty string. */ + /** This will be the empty string. */ const wimlib_tchar *extract_root_wim_source_path; /** Currently only used for * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ - unsigned part_number; + uint32_t part_number; /** Currently only used for * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ - unsigned total_parts; + uint32_t total_parts; /** Currently only used for * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */ @@ -894,46 +948,6 @@ struct wimlib_capture_source { long reserved; }; -/** Structure that specifies a list of path patterns. */ -struct wimlib_pattern_list { - /** Array of patterns. The patterns may be modified by library code, - * but the @p pats pointer itself will not. See the man page for - * wimlib-imagex capture for more information about allowed - * patterns. */ - wimlib_tchar **pats; - - /** Number of patterns in the @p pats array. */ - size_t num_pats; - - /** Ignored; may be used by the calling code. */ - size_t num_allocated_pats; -}; - -/** A structure that contains lists of wildcards that match paths to treat - * specially when capturing a WIM image. */ -struct wimlib_capture_config { - /** Paths matching any pattern this list are excluded from being - * captured, except if the same path appears in @p - * exclusion_exception_pats. */ - struct wimlib_pattern_list exclusion_pats; - - /** Paths matching any pattern in this list are never excluded from - * being captured. */ - struct wimlib_pattern_list exclusion_exception_pats; - - /** Reserved for future capture configuration options. */ - struct wimlib_pattern_list reserved1; - - /** Reserved for future capture configuration options. */ - struct wimlib_pattern_list reserved2; - - /** Library internal use only. */ - wimlib_tchar *_prefix; - - /** Library internal use only. */ - size_t _prefix_num_tchars; -}; - /** Set or unset the WIM header flag that marks it read-only * (WIM_HDR_FLAG_READONLY in Microsoft's documentation), based on the * ::wimlib_wim_info.is_marked_readonly member of the @p info parameter. This @@ -1162,6 +1176,7 @@ struct wimlib_dir_entry { #define WIMLIB_REPARSE_TAG_DFS 0x8000000A #define WIMLIB_REPARSE_TAG_DFSR 0x80000012 #define WIMLIB_REPARSE_TAG_FILTER_MANAGER 0x8000000B +#define WIMLIB_REPARSE_TAG_WOF 0x80000017 #define WIMLIB_REPARSE_TAG_SYMLINK 0xA000000C /** If the file is a reparse point (FILE_ATTRIBUTE_DIRECTORY set in the * attributes), this will give the reparse tag. This tells you whether @@ -1246,7 +1261,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * scanned. */ #define WIMLIB_ADD_FLAG_VERBOSE 0x00000004 -/** Mark the image being added as the bootable image of the WIM. */ +/** Mark the image being added as the bootable image of the WIM. Not valid for + * wimlib_update_image(). */ #define WIMLIB_ADD_FLAG_BOOT 0x00000008 /** Store the UNIX owner, group, and mode. This is done by adding a special @@ -1295,19 +1311,13 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * 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. When this flag is - * specified, the corresponding @p config parameter or member must be @c NULL. - * - * Currently, selecting this capture configuration will cause the following - * files and directories to be excluded from capture: +/** + * Automatically select a capture configuration appropriate for capturing + * filesystems containing Windows operating systems. For example, + * "pagefile.sys" and "System Volume Information" will be excluded. * - * - "\$ntfs.log" - * - "\hiberfil.sys" - * - "\pagefile.sys" - * - "\System Volume Information" - * - "\RECYCLER" - * - "\Windows\CSC" + * When this flag is specified, the corresponding @p config parameter or member + * must be @c NULL. * * 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 @@ -1315,6 +1325,27 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour */ #define WIMLIB_ADD_FLAG_WINCONFIG 0x00000800 +/** + * Capture image as WIMBoot compatible. In addition, if no capture + * configuration file is explicitly specified use the capture configuration file + * $SOURCE/Windows/System32/WimBootCompress.ini if it exists, where + * $SOURCE is the directory being captured; or, if a capture + * configuration file is explicitly specified, use it and also place it at + * /Windows/System32/WimBootCompress.ini in the WIM image. + * + * Note: this will not by itself change the compression type. Before writing + * the WIM file, it's recommended to also do: + * + * \code + * wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_XPRESS); + * wimlib_set_output_chunk_size(wim, 4096); + * \endcode + * + * 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). + */ +#define WIMLIB_ADD_FLAG_WIMBOOT 0x00001000 + #define WIMLIB_ADD_IMAGE_FLAG_NTFS WIMLIB_ADD_FLAG_NTFS #define WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE WIMLIB_ADD_FLAG_DEREFERENCE #define WIMLIB_ADD_IMAGE_FLAG_VERBOSE WIMLIB_ADD_FLAG_VERBOSE @@ -1328,6 +1359,8 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour #define WIMLIB_ADD_IMAGE_FLAG_NO_UNSUPPORTED_EXCLUDE \ WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE #define WIMLIB_ADD_IMAGE_FLAG_WINCONFIG WIMLIB_ADD_FLAG_WINCONFIG +#define WIMLIB_ADD_IMAGE_FLAG_WIMBOOT WIMLIB_ADD_FLAG_WIMBOOT + /** @} */ /** @ingroup G_modifying_wims @@ -1375,11 +1408,13 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour #define WIMLIB_EXTRACT_FLAG_NTFS 0x00000001 /** When identical files are extracted from the WIM, always hard link them - * together. */ + * together. This flag cannot be combined with ::WIMLIB_EXTRACT_FLAG_SYMLINK. + */ #define WIMLIB_EXTRACT_FLAG_HARDLINK 0x00000002 /** When identical files are extracted from the WIM, always symlink them - * together. */ + * together. This flag cannot be combined with ::WIMLIB_EXTRACT_FLAG_HARDLINK. + */ #define WIMLIB_EXTRACT_FLAG_SYMLINK 0x00000004 /** This flag no longer does anything but is reserved for future use. */ @@ -1395,31 +1430,35 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * specified. */ #define WIMLIB_EXTRACT_FLAG_UNIX_DATA 0x00000020 -/** Do not extract security descriptors. */ +/** Do not extract security descriptors. This flag cannot be combined with + * ::WIMLIB_EXTRACT_FLAG_STRICT_ACLS. */ #define WIMLIB_EXTRACT_FLAG_NO_ACLS 0x00000040 /** Fail immediately if the full security descriptor of any file or directory * cannot be set exactly as specified in the WIM file. On Windows, the default - * behavior without this flag is to fall back to setting the security descriptor - * with the SACL omitted, then only the default inherited security descriptor, - * if we do not have permission to set the desired one. */ + * behavior without this flag when wimlib does not have permission to set the + * correct security descriptor is to fall back to setting the security + * descriptor with the SACL omitted, then with the DACL omitted, then with the + * owner omitted, then not at all. This flag cannot be combined with + * ::WIMLIB_EXTRACT_FLAG_NO_ACLS. */ #define WIMLIB_EXTRACT_FLAG_STRICT_ACLS 0x00000080 /** This is the extraction equivalent to ::WIMLIB_ADD_FLAG_RPFIX. This forces * reparse-point fixups on, so absolute symbolic links or junction points will - * be fixed to be absolute relative to the actual extraction root. Reparse - * point fixups are done by default if WIM_HDR_FLAG_RP_FIX is set in the WIM - * header. This flag may only be specified when extracting a full image (not a - * file or directory tree within one). */ + * be fixed to be absolute relative to the actual extraction root. Reparse- + * point fixups are done by default for wimlib_extract_image() and + * wimlib_extract_image_from_pipe() if WIM_HDR_FLAG_RP_FIX is set in the WIM + * header. This flag cannot be combined with ::WIMLIB_EXTRACT_FLAG_NORPFIX. */ #define WIMLIB_EXTRACT_FLAG_RPFIX 0x00000100 /** Force reparse-point fixups on extraction off, regardless of the state of the - * WIM_HDR_FLAG_RP_FIX flag in the WIM header. */ + * WIM_HDR_FLAG_RP_FIX flag in the WIM header. This flag cannot be combined + * with ::WIMLIB_EXTRACT_FLAG_RPFIX. */ #define WIMLIB_EXTRACT_FLAG_NORPFIX 0x00000200 -/** Extract the specified file to standard output. This is only valid in an - * extraction command that specifies the extraction of a regular file in the WIM - * image. */ +/** Extract the paths, each of which must name a regular file, to standard + * output. Not valid for wimlib_extract_image() and + * wimlib_extract_image_from_pipe(). */ #define WIMLIB_EXTRACT_FLAG_TO_STDOUT 0x00000400 /** Instead of ignoring files and directories with names that cannot be @@ -1458,16 +1497,14 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour #define WIMLIB_EXTRACT_FLAG_FILE_ORDER 0x00020000 /** For wimlib_extract_paths() and wimlib_extract_pathlist() only: Treat the - * paths in the WIM as "glob" patterns which may contain the wildcard characters - * '?' and '*'. The '?' character matches any character except a path - * separator, whereas the '*' character matches zero or more non-path-separator - * characters. Each glob pattern may match zero or more paths in the WIM file. - * If a glob pattern ends in a path separator, it will only match directories - * (including reparse points with FILE_ATTRIBUTE_DIRECTORY set). By default, if - * a glob pattern does not match any files, a warning but not an error will be - * issued, even if the glob pattern did not actually contain wildcard - * characters. Use ::WIMLIB_EXTRACT_FLAG_STRICT_GLOB to get an error instead. - */ + * paths to extract as wildcard patterns ("globs") which may contain the + * wildcard characters @c ? and @c *. The @c ? character matches any + * non-path-separator character, whereas the @c * character matches zero or more + * non-path-separator characters. Consequently, each glob may match zero or + * more actual paths in the WIM image. By default, if a glob does not match any + * files, a warning but not an error will be issued, even if the glob did not + * actually contain wildcard characters. Use ::WIMLIB_EXTRACT_FLAG_STRICT_GLOB + * to get an error instead. */ #define WIMLIB_EXTRACT_FLAG_GLOB_PATHS 0x00040000 /** In combination with ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS, causes an error @@ -1475,6 +1512,20 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour * one of the provided globs did not match a file. */ #define WIMLIB_EXTRACT_FLAG_STRICT_GLOB 0x00080000 +/** Do not extract Windows file attributes such as readonly, hidden, etc. */ +#define WIMLIB_EXTRACT_FLAG_NO_ATTRIBUTES 0x00100000 + +/** For wimlib_extract_paths() and wimlib_extract_pathlist() only: Do not + * preserve the directory structure of the archive when extracting --- that is, + * place each extracted file or directory tree directly in the target directory. + */ +#define WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE 0x00200000 + +/** Windows only: Extract files as "pointers" back to the WIM archive. See the + * documentation for the --wimboot option of wimlib-imagex apply + * for more information. */ +#define WIMLIB_EXTRACT_FLAG_WIMBOOT 0x00400000 + /** @} */ /** @ingroup G_mounting_wim_images * @{ */ @@ -1549,6 +1600,11 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** Do a "lazy" unmount (detach filesystem immediately, even if busy). */ #define WIMLIB_UNMOUNT_FLAG_LAZY 0x00000010 +/** In combination with ::WIMLIB_UNMOUNT_FLAG_COMMIT for a read-write mounted + * image, causes the modified image to be committed as a new, unnamed image + * appended to the archive. The original image will be unmodified. */ +#define WIMLIB_UNMOUNT_FLAG_NEW_IMAGE 0x00000020 + /** @} */ /** @ingroup G_modifying_wims * @{ */ @@ -1695,16 +1751,17 @@ typedef int (*wimlib_iterate_lookup_table_callback_t)(const struct wimlib_resour /** @ingroup G_nonstandalone_wims * @{ */ -/** wimlib_reference_resource_files() only: Enable shell-style filename - * globbing. */ +/** For wimlib_reference_resource_files(), enable shell-style filename globbing. + * Ignored by wimlib_reference_resources(). */ #define WIMLIB_REF_FLAG_GLOB_ENABLE 0x00000001 -/** wimlib_reference_resource_files() only: Issue an error +/** 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. */ + * ::WIMLIB_REF_FLAG_GLOB_ENABLE is not also specified. Ignored by + * wimlib_reference_resources(). */ #define WIMLIB_REF_FLAG_GLOB_ERR_ON_NOMATCH 0x00000002 /** @} */ @@ -1734,11 +1791,9 @@ struct wimlib_add_command { * WIM image. */ wimlib_tchar *wim_target_path; - /** Configuration for excluded files. @c NULL means - * exclude no files (use no configuration), unless - * ::WIMLIB_ADD_FLAG_WINCONFIG is specified in @p - * add_flags. */ - struct wimlib_capture_config *config; + /** Path to capture configuration file to use, or @c NULL for default. + */ + wimlib_tchar *config_file; /** Bitwise OR of WIMLIB_ADD_FLAG_* flags. */ int add_flags; @@ -1781,26 +1836,6 @@ struct wimlib_update_command { }; }; -/** @} */ -/** @ingroup G_extracting_wims - * @{ */ - -/** Specification of a file or directory tree to extract from a WIM image. Used - * in calls to wimlib_extract_files(). */ -struct wimlib_extract_command { - /** Path to file or directory tree within the WIM image to extract. It - * must be provided as an absolute path from the root of the WIM image. - * The path separators may be either forward slashes or backslashes. */ - wimlib_tchar *wim_source_path; - - /** Filesystem path to extract the file or directory tree to. */ - wimlib_tchar *fs_dest_path; - - /** Bitwise or of zero or more of the WIMLIB_EXTRACT_FLAG_* flags. */ - int extract_flags; -}; - - /** @} */ /** @ingroup G_general * @{ */ @@ -1887,6 +1922,7 @@ enum wimlib_error_code { WIMLIB_ERR_WRITE, WIMLIB_ERR_XML, WIMLIB_ERR_WIM_IS_ENCRYPTED, + WIMLIB_ERR_WIMBOOT, }; @@ -1896,6 +1932,8 @@ enum wimlib_error_code { /** Used to specify all images in the WIM. */ #define WIMLIB_ALL_IMAGES (-1) +/** @} */ + /** * @ingroup G_modifying_wims * @@ -1961,10 +1999,15 @@ wimlib_add_empty_image(WIMStruct *wim, * Name to give the new image. If @c NULL or empty, the new image is given * no name. If nonempty, it must specify a name that does not already * exist in @p wim. - * @param config - * Capture configuration that specifies files, directories, or path globs - * to exclude from being captured. If @c NULL, a dummy configuration where - * no paths are treated specially is used. + * @param config_file + * Path to capture configuration file, or @c NULL. This file may specify, + * among other things, which files to exclude from capture. See the man + * page for wimlib-imagex capture (--config option) for + * details of the file format. If @c NULL, the default capture + * configuration shall be used. Ordinarily, the default capture + * configuration will result in no files being excluded from capture purely + * based on name; however, the ::WIMLIB_ADD_FLAG_WINCONFIG and + * ::WIMLIB_ADD_FLAG_WIMBOOT flags modify the default. * @param add_flags * Bitwise OR of flags prefixed with WIMLIB_ADD_FLAG. * @param progress_func @@ -1988,7 +2031,7 @@ extern int wimlib_add_image(WIMStruct *wim, const wimlib_tchar *source, const wimlib_tchar *name, - const struct wimlib_capture_config *config, + const wimlib_tchar *config_file, int add_flags, wimlib_progress_func_t progress_func); @@ -2017,7 +2060,7 @@ wimlib_add_image_multisource(WIMStruct *wim, const struct wimlib_capture_source *sources, size_t num_sources, const wimlib_tchar *name, - const struct wimlib_capture_config *config, + const wimlib_tchar *config_file, int add_flags, wimlib_progress_func_t progress_func); @@ -2030,9 +2073,8 @@ wimlib_add_image_multisource(WIMStruct *wim, * images. No on-disk file is created until wimlib_write() is called. * * @param ctype - * The type of compression to be used in the new WIM file. Must be - * ::WIMLIB_COMPRESSION_TYPE_NONE, ::WIMLIB_COMPRESSION_TYPE_LZX, or - * ::WIMLIB_COMPRESSION_TYPE_XPRESS. + * The type of compression to be used in the new WIM file, as one of the + * ::wimlib_compression_type constants. * @param wim_ret * On success, a pointer to an opaque ::WIMStruct for the new WIM file is * written to the memory location pointed to by this paramater. The @@ -2040,8 +2082,7 @@ wimlib_add_image_multisource(WIMStruct *wim, * it. * @return 0 on success; nonzero on error. * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE - * @p ctype was not ::WIMLIB_COMPRESSION_TYPE_NONE, - * ::WIMLIB_COMPRESSION_TYPE_LZX, or ::WIMLIB_COMPRESSION_TYPE_XPRESS. + * @p ctype was not a supported compression type. * @retval ::WIMLIB_ERR_NOMEM * Failed to allocate needed memory. */ @@ -2184,78 +2225,12 @@ wimlib_export_image(WIMStruct *src_wim, int src_image, int export_flags, wimlib_progress_func_t progress_func); -/** - * @ingroup G_extracting_wims - * - * Extract zero or more files or directory trees from a WIM image. - * - * This generalizes the single-image extraction functionality of - * wimlib_extract_image() to allow extracting only the specified subsets of the - * image. - * - * @param wim - * The WIM from which to extract the files, specified as a pointer to the - * ::WIMStruct for a standalone WIM file, a delta WIM file, or part 1 of a - * split WIM. In the case of a WIM file that is not standalone, this - * ::WIMStruct must have had any needed external resources previously - * referenced using wimlib_reference_resources() or - * wimlib_reference_resource_files(). - * - * @param image - * The 1-based number of the image in @p wim from which the files or - * directory trees are to be extracted. It cannot be ::WIMLIB_ALL_IMAGES. - * - * @param cmds - * An array of ::wimlib_extract_command structures that specifies the - * extractions to perform. - * - * @param num_cmds - * Number of commands in the @p cmds array. - * - * @param default_extract_flags - * Default extraction flags; the behavior shall be as if these flags had - * been specified in the ::wimlib_extract_command.extract_flags member in - * each extraction command, in combination with any flags already present. - * - * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. - * - * @return 0 on success; nonzero on error. The possible error codes include - * most of those documented as returned by wimlib_extract_image() as well as the - * following additional error codes: - * - * @retval ::WIMLIB_ERR_INVALID_IMAGE - * @p image was ::WIMLIB_ALL_IMAGES (or was not otherwise a valid image in - * the WIM file). - * @retval ::WIMLIB_ERR_PATH_DOES_NOT_EXIST - * The ::wimlib_extract_command.wim_source_path member in one of the - * extract commands did not exist in the WIM. - * @retval ::WIMLIB_ERR_NOT_A_REGULAR_FILE - * ::WIMLIB_EXTRACT_FLAG_TO_STDOUT was specified for an extraction command - * in which ::wimlib_extract_command.wim_source_path existed but was not a - * regular file or directory. - * @retval ::WIMLIB_ERR_INVALID_PARAM - * ::WIMLIB_EXTRACT_FLAG_HARDLINK or ::WIMLIB_EXTRACT_FLAG_SYMLINK was - * specified for some commands but not all; or - * ::wimlib_extract_command.fs_dest_path was @c NULL or the empty string - * for one or more commands; or ::WIMLIB_EXTRACT_FLAG_RPFIX was specified - * for a command in which ::wimlib_extract_command.wim_source_path did not - * specify the root directory of the WIM image. - */ -extern int -wimlib_extract_files(WIMStruct *wim, - int image, - const struct wimlib_extract_command *cmds, - size_t num_cmds, - int default_extract_flags, - wimlib_progress_func_t progress_func); /** * @ingroup G_extracting_wims * - * Extracts an image, or all images, from a WIM to a directory or directly to a - * NTFS volume image. + * Extracts an image, or all images, from a WIM to a directory or NTFS volume + * image. * * The exact behavior of how wimlib extracts files from a WIM image is * controllable by the @p extract_flags parameter, but there also are @@ -2264,12 +2239,6 @@ wimlib_extract_files(WIMStruct *wim, * special "NTFS volume extraction mode" entered by providing * ::WIMLIB_EXTRACT_FLAG_NTFS. * - * All extracted data is SHA1-summed, and ::WIMLIB_ERR_INVALID_RESOURCE_HASH is - * returned if any resulting SHA1 message digests do not match the values - * provided in the WIM file. Therefore, if this function is successful, you can - * be fairly sure that any compressed data in the WIM was uncompressed - * correctly. - * * @param wim * The WIM from which to extract the image(s), specified as a pointer to * the ::WIMStruct for a standalone WIM file, a delta WIM file, or part 1 @@ -2278,51 +2247,55 @@ wimlib_extract_files(WIMStruct *wim, * referenced using wimlib_reference_resources() or * wimlib_reference_resource_files(). * @param image - * The image to extract. Can be the number of an image, or ::WIMLIB_ALL_IMAGES - * to specify that all images are to be extracted. ::WIMLIB_ALL_IMAGES cannot - * be used if ::WIMLIB_EXTRACT_FLAG_NTFS is specified in @p extract_flags. + * The image to extract, specified as either the 1-based index of a single + * image to extract, or ::WIMLIB_ALL_IMAGES to specify that all images are + * to be extracted. ::WIMLIB_ALL_IMAGES cannot be used if + * ::WIMLIB_EXTRACT_FLAG_NTFS is specified in @p extract_flags. * @param target - * Directory to extract the WIM image(s) to (created if it does not already - * exist); or, with ::WIMLIB_EXTRACT_FLAG_NTFS in @p extract_flags, the - * path to the unmounted NTFS volume to extract the image to. + * Directory to extract the WIM image(s) to; or, with + * ::WIMLIB_EXTRACT_FLAG_NTFS specified in @p extract_flags, the path to + * the unmounted NTFS volume to which to extract the image. * @param extract_flags - * Bitwise OR of the flags prefixed with WIMLIB_EXTRACT_FLAG. + * Bitwise OR of flags prefixed with WIMLIB_EXTRACT_FLAG. * @param progress_func - * If non-NULL, a function that will be called periodically with the - * progress of the current operation. + * If non-NULL, a function that will be called periodically with the + * progress of the current operation. The main message to look for is + * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS; however, there are others as + * well. * * @return 0 on success; nonzero on error. * @retval ::WIMLIB_ERR_DECOMPRESSION - * Failed to decompress a resource to be extracted. + * Failed to decompress data contained in the WIM. + * @retval ::WIMLIB_ERR_INVALID_METADATA_RESOURCE + * The metadata for one of the images to extract was invalid. * @retval ::WIMLIB_ERR_INVALID_PARAM - * Both ::WIMLIB_EXTRACT_FLAG_HARDLINK and ::WIMLIB_EXTRACT_FLAG_SYMLINK - * were specified in @p extract_flags; or both - * ::WIMLIB_EXTRACT_FLAG_STRICT_ACLS and ::WIMLIB_EXTRACT_FLAG_NO_ACLS were - * specified in @p extract_flags; or both ::WIMLIB_EXTRACT_FLAG_RPFIX and - * ::WIMLIB_EXTRACT_FLAG_NORPFIX were specified in @p extract_flags; or - * ::WIMLIB_EXTRACT_FLAG_RESUME was specified in @p extract_flags; or if - * ::WIMLIB_EXTRACT_FLAG_NTFS was specified in @p extract_flags and - * @p image was ::WIMLIB_ALL_IMAGES. + * The extraction flags were invalid; more details may be found in the + * documentation for the specific extraction flags that were specified. Or + * @p target was @c NULL or the empty string, or @p wim was @c NULL. * @retval ::WIMLIB_ERR_INVALID_RESOURCE_HASH - * The SHA1 message digest of an extracted stream did not match the SHA1 - * message digest given in the WIM file. + * The SHA1 message digest of an extracted stream did not match the SHA1 + * message digest given in the WIM. * @retval ::WIMLIB_ERR_LINK - * Failed to create a symbolic link or a hard link. + * Failed to create a symbolic link or a hard link. + * @retval ::WIMLIB_ERR_METADATA_NOT_FOUND + * The metadata resource for one of the images to extract was not found. + * This can happen if @p wim represents a non-first part of a split WIM. * @retval ::WIMLIB_ERR_MKDIR - * Failed create a directory. + * Failed create a directory. * @retval ::WIMLIB_ERR_NOMEM - * Failed to allocate needed memory. + * Failed to allocate needed memory. * @retval ::WIMLIB_ERR_OPEN - * Could not create a file, or failed to open an already-extracted file. + * Could not create a file, or failed to open an already-extracted file. * @retval ::WIMLIB_ERR_READ - * Failed to read data from the WIM file associated with @p wim. + * Failed to read data from the WIM. * @retval ::WIMLIB_ERR_READLINK * Failed to determine the target of a symbolic link in the WIM. * @retval ::WIMLIB_ERR_REPARSE_POINT_FIXUP_FAILED * Failed to fix the target of an absolute symbolic link (e.g. if the - * target would have exceeded the maximum allowed length). (Only if - * reparse data was supported by the extraction mode and - * ::WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS was specified in @p extract_flags.) + * target would have exceeded the maximum allowed length). (Only if + * reparse data was supported by the extraction mode and + * ::WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS was specified in @p + * extract_flags.) * @retval ::WIMLIB_ERR_RESOURCE_NOT_FOUND * One of the files or directories that needed to be extracted referenced a * stream not present in the WIM's lookup table (or in any of the lookup @@ -2343,8 +2316,7 @@ wimlib_extract_files(WIMStruct *wim, * Failed to set timestamps on a file (only if * ::WIMLIB_EXTRACT_FLAG_STRICT_TIMESTAMPS was specified in @p extract_flags). * @retval ::WIMLIB_ERR_UNEXPECTED_END_OF_FILE - * Unexpected end-of-file occurred when reading data from the WIM file - * associated with @p wim. + * Unexpected end-of-file occurred when reading data from the WIM. * @retval ::WIMLIB_ERR_UNSUPPORTED * A requested extraction flag, or the data or metadata that must be * extracted to support it, is unsupported in the build and configuration @@ -2356,21 +2328,16 @@ wimlib_extract_files(WIMStruct *wim, * ::WIMLIB_EXTRACT_FLAG_STRICT_SYMLINKS, ::WIMLIB_EXTRACT_FLAG_SYMLINK, * and ::WIMLIB_EXTRACT_FLAG_HARDLINK. For example, if * ::WIMLIB_EXTRACT_FLAG_STRICT_SHORT_NAMES is specified in @p - * extract_flags, - * ::WIMLIB_ERR_UNSUPPORTED will be returned if the WIM image contains one - * or more files with short names, but extracting short names is not - * supported --- on Windows, this occurs if the target volume does not - * support short names, while on non-Windows, this occurs if + * extract_flags, ::WIMLIB_ERR_UNSUPPORTED will be returned if the WIM + * image contains one or more files with short names, but extracting short + * names is not supported --- on Windows, this occurs if the target volume + * does not support short names, while on non-Windows, this occurs if * ::WIMLIB_EXTRACT_FLAG_NTFS was not specified in @p extract_flags. + * @retval ::WIMLIB_ERR_WIMBOOT + * ::WIMLIB_EXTRACT_FLAG_WIMBOOT was specified in @p extract_flags, but + * there was a problem creating WIMBoot pointer files. * @retval ::WIMLIB_ERR_WRITE * Failed to write data to a file being extracted. - * - * This function can additionally return ::WIMLIB_ERR_DECOMPRESSION, - * ::WIMLIB_ERR_INVALID_METADATA_RESOURCE, ::WIMLIB_ERR_METADATA_NOT_FOUND, - * ::WIMLIB_ERR_NOMEM, ::WIMLIB_ERR_READ, or - * ::WIMLIB_ERR_UNEXPECTED_END_OF_FILE, all of which indicate failure (for - * different reasons) to read the metadata resource for an image that needed to - * be extracted. */ extern int wimlib_extract_image(WIMStruct *wim, int image, @@ -2381,8 +2348,8 @@ wimlib_extract_image(WIMStruct *wim, int image, /** * @ingroup G_extracting_wims * - * Since wimlib v1.5.0: Extract one or more images from a pipe on which a - * pipable WIM is being sent. + * Since wimlib v1.5.0: Extract one image from a pipe on which a pipable WIM is + * being sent. * * See the documentation for ::WIMLIB_WRITE_FLAG_PIPABLE for more information * about pipable WIMs. @@ -2407,17 +2374,16 @@ wimlib_extract_image(WIMStruct *wim, int image, * Same as the corresponding parameter to wimlib_extract_image(). * @param extract_flags * Same as the corresponding parameter to wimlib_extract_image(), except - * for the following exceptions: ::WIMLIB_EXTRACT_FLAG_SEQUENTIAL is - * always implied, since data is always read from @p pipe_fd sequentially - * in this mode; also, ::WIMLIB_EXTRACT_FLAG_TO_STDOUT is invalid and will + * that ::WIMLIB_EXTRACT_FLAG_FILE_ORDER cannot be specified and will * result in ::WIMLIB_ERR_INVALID_PARAM being returned. * @param progress_func * Same as the corresponding parameter to wimlib_extract_image(), except * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN messages will also be - * received. + * received by the progress function. * * @return 0 on success; nonzero on error. The possible error codes include - * those returned by wimlib_extract_image() as well as the following: + * those returned by wimlib_extract_image() and wimlib_open_wim() as well as the + * following: * * @retval ::WIMLIB_ERR_INVALID_PIPABLE_WIM * Data read from the pipable WIM was invalid. @@ -2431,12 +2397,19 @@ wimlib_extract_image_from_pipe(int pipe_fd, wimlib_progress_func_t progress_func); /** - * Similar to wimlib_extract_paths(), but the paths to extract from the WIM - * image specified in the UTF-8 text file named by @p path_list_file which - * itself contains the list of paths to use, one per line. Leading and trailing - * whitespace, and otherwise empty lines and lines beginning with the ';' - * character are ignored. No quotes are needed as paths are otherwise delimited - * by the newline character. + * @ingroup G_extracting_wims + * + * Since wimlib v1.6.0: Similar to wimlib_extract_paths(), but the paths to + * extract from the WIM image are specified in the UTF-8 text file named by @p + * path_list_file which itself contains the list of paths to use, one per line. + * Leading and trailing whitespace, and otherwise empty lines and lines + * beginning with the ';' character are ignored. No quotes are needed as paths + * are otherwise delimited by the newline character. + * + * The error codes are the same as those returned by wimlib_extract_paths(), + * except that wimlib_extract_pathlist() returns an appropriate error code if it + * cannot read the path list file (::WIMLIB_ERR_OPEN, ::WIMLIB_ERR_STAT, + * ::WIMLIB_ERR_READ, ::WIMLIB_ERR_NOMEM, or ::WIMLIB_ERR_INVALID_UTF8_STRING). */ extern int wimlib_extract_pathlist(WIMStruct *wim, int image, @@ -2446,30 +2419,83 @@ wimlib_extract_pathlist(WIMStruct *wim, int image, wimlib_progress_func_t progress_func); /** - * Similar to wimlib_extract_files(), but the files or directories to extract - * from the WIM image are specified as an array of paths. - * - * Each path will be extracted to a corresponding subdirectory of the @p target - * based on its location in the WIM image. For example, if one of the paths to - * extract is "/Windows/explorer.exe" and the target is "outdir", the file will - * be extracted to "outdir/Windows/explorer.exe". Each path to extract must be - * specified as the absolute path to a directory within the WIM image. - * Separators in the paths to extract may be either forwards or backwards - * slashes, and leading path separators are optional. Symbolic links are not - * dereferenced when interpreting paths to extract. Paths to extract will be - * interpreted either case-sensitively (UNIX default) or case-insensitively - * (Windows default); this can be changed by wimlib_global_init(). - * - * The @p target path, on the other hand, is expected to be a native path. On - * UNIX-like systems it may not contain backslashes, for example. - * - * By default, if any paths to extract do not exist, - * ::WIMLIB_ERR_PATH_DOES_NOT_EXIST is issued. This behavior changes if - * ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS is specified. - * - * With ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS specified in @p extract_flags, this - * function additionally allows paths to be globs using the wildcard characters - * '*' and '?'. + * @ingroup G_extracting_wims + * + * Since wimlib v1.6.0: Extract zero or more paths (files or directory trees) + * from the specified WIM image. + * + * By default, each path will be extracted to a corresponding subdirectory of + * the target based on its location in the WIM image. For example, if one of + * the paths to extract is "/Windows/explorer.exe" and the target is "outdir", + * the file will be extracted to "outdir/Windows/explorer.exe". This behavior + * can be changed by providing the flag + * ::WIMLIB_EXTRACT_FLAG_NO_PRESERVE_DIR_STRUCTURE, which will cause each file + * or directory tree to be placed directly in the target directory --- so the + * same example would extract "/Windows/explorer.exe" to "outdir/explorer.exe". + * + * Symbolic links will not be dereferenced when paths in the WIM image are + * interpreted. + * + * @param wim + * WIM from which to extract the paths, specified as a pointer to the + * ::WIMStruct for a standalone WIM file, a delta WIM file, or part 1 of a + * split WIM. In the case of a WIM file that is not standalone, this + * ::WIMStruct must have had any needed external resources previously + * referenced using wimlib_reference_resources() or + * wimlib_reference_resource_files(). + * @param image + * 1-based index of the WIM image from which to extract the paths. + * @param paths + * Array of paths to extract. Each element must be the absolute path to a + * file or directory within the WIM image. Separators may be either + * forwards or backwards slashes, and leading path separators are optional. + * The paths will be interpreted either case-sensitively (UNIX default) or + * case-insensitively (Windows default); this can be changed by + * wimlib_global_init(). + *
+ * By default, the characters @c * and @c ? are interpreted literally. + * This can be changed by specifying ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS in @p + * extract_flags. + *
+ * By default, if any paths to extract do not exist, the error code + * ::WIMLIB_ERR_PATH_DOES_NOT_EXIST is returned. This behavior changes if + * ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS is specified in @p extract_flags. + * @param num_paths + * Number of paths specified in @p paths. + * @param target + * Directory to which to extract the paths; or with + * ::WIMLIB_EXTRACT_FLAG_NTFS specified in @p extract_flags, the path to an + * unmounted NTFS volume to which to extract the paths. Unlike the @p + * paths being extracted, the @p target must be native path. On UNIX-like + * systems it may not contain backslashes, for example. + * @param extract_flags + * Bitwise OR of flags prefixed with WIMLIB_EXTRACT_FLAG. + * @param progress_func + * If non-NULL, a function that will be called periodically with the + * progress of the current operation. The main message to look for is + * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS; however, there are others as + * well. Note: because the extraction code is stream-based and not + * file-based, there is no way to get information about which path is + * currently being extracted, but based on byte count you can still + * calculate an approximate percentage complete for the extraction overall + * which may be all you really need anyway. + * + * @return 0 on success; nonzero on error. Most of the error codes are the same + * as those returned by wimlib_extract_image(). Below, some of the error codes + * returned in situations specific to path-mode extraction are documented: + * + * @retval ::WIMLIB_ERR_INVALID_IMAGE + * @p image was ::WIMLIB_ALL_IMAGES or was otherwise not a valid single + * image in the WIM. + * @retval ::WIMLIB_ERR_PATH_DOES_NOT_EXIST + * One of the paths to extract did not exist in the WIM image. This error + * code can only be returned if ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS was not + * specified in @p extract_flags, or if both + * ::WIMLIB_EXTRACT_FLAG_GLOB_PATHS and ::WIMLIB_EXTRACT_FLAG_STRICT_GLOB + * were specified in @p extract_flags. + * @retval ::WIMLIB_ERR_NOT_A_REGULAR_FILE + * ::WIMLIB_EXTRACT_FLAG_TO_STDOUT was specified in @p extract_flags, but + * one of the paths to extract did not name a regular file. */ extern int wimlib_extract_paths(WIMStruct *wim, @@ -2527,12 +2553,11 @@ wimlib_free(WIMStruct *wim); * Converts a ::wimlib_compression_type value into a string. * * @param ctype - * ::WIMLIB_COMPRESSION_TYPE_NONE, ::WIMLIB_COMPRESSION_TYPE_LZX, - * ::WIMLIB_COMPRESSION_TYPE_XPRESS, or another value. + * The ::wimlib_compression_type value to convert. * * @return - * A statically allocated string: "None", "LZX", "XPRESS", or "Invalid", - * respectively. + * A statically allocated string naming the compression algorithm, + * such as "None", "LZX", "XPRESS", or "Invalid". */ extern const wimlib_tchar * wimlib_get_compression_type_string(int ctype); @@ -2594,6 +2619,19 @@ wimlib_get_image_description(const WIMStruct *wim, int image); extern const wimlib_tchar * wimlib_get_image_name(const WIMStruct *wim, int image); +/** + * @ingroup G_general + * + * Returns the version of wimlib as a 32-bit number whose top 12 bits contain + * the major version, the next 10 bits contain the minor version, and the low 10 + * bits contain the patch version. + * + * In other words, the returned value is equal to ((WIMLIB_MAJOR_VERSION + * << 22) | (WIMLIB_MINOR_VERSION << 10) | WIMLIB_PATCH_VERSION) for the + * corresponding header file. + */ +extern uint32_t +wimlib_get_version(void); /** * @ingroup G_wim_information @@ -2866,7 +2904,7 @@ wimlib_join(const wimlib_tchar * const *swms, * @param dir * The path to an existing empty directory to mount the image on. * @param mount_flags - * Bitwise OR of the flags prefixed with WIMLIB_MOUNT_FLAG. + * Bitwise OR of flags prefixed with WIMLIB_MOUNT_FLAG. * @param staging_dir * If non-NULL, the name of a directory in which the staging directory will * be created. Ignored if ::WIMLIB_MOUNT_FLAG_READWRITE is not specified @@ -2955,10 +2993,10 @@ wimlib_mount_image(WIMStruct *wim, * in the integrity table. * @retval ::WIMLIB_ERR_INVALID_CHUNK_SIZE * Resources in @p wim_file are compressed, but the chunk size was invalid - * for the WIM's compression format. + * for the WIM's compression type. * @retval ::WIMLIB_ERR_INVALID_COMPRESSION_TYPE * The header of @p wim_file says that resources in the WIM are compressed, - * but the header flag indicating LZX or XPRESS compression is not set. + * but the header flag for a recognized compression type is not set. * @retval ::WIMLIB_ERR_INVALID_HEADER * The header of @p wim_file was otherwise invalid. * @retval ::WIMLIB_ERR_INVALID_INTEGRITY_TABLE @@ -2966,9 +3004,7 @@ wimlib_mount_image(WIMStruct *wim, * wim_file contains an integrity table, but the integrity table is * invalid. * @retval ::WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY - * The lookup table for the WIM contained duplicate entries that are not - * for metadata resources, or it contained an entry with a SHA1 message - * digest of all 0's. + * The lookup table for the WIM was invalid. * @retval ::WIMLIB_ERR_INVALID_PARAM * @p wim_ret was @c NULL. * @retval ::WIMLIB_ERR_IS_SPLIT_WIM @@ -2985,8 +3021,10 @@ wimlib_mount_image(WIMStruct *wim, * @retval ::WIMLIB_ERR_UNEXPECTED_END_OF_FILE * Unexpected end-of-file while reading data from @p wim_file. * @retval ::WIMLIB_ERR_UNKNOWN_VERSION - * A number other than 0x10d00 is written in the version field of the WIM - * header of @p wim_file. (May be a pre-Vista WIM.) + * The WIM version number was not recognized. (May be a pre-Vista WIM.) + * @retval ::WIMLIB_ERR_WIM_IS_ENCRYPTED + * The WIM cannot be opened because it contains encrypted segments. (It + * may be a Windows 8 "ESD" file). * @retval ::WIMLIB_ERR_WIM_IS_READONLY * ::WIMLIB_OPEN_FLAG_WRITE_ACCESS was specified but the WIM file was * considered read-only because of any of the reasons mentioned in the @@ -3107,15 +3145,6 @@ wimlib_print_available_images(const WIMStruct *wim, int image); extern void wimlib_print_header(const WIMStruct *wim) _wimlib_deprecated; -/** - * @ingroup G_wim_information - * - * Deprecated in favor of wimlib_iterate_dir_tree(), which provides the - * information in a way that can be accessed programatically. - */ -extern int -wimlib_print_metadata(WIMStruct *wim, int image) _wimlib_deprecated; - /** * @ingroup G_nonstandalone_wims * @@ -3344,30 +3373,29 @@ wimlib_set_image_descripton(WIMStruct *wim, int image, * Set the compression chunk size of a WIM to use in subsequent calls to * wimlib_write() or wimlib_overwrite(). * - * A compression chunk size will result in a greater compression ratio, but the - * speed of random access to the WIM will be reduced, and the effect of an - * increased compression chunk size is limited by the size of each file being - * compressed. + * For compatibility reasons, using this function is not generally recommended. + * See the documentation for the @c --chunk-size option of wimlib-imagex + * capture for more information. * - * WARNING: Microsoft's software is seemingly incompatible with LZX chunk - * sizes other than 32768. Chunk sizes other than 32768 (for any format) are - * also incompatible with wimlib v1.5.3 and earlier. + * A larger compression chunk size will likely result in a better compression + * ratio, but the speed of random access to the WIM will be reduced. + * Furthermore, the effect of a larger compression chunk size is limited by the + * size of each stream ("file") being compressed. * * @param wim * ::WIMStruct for a WIM. - * @param out_chunk_size + * @param chunk_size * The chunk size (in bytes) to set. The valid chunk sizes are dependent - * on the compression format. The XPRESS compression format supports chunk - * sizes that are powers of 2 with exponents between 15 and 26 inclusively, - * whereas the LZX compression format supports chunk sizes that are powers - * of 2 with exponents between 15 and 21 inclusively. As a special case, - * if @p out_chunk_size is specified as 0, the chunk size is set to the - * default for the currently selected output compression type. + * on the compression format; see the documentation for the @c --chunk-size + * option of wimlib-imagex capture for more information. As a + * special case, if @p chunk_size is specified as 0, the chunk size is set + * to the default for the currently selected output compression type. * * @return 0 on success; nonzero on error. * * @retval ::WIMLIB_ERR_INVALID_CHUNK_SIZE - * @p ctype is not a supported chunk size. + * @p chunk_size is not a supported chunk size for the currently selected + * output compression type. */ extern int wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size); @@ -3407,7 +3435,7 @@ wimlib_set_output_compression_type(WIMStruct *wim, int ctype); * @ingroup G_writing_and_overwriting_wims * * Similar to wimlib_set_output_compression_type(), but set the compression type - * for writing packed streams. + * for writing packed streams (solid blocks). */ extern int wimlib_set_output_pack_compression_type(WIMStruct *wim, int ctype); @@ -3912,10 +3940,7 @@ wimlib_write_to_fd(WIMStruct *wim, * decompressors currently support sliding windows, and there also exist * slightly different variants of these formats that are not supported * unmodified. - */ - -/** - * @ingroup G_compression + * * @{ */ @@ -3974,10 +3999,11 @@ struct wimlib_lzx_compressor_params { uint32_t slow_reserved1 : 31; - /** Matches with length (in bytes) longer than this - * value are immediately taken without spending time on - * minimum-cost measurements. Suggested value: 32. */ - uint32_t num_fast_bytes; + /** 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 @@ -4020,6 +4046,42 @@ struct wimlib_lzx_compressor_params { } 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; + + /** Maximum number of potentially good matches to consider at each + * position. Suggested value: 3. */ + uint32_t max_matches_per_pos; + + /** 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; @@ -4041,6 +4103,8 @@ struct wimlib_decompressor; * * @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). @@ -4049,6 +4113,18 @@ extern int wimlib_set_default_compressor_params(enum wimlib_compression_type ctype, const struct wimlib_compressor_params_header *params); +/** + * 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. + */ +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); + /** * Allocate a compressor for the specified compression type using the specified * parameters. @@ -4206,55 +4282,9 @@ extern void wimlib_free_decompressor(struct wimlib_decompressor *decompressor); -struct wimlib_lzx_params_old; -struct wimlib_lzx_context_old; - -/** Deprecated; do not use. */ -extern int -wimlib_lzx_set_default_params(const struct wimlib_lzx_params_old *params) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern int -wimlib_lzx_alloc_context(const struct wimlib_lzx_params_old *params, - struct wimlib_lzx_context_old **ctx_pp) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern void -wimlib_lzx_free_context(struct wimlib_lzx_context_old *ctx) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern unsigned -wimlib_lzx_compress2(const void *udata, unsigned ulen, void *cdata, - struct wimlib_lzx_context_old *ctx) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern unsigned -wimlib_lzx_compress(const void *udata, unsigned ulen, void *cdata) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern unsigned -wimlib_xpress_compress(const void *udata, unsigned ulen, void *cdata) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern int -wimlib_lzx_decompress(const void *cdata, unsigned clen, - void *udata, unsigned ulen) - _wimlib_deprecated; - -/** Deprecated; do not use. */ -extern int -wimlib_xpress_decompress(const void *cdata, unsigned clen, - void *udata, unsigned ulen) - _wimlib_deprecated; - -/** @} */ - +/** + * @} + */ #ifdef __cplusplus