X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib.h;h=9c8239aa0c47ff95d99b489c5e6bf614d5258a9d;hp=b7a21cf443ecb078c0b7694cfd7bc6164f828b89;hb=2373daf5bfb881b29bd2712c322c0e7c70ecc1ca;hpb=4b8dbcb1723bacdd692ea57184cb49ce3d2b7774 diff --git a/include/wimlib.h b/include/wimlib.h index b7a21cf4..9c8239aa 100644 --- a/include/wimlib.h +++ b/include/wimlib.h @@ -200,6 +200,13 @@ typedef char wimlib_tchar; # define WIMLIB_WIM_PATH_SEPARATOR '/' # define WIMLIB_WIM_PATH_SEPARATOR_STRING "/" #endif + +#ifdef __GNUC__ +# define _wimlib_deprecated __attribute__((deprecated)) +#else +# define _wimlib_deprecated +#endif + /** * Specifies the compression type of a WIM file. */ @@ -615,6 +622,97 @@ struct wimlib_capture_config { 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 @a info parameter. This + * is distinct from basic file permissions; this flag can be set on a WIM file + * that is physically writable. If this flag is set, all further operations to + * modify the WIM will fail, except calling wimlib_overwrite() with + * ::WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG specified, which is a loophole that + * allows you to set this flag persistently on the underlying WIM file. + */ +#define WIMLIB_CHANGE_READONLY_FLAG 0x00000001 + +/** Set the GUID (globally unique identifier) of the WIM file to the value + * specified in ::wimlib_wim_info.guid of the @a info parameter. */ +#define WIMLIB_CHANGE_GUID 0x00000002 + +/** Change the bootable image of the WIM to the value specified in + * ::wimlib_wim_info.boot_index of the @a info parameter. */ +#define WIMLIB_CHANGE_BOOT_INDEX 0x00000004 + +/** Change the WIM_HDR_FLAG_RP_FIX flag of the WIM file to the value specified + * in ::wimlib_wim_info.has_rpfix of the @a info parameter. This flag generally + * indicates whether an image in the WIM has been captured with reparse-point + * fixups enabled. wimlib also treats this flag as specifying whether to do + * reparse-point fixups by default when capturing or applying WIM images. */ +#define WIMLIB_CHANGE_RPFIX_FLAG 0x00000008 + +#define WIMLIB_GUID_LEN 16 + +/** General information about a WIM file. */ +struct wimlib_wim_info { + + /** Globally unique identifier for the WIM file. Note: all parts of a + * split WIM should have an identical value in this field. */ + uint8_t guid[WIMLIB_GUID_LEN]; + + /** Number of images in the WIM. */ + uint32_t image_count; + + /** 1-based index of the bootable image in the WIM, or 0 if no image is + * bootable. */ + uint32_t boot_index; + + /** Version of the WIM file. */ + uint32_t wim_version; + + /** Chunk size used for compression. */ + uint32_t chunk_size; + + /** 1-based index of this part within a split WIM, or 1 if the WIM is + * standalone. */ + uint16_t part_number; + + /** Total number of parts in the split WIM, or 1 if the WIM is + * standalone. */ + uint16_t total_parts; + + /** One of the ::wimlib_compression_type values that specifies the + * method used to compress resources in the WIM. */ + int32_t compression_type; + + /** Size of the WIM file in bytes, excluding the XML data and integrity + * table. */ + uint64_t total_bytes; + + /** 1 if the WIM has an integrity table */ + uint32_t has_integrity_table : 1; + + /** 1 if the WIM was created via wimlib_open_wim() rather than + * wimlib_create_new_wim(). */ + uint32_t opened_from_file : 1; + + /** 1 if the WIM is considered readonly for any reason. */ + uint32_t is_readonly : 1; + + /** 1 if reparse-point fixups are supposedly enabled for one or more + * images in the WIM. */ + uint32_t has_rpfix : 1; + + /** 1 if the WIM is marked as read-only. */ + uint32_t is_marked_readonly : 1; + + /** 1 if the WIM is part of a spanned set. */ + uint32_t spanned : 1; + + uint32_t write_in_progress : 1; + uint32_t metadata_only : 1; + uint32_t resource_only : 1; + uint32_t reserved_flags : 24; + uint32_t reserved[9]; +}; + /***************************** * WIMLIB_ADD_FLAG_* @@ -805,12 +903,24 @@ struct wimlib_capture_config { * WIMLIB_OPEN_FLAG_* ******************************/ -/** Verify the WIM contents against the WIM's integrity table, if present. */ +/** Verify the WIM contents against the WIM's integrity table, if present. This + * causes the raw data of the WIM file, divided into 10 MB chunks, to be + * checksummed and checked against the SHA1 message digests specified in the + * integrity table. WIMLIB_ERR_INTEGRITY is returned if there are any + * mismatches. */ #define WIMLIB_OPEN_FLAG_CHECK_INTEGRITY 0x00000001 -/** Do not issue an error if the WIM is part of a split WIM. */ +/** Do not issue an error if the WIM is part of a split WIM. */ #define WIMLIB_OPEN_FLAG_SPLIT_OK 0x00000002 +/** Check if the WIM is writable and return ::WIMLIB_ERR_WIM_IS_READONLY if it + * is not. A WIM is considered writable only if it is writable at the + * filesystem level, does not have the WIM_HDR_FLAG_READONLY flag set in its + * header, and is not part of a spanned set. It is not required to provide this + * flag to make changes to the WIM, but with this flag you get the error sooner + * rather than later. */ +#define WIMLIB_OPEN_FLAG_WRITE_ACCESS 0x00000004 + /****************************** * WIMLIB_UNMOUNT_FLAG_* ******************************/ @@ -870,6 +980,12 @@ struct wimlib_capture_config { * deleting an image in this way. */ #define WIMLIB_WRITE_FLAG_SOFT_DELETE 0x00000010 +/** With wimlib_overwrite(), allow overwriting the WIM even if the readonly flag + * is set in the WIM header; this can be used in combination with + * wimlib_set_wim_info() with the ::WIMLIB_CHANGE_READONLY_FLAG flag to actually + * set the readonly flag on the on-disk WIM file. */ +#define WIMLIB_WRITE_FLAG_IGNORE_READONLY_FLAG 0x00000020 + /****************************** * WIMLIB_INIT_FLAG_* ******************************/ @@ -1022,7 +1138,8 @@ enum wimlib_error_code { WIMLIB_ERR_VOLUME_LACKS_FEATURES, WIMLIB_ERR_WRITE, WIMLIB_ERR_XML, - WIMLIB_ERR_WIM_IS_MARKED_READONLY, + WIMLIB_ERR_WIM_IS_READONLY, + WIMLIB_ERR_RESOURCE_NOT_FOUND, }; @@ -1050,12 +1167,14 @@ enum wimlib_error_code { * * @return 0 on success; nonzero on failure. The possible error codes are: * - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. * @retval ::WIMLIB_ERR_IMAGE_NAME_COLLISION * There is already an image in @a wim named @a name. * @retval ::WIMLIB_ERR_NOMEM * Failed to allocate the memory needed to add the new image. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * The WIM file is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. */ extern int wimlib_add_empty_image(WIMStruct *wim, @@ -1203,9 +1322,10 @@ wimlib_create_new_wim(int ctype, WIMStruct **wim_ret); * Failed to allocate needed memory. * @retval ::WIMLIB_ERR_READ * Could not read the metadata resource for @a image from the WIM. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. Deleting an image from a split WIM is - * unsupported. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * The WIM file is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. */ extern int wimlib_delete_image(WIMStruct *wim, int image); @@ -1306,9 +1426,10 @@ wimlib_delete_image(WIMStruct *wim, int image); * complete split WIM because they do not include all the parts of the * original WIM, there are duplicate parts, or not all the parts have the * same GUID and compression type. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a dest_wim is part of a split WIM. Exporting an image to a split WIM - * is unsupported. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * @a dest_wim is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. */ extern int wimlib_export_image(WIMStruct *src_wim, int src_image, @@ -1502,6 +1623,10 @@ wimlib_extract_files(WIMStruct *wim, * @retval ::WIMLIB_ERR_READ * A unexpected end-of-file or read error occurred when trying to read data * from the WIM file associated with @a wim. + * @retval ::WIMLIB_ERR_RESOURCE_NOT_FOUND + * One of the dentries in the image referenced a stream not present in the + * WIM's lookup table (or in any of the lookup tables of the split WIM + * parts). * @retval ::WIMLIB_ERR_SPLIT_INVALID * The WIM is a split WIM, but the parts specified do not form a complete * split WIM because they do not include all the parts of the original WIM, @@ -1558,30 +1683,16 @@ extern void wimlib_free(WIMStruct *wim); /** - * Returns the index of the bootable image of the WIM. - * - * @param wim - * Pointer to the ::WIMStruct for a WIM file. - * - * @return - * 0 if no image is marked as bootable, or the number of the image marked - * as bootable (numbered starting at 1). + * Deprecated in favor of wimlib_get_wim_info(). */ extern int -wimlib_get_boot_idx(const WIMStruct *wim); +wimlib_get_boot_idx(const WIMStruct *wim) _wimlib_deprecated; /** - * Returns the compression type used in the WIM. - * - * @param wim - * Pointer to the ::WIMStruct for a WIM file - * - * @return - * ::WIMLIB_COMPRESSION_TYPE_NONE, ::WIMLIB_COMPRESSION_TYPE_LZX, or - * ::WIMLIB_COMPRESSION_TYPE_XPRESS. + * Deprecated in favor of wimlib_get_wim_info(). */ extern int -wimlib_get_compression_type(const WIMStruct *wim); +wimlib_get_compression_type(const WIMStruct *wim) _wimlib_deprecated; /** * Converts a ::wimlib_compression_type value into a string. @@ -1653,33 +1764,31 @@ wimlib_get_image_name(const WIMStruct *wim, int image); /** - * Returns the number of images contained in a WIM. - * - * @param wim - * Pointer to the ::WIMStruct for a WIM file. It may be either a - * standalone WIM or a split WIM part. - * - * @return - * The number of images contained in the WIM file. + * Deprecated in favor of wimlib_get_wim_info(). + */ +extern int +wimlib_get_num_images(const WIMStruct *wim) _wimlib_deprecated; + +/** + * Deprecated in favor of wimlib_get_wim_info(). */ extern int -wimlib_get_num_images(const WIMStruct *wim); +wimlib_get_part_number(const WIMStruct *wim, int *total_parts_ret) _wimlib_deprecated; /** - * Returns the part number of a WIM in a split WIM and the total number of parts - * of the split WIM. + * Get basic information about a WIM file. * * @param wim - * Pointer to the ::WIMStruct for a WIM file. - * @param total_parts_ret - * If non-@c NULL, the total number of parts in the split WIM (1 for - * non-split WIMs) is written to this location. - * + * Pointer to the ::WIMStruct for a WIM file. It may be for either a + * standalone WIM or part of a split WIM. + * @param info + * A ::wimlib_wim_info structure that will be filled in with information + * about the WIM file. * @return - * The part number of the WIM (1 for non-split WIMs) + * 0 */ extern int -wimlib_get_part_number(const WIMStruct *wim, int *total_parts_ret); +wimlib_get_wim_info(WIMStruct *wim, struct wimlib_wim_info *info); /** * Initialization function for wimlib. Call before using any other wimlib @@ -1758,7 +1867,7 @@ wimlib_image_name_in_use(const WIMStruct *wim, const wimlib_tchar *name); * * @return 0 on success; nonzero on error. This function may return any value * returned by wimlib_open_wim() and wimlib_write() except - * ::WIMLIB_ERR_SPLIT_UNSUPPORTED, as well as the following error code: + * ::WIMLIB_ERR_WIM_IS_READONLY, as well as the following error code: * * @retval ::WIMLIB_ERR_SPLIT_INVALID * The split WIMs do not form a valid WIM because they do not include all @@ -1921,14 +2030,19 @@ wimlib_lzx_decompress(const void *compressed_data, unsigned compressed_len, * @retval ::WIMLIB_ERR_READ * An unexpected end-of-file or read error occurred when trying to read * data from the WIM file associated with @a wim. + * @retval ::WIMLIB_ERR_RESOURCE_NOT_FOUND + * One of the dentries in the image referenced a stream not present in the + * WIM's lookup table (or in any of the lookup tables of the split WIM + * parts). * @retval ::WIMLIB_ERR_SPLIT_INVALID * The WIM is a split WIM, but the parts specified do not form a complete * split WIM because they do not include all the parts of the original WIM, * there are duplicate parts, or not all the parts have the same GUID and * compression type. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * The WIM is a split WIM and a read-write mount was requested. We only - * support mounting a split WIM read-only. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * ::WIMLIB_MOUNT_FLAG_READWRITE was specified in @a mount_flags, but @a + * wim is considered read-only because of any of the reasons mentioned in + * the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS flag. * @retval ::WIMLIB_ERR_UNSUPPORTED * Mounting is not supported, either because the platform is Windows, or * because the platform is UNIX and wimlib was compiled with @c @@ -1950,18 +2064,7 @@ wimlib_mount_image(WIMStruct *wim, * The path to the WIM file to open. * @param open_flags * Bitwise OR of flags ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY and/or - * ::WIMLIB_OPEN_FLAG_SPLIT_OK. - *

- * If ::WIMLIB_OPEN_FLAG_CHECK_INTEGRITY is given, the integrity table of - * the WIM, if it exists, is checked, and this function will fail with an - * ::WIMLIB_ERR_INTEGRITY status if any of the computed SHA1 message - * digests of the WIM do not exactly match the corresponding message - * digests given in the integrity table. - *

- * If ::WIMLIB_OPEN_FLAG_SPLIT_OK is given, no error will be issued if the - * WIM is part of a split WIM; otherwise ::WIMLIB_ERR_SPLIT_UNSUPPORTED is - * returned. (This flag may be removed in the future, in which case no - * error will be issued when opening a split WIM.) + * ::WIMLIB_OPEN_FLAG_SPLIT_OK and/or ::WIMLIB_OPEN_FLAG_WRITE_ACCESS. * * @param progress_func * If non-NULL, a function that will be called periodically with the @@ -2018,6 +2121,10 @@ wimlib_mount_image(WIMStruct *wim, * @retval ::WIMLIB_ERR_UNKNOWN_VERSION * A number other than 0x10d00 is written in the version field of the WIM * header of @a wim_file. (Probably a pre-Vista WIM). + * @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 + * documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS flag. * @retval ::WIMLIB_ERR_XML * The XML data for @a wim_file is invalid. */ @@ -2086,7 +2193,7 @@ wimlib_open_wim(const wimlib_tchar *wim_file, * @return 0 on success; nonzero on error. This function may return any value * returned by wimlib_write() as well as the following error codes: * @retval ::WIMLIB_ERR_ALREADY_LOCKED - * The WIM was going to be modifien in-place (with no temporary file), but + * The WIM was going to be modified in-place (with no temporary file), but * an exclusive advisory lock on the on-disk WIM file could not be acquired * because another thread or process has mounted an image from the WIM * read-write or is currently modifying the WIM in-place. @@ -2096,6 +2203,10 @@ wimlib_open_wim(const wimlib_tchar *wim_file, * @retval ::WIMLIB_ERR_RENAME * The temporary file that the WIM was written to could not be renamed to * the original filename of @a wim. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * The WIM file is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. */ extern int wimlib_overwrite(WIMStruct *wim, int write_flags, unsigned num_threads, @@ -2264,22 +2375,10 @@ wimlib_resolve_image(WIMStruct *wim, const wimlib_tchar *image_name_or_num); /** - * Sets which image in the WIM is marked as bootable. - * - * @param wim - * Pointer to the ::WIMStruct for a WIM file. - * @param boot_idx - * The number of the image to mark as bootable, or 0 to mark no image as - * bootable. - * @return 0 on success; nonzero on error. - * @retval ::WIMLIB_ERR_INVALID_IMAGE - * @a boot_idx does not specify an existing image in @a wim, and it was not - * 0. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. + * Deprecated in favor of wimlib_set_wim_info(). */ extern int -wimlib_set_boot_idx(WIMStruct *wim, int boot_idx); +wimlib_set_boot_idx(WIMStruct *wim, int boot_idx) _wimlib_deprecated; /** * Changes the description of an image in the WIM. @@ -2300,13 +2399,44 @@ wimlib_set_boot_idx(WIMStruct *wim, int boot_idx); * @retval ::WIMLIB_ERR_NOMEM * Failed to allocate the memory needed to duplicate the @a description * string. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * @a wim is considered read-only because of any of the reasons mentioned + * in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS flag. */ extern int wimlib_set_image_descripton(WIMStruct *wim, int image, const wimlib_tchar *description); +/** + * Set basic information about a WIM. + * + * @param wim + * A WIMStruct for a standalone WIM file. + * @param info + * A struct ::wimlib_wim_info that contains the information to set. Only + * the information explicitly specified in the @a which flags need be + * valid. + * @param which + * Flags that specify which information to set. This is a bitwise OR of + * ::WIMLIB_CHANGE_READONLY_FLAG, ::WIMLIB_CHANGE_GUID, + * ::WIMLIB_CHANGE_BOOT_INDEX, and/or ::WIMLIB_CHANGE_RPFIX_FLAG. + * + * @return 0 on success; nonzero on failure. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * The WIM file is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. However, as a special case, if you are using + * ::WIMLIB_CHANGE_READONLY_FLAG to unset the readonly flag, then this + * function will not fail due to the readonly flag being previously set. + * @retval ::WIMLIB_ERR_IMAGE_COUNT + * ::WIMLIB_CHANGE_BOOT_INDEX was specified, but + * ::wimlib_wim_info.boot_index did not specify 0 or a valid 1-based image + * index in the WIM. + */ +extern int +wimlib_set_wim_info(WIMStruct *wim, const struct wimlib_wim_info *info, + int which); + /** * Changes what is written in the \ element in the WIM XML data * (something like "Core" or "Ultimate") @@ -2326,11 +2456,12 @@ wimlib_set_image_descripton(WIMStruct *wim, int image, * @a image does not specify a single existing image in @a wim. * @retval ::WIMLIB_ERR_NOMEM * Failed to allocate the memory needed to duplicate the @a flags string. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * @a wim is considered read-only because of any of the reasons mentioned + * in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS flag. */ -extern int wimlib_set_image_flags(WIMStruct *wim, int image, - const wimlib_tchar *flags); +extern int +wimlib_set_image_flags(WIMStruct *wim, int image, const wimlib_tchar *flags); /** * Changes the name of an image in the WIM. @@ -2353,8 +2484,9 @@ extern int wimlib_set_image_flags(WIMStruct *wim, int image, * @a image does not specify a single existing image in @a wim. * @retval ::WIMLIB_ERR_NOMEM * Failed to allocate the memory needed to duplicate the @a name string. - * @retval ::WIMLIB_ERR_SPLIT_UNSUPPORTED - * @a wim is part of a split WIM. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * @a wim is considered read-only because of any of the reasons mentioned + * in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS flag. */ extern int wimlib_set_image_name(WIMStruct *wim, int image, const wimlib_tchar *name); @@ -2623,6 +2755,10 @@ wimlib_unmount_image(const wimlib_tchar *dir, * or, the platform is Windows and either the ::WIMLIB_ADD_FLAG_UNIX_DATA * or the ::WIMLIB_ADD_FLAG_DEREFERENCE flags were specified in the @a * add_flags for an update command. + * @retval ::WIMLIB_ERR_WIM_IS_READONLY + * The WIM file is considered read-only because of any of the reasons + * mentioned in the documentation for the ::WIMLIB_OPEN_FLAG_WRITE_ACCESS + * flag. */ extern int wimlib_update_image(WIMStruct *wim,