X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=b95fc71976e7413293409ca6d44863ee4562fb70;hp=c0aaf13bf2f46bb103976c7a0d2c2adb08e5b1dd;hb=5ede6282b6f28fcd71d6eb556dae69e83d925e11;hpb=e014475fba041d91e3977fe64298c6a2cbe8195e diff --git a/include/wimlib.h b/include/wimlib.h index c0aaf13b..b95fc719 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" { @@ -397,6 +392,15 @@ typedef char wimlib_tchar; # define WIMLIB_WIM_PATH_SEPARATOR_STRING "/" #endif +/** Use this to specify the root directory of the WIM image. */ +#define WIMLIB_WIM_ROOT_PATH WIMLIB_WIM_PATH_SEPARATOR_STRING + +/** Use this to test if the specified path refers to the root directory of the + * WIM image. */ +#define WIMLIB_IS_WIM_ROOT_PATH(path) \ + ((path)[0] == WIMLIB_WIM_PATH_SEPARATOR && \ + (path)[1] == 0) + #ifdef __GNUC__ # define _wimlib_deprecated __attribute__((deprecated)) #else @@ -415,11 +419,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,91 +441,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 ("streams") are currently being written to the WIM. - * @p info will point to ::wimlib_progress_info.write_streams. */ + * @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. */ @@ -529,25 +555,39 @@ 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, + /** A file in the WIM image is being replaced as a result of a + * ::wimlib_add_command without ::WIMLIB_ADD_FLAG_NO_REPLACE specified. + * @p info will point to ::wimlib_progress_info.replace. This is only + * received when ::WIMLIB_ADD_FLAG_VERBOSE is also specified in the add + * command. */ + WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM, + + /** A WIM image is being applied with ::WIMLIB_EXTRACT_FLAG_WIMBOOT, and + * a file is being extracted normally (not as a WIMBoot "pointer file") + * due to it matching a pattern in the [PrepopulateList] section of the + * configuration file \Windows\System32\WimBootCompress.ini in the WIM + * image. @info will point to ::wimlib_progress_info.wimboot_exclude. + */ + WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE, }; /** A pointer to this union is passed to the user-supplied @@ -631,11 +671,10 @@ union wimlib_progress_info { int32_t compression_type; /** Number of split WIM parts from which streams are being - * written (may be 0 if irrelevant). */ + * written (may be 0 if irrelevant). */ uint32_t total_parts; - /** Number of split WIM parts from which streams have been - * written (may be 0 if irrelevant). */ + /** This is currently broken and will always be 0. */ uint32_t completed_parts; } write_streams; @@ -681,15 +720,12 @@ union wimlib_progress_info { union { /** Target path in the WIM image. Only valid on * messages ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN and - * ::WIMLIB_PROGRESS_MSG_SCAN_END. If capturing a full - * image, this will be the empty string; otherwise it - * will name the place in the WIM image at which the - * directory tree is being added. */ + * ::WIMLIB_PROGRESS_MSG_SCAN_END. */ 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; }; @@ -754,14 +790,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 @@ -801,19 +838,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. */ - const wimlib_tchar *extract_root_wim_source_path; + /** Reserved. */ + const wimlib_tchar *reserved_2; /** 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. */ @@ -899,6 +933,21 @@ union wimlib_progress_info { * finished (::WIMLIB_PROGRESS_MSG_SPLIT_END_PART). */ const wimlib_tchar *part_name; } split; + + /** Valid on messages ::WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM */ + struct wimlib_progress_info_replace { + /** Path to the file in the WIM image that is being replaced */ + const wimlib_tchar *path_in_wim; + } replace; + + /** Valid on messages ::WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE */ + struct wimlib_progress_info_wimboot_exclude { + /** Path to the file in the WIM image */ + const wimlib_tchar *path_in_wim; + + /** Path to which the file is being extracted */ + const wimlib_tchar *extraction_path; + } wimboot_exclude; }; /** A user-supplied function that will be called periodically during certain WIM @@ -924,55 +973,14 @@ struct wimlib_capture_source { * filesystem to be included in the WIM image. */ wimlib_tchar *fs_source_path; - /** Destination path in the WIM image. Leading and trailing slashes are - * ignored. The empty string or @c NULL means the root directory of the - * WIM image. */ + /** Destination path in the WIM image. Use ::WIMLIB_WIM_ROOT_PATH to + * specify the root directory of the WIM image. */ wimlib_tchar *wim_target_path; /** Reserved; set to 0. */ 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 @@ -1201,6 +1209,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 @@ -1285,7 +1294,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 @@ -1334,19 +1344,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 @@ -1354,6 +1358,36 @@ 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 + +/** + * If the add command involves adding a non-directory file to a location at + * which there already exists a nondirectory file in the WIM image, issue + * ::WIMLIB_ERR_INVALID_OVERLAY instead of replacing the file. This only has an + * effect when updating an existing image with wimlib_update_image(). + * This was the default behavior in wimlib v1.6.2 and earlier. + */ +#define WIMLIB_ADD_FLAG_NO_REPLACE 0x00002000 + #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 @@ -1367,6 +1401,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 @@ -1414,11 +1450,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. */ @@ -1434,31 +1472,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 @@ -1497,16 +1539,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 @@ -1514,6 +1554,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 * @{ */ @@ -1588,6 +1642,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 * @{ */ @@ -1734,16 +1793,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 /** @} */ @@ -1765,19 +1825,16 @@ enum wimlib_update_op { /** Data for a ::WIMLIB_UPDATE_OP_ADD operation. */ struct wimlib_add_command { - /** Filesystem path to the file or directory tree to - * add. */ + /** Filesystem path to the file or directory tree to add. */ wimlib_tchar *fs_source_path; - /** Path, specified from the root of the WIM image, at - * which to add the file or directory tree within the - * WIM image. */ + + /** Destination path in the WIM image. Use ::WIMLIB_WIM_ROOT_PATH to + * specify the root directory of the 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; @@ -1785,25 +1842,27 @@ struct wimlib_add_command { /** Data for a ::WIMLIB_UPDATE_OP_DELETE operation. */ struct wimlib_delete_command { - /** Path, specified from the root of the WIM image, for - * the file or directory tree within the WIM image to be - * deleted. */ + + /** Path, specified from the root of the WIM image, for the file or + * directory tree within the WIM image to be deleted. */ wimlib_tchar *wim_path; - /** Bitwise OR of WIMLIB_DELETE_FLAG_* flags. */ + + /** Bitwise OR of WIMLIB_DELETE_FLAG_* flags. */ int delete_flags; }; /** Data for a ::WIMLIB_UPDATE_OP_RENAME operation. */ struct wimlib_rename_command { - /** Path, specified from the root of the WIM image, for - * the source file or directory tree within the WIM - * image. */ + + /** Path, specified from the root of the WIM image, for the source file + * or directory tree within the WIM image. */ wimlib_tchar *wim_source_path; - /** Path, specified from the root of the WIM image, for - * the destination file or directory tree within the WIM - * image. */ + + /** Path, specified from the root of the WIM image, for the destination + * file or directory tree within the WIM image. */ wimlib_tchar *wim_target_path; - /** Reserved; set to 0. */ + + /** Reserved; set to 0. */ int rename_flags; }; @@ -1820,26 +1879,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 * @{ */ @@ -1926,6 +1965,7 @@ enum wimlib_error_code { WIMLIB_ERR_WRITE, WIMLIB_ERR_XML, WIMLIB_ERR_WIM_IS_ENCRYPTED, + WIMLIB_ERR_WIMBOOT, }; @@ -1935,6 +1975,8 @@ enum wimlib_error_code { /** Used to specify all images in the WIM. */ #define WIMLIB_ALL_IMAGES (-1) +/** @} */ + /** * @ingroup G_modifying_wims * @@ -2000,10 +2042,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 @@ -2027,7 +2074,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); @@ -2056,7 +2103,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); @@ -2069,9 +2116,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 @@ -2079,8 +2125,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. */ @@ -2223,78 +2268,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 @@ -2303,12 +2282,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 @@ -2317,51 +2290,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 @@ -2382,8 +2359,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 @@ -2395,21 +2371,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, @@ -2420,8 +2391,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. @@ -2446,17 +2417,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. @@ -2470,12 +2440,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 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. + * @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, @@ -2485,30 +2462,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, @@ -2566,12 +2596,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); @@ -2633,6 +2662,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 @@ -2905,7 +2947,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 @@ -2994,10 +3036,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 @@ -3005,9 +3047,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 @@ -3024,8 +3064,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 @@ -3146,15 +3188,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 * @@ -3383,25 +3416,23 @@ 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 and LZMS compression formats - * support 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. * @@ -3447,7 +3478,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); @@ -3733,9 +3764,9 @@ wimlib_unmount_image(const wimlib_tchar *dir, * If non-NULL, a function that will be called periodically with the * progress of the current operation. * - * @return 0 on success; nonzero on error. On failure, some but not all of the - * update commands may have been executed. No individual update command will - * have been partially executed. Possible error codes include: + * @return 0 on success; nonzero on error. On failure, all update commands will + * be rolled back, and no visible changes shall have been made to @p wim. + * Possible error codes include: * * @retval ::WIMLIB_ERR_INVALID_CAPTURE_CONFIG * The capture configuration structure specified for an add command was @@ -3952,10 +3983,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 + * * @{ */ @@ -4061,6 +4089,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; @@ -4082,6 +4146,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). @@ -4090,6 +4156,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. @@ -4247,55 +4325,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