- ret = wimlib_add_image_multisource(w,
- capture_sources,
- num_sources,
- name,
- config,
- add_image_flags,
- imagex_progress_func);
- if (ret != 0)
- goto out_release_privs;
- cur_image = wimlib_get_num_images(w);
- if (desc) {
- ret = wimlib_set_image_descripton(w, cur_image, desc);
- if (ret != 0)
- goto out_release_privs;
- }
- if (flags_element) {
- ret = wimlib_set_image_flags(w, cur_image, flags_element);
- if (ret != 0)
- goto out_release_privs;
- }
- if (cmd == APPEND) {
- ret = wimlib_overwrite(w, write_flags, num_threads,
- imagex_progress_func);
- } else {
- ret = wimlib_write(w, wimfile, WIMLIB_ALL_IMAGES, write_flags,
- num_threads, imagex_progress_func);
- }
- if (ret != 0)
- imagex_error(T("Failed to write the WIM file \"%"TS"\""),
- wimfile);
-out_release_privs:
-#ifdef __WIN32__
- win32_release_capture_privileges();
-#endif
-out_wimlib_free:
- wimlib_free(w);
+ /* If capturing a delta WIM, reference resources from the base WIM
+ * before adding the new image. */
+ if (base_wimfile) {
+ ret = wimlib_open_wim(base_wimfile, open_flags,
+ &base_wim, imagex_progress_func);
+ if (ret)
+ goto out_free_wim;
+
+ imagex_printf(T("Capturing delta WIM based on \"%"TS"\"\n"),
+ base_wimfile);
+
+ ret = wimlib_reference_resources(wim, &base_wim, 1, 0);
+ if (ret)
+ goto out_free_base_wim;
+ } else {
+ base_wim = NULL;
+ }
+
+ /* If capturing or appending as an update of an existing (template) image,
+ * open the WIM if needed and parse the image index. */
+ if (template_image_name_or_num) {
+
+
+ if (template_wimfile == base_wimfile) {
+ template_wim = base_wim;
+ } else if (template_wimfile == wimfile) {
+ template_wim = wim;
+ } else {
+ ret = wimlib_open_wim(template_wimfile, open_flags,
+ &template_wim, imagex_progress_func);
+ if (ret)
+ goto out_free_base_wim;
+ }
+
+ template_image = wimlib_resolve_image(template_wim,
+ template_image_name_or_num);
+
+ if (template_image_name_or_num[0] == T('-')) {
+ tchar *tmp;
+ unsigned long n;
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+ n = tstrtoul(template_image_name_or_num + 1, &tmp, 10);
+ if (n >= 1 && n <= info.image_count &&
+ *tmp == T('\0') &&
+ tmp != template_image_name_or_num + 1)
+ {
+ template_image = info.image_count - (n - 1);
+ }
+ }
+ ret = verify_image_exists_and_is_single(template_image,
+ template_image_name_or_num,
+ template_wimfile);
+ if (ret)
+ goto out_free_template_wim;
+ } else {
+ template_wim = NULL;
+ }
+
+ ret = wimlib_add_image_multisource(wim,
+ capture_sources,
+ num_sources,
+ name,
+ config,
+ add_image_flags,
+ imagex_progress_func);
+ if (ret)
+ goto out_free_template_wim;
+
+ if (desc || flags_element || template_image_name_or_num) {
+ /* User provided <DESCRIPTION> or <FLAGS> element, or an image
+ * on which the added one is to be based has been specified with
+ * --update-of. Get the index of the image we just
+ * added, then use it to call the appropriate functions. */
+ struct wimlib_wim_info info;
+
+ wimlib_get_wim_info(wim, &info);
+
+ if (desc) {
+ ret = wimlib_set_image_descripton(wim,
+ info.image_count,
+ desc);
+ if (ret)
+ goto out_free_template_wim;
+ }
+
+ if (flags_element) {
+ ret = wimlib_set_image_flags(wim, info.image_count,
+ flags_element);
+ if (ret)
+ goto out_free_template_wim;
+ }
+
+ /* Reference template image if the user provided one. */
+ if (template_image_name_or_num) {
+ imagex_printf(T("Using image %d "
+ "from \"%"TS"\" as template\n"),
+ template_image, template_wimfile);
+ ret = wimlib_reference_template_image(wim,
+ info.image_count,
+ template_wim,
+ template_image,
+ 0, NULL);
+ if (ret)
+ goto out_free_template_wim;
+ }
+ }
+
+ /* Write the new WIM or overwrite the existing WIM with the new image
+ * appended. */
+ if (cmd == CMD_APPEND) {
+ ret = wimlib_overwrite(wim, write_flags, num_threads,
+ imagex_progress_func);
+ } else if (wimfile) {
+ ret = wimlib_write(wim, wimfile, WIMLIB_ALL_IMAGES,
+ write_flags, num_threads,
+ imagex_progress_func);
+ } else {
+ ret = wimlib_write_to_fd(wim, wim_fd, WIMLIB_ALL_IMAGES,
+ write_flags, num_threads,
+ imagex_progress_func);
+ }
+out_free_template_wim:
+ /* template_wim may alias base_wim or wim. */
+ if (template_wim != base_wim && template_wim != wim)
+ wimlib_free(template_wim);
+out_free_base_wim:
+ wimlib_free(base_wim);
+out_free_wim:
+ wimlib_free(wim);