]> wimlib.net Git - wimlib/blobdiff - src/win32_apply.c
read_wim_header(): Check return value of lseek()
[wimlib] / src / win32_apply.c
index df42653cd475176311237bfd28d9354b6548d796..c0487c62445e6b4d23e0e517c07dca689416a087 100644 (file)
@@ -96,7 +96,7 @@ struct win32_apply_ctx {
        struct reparse_buffer_disk rpbuf;
 
        /* Temporary buffer for reparse data of "fixed" absolute symbolic links
-        * and junction  */
+        * and junctions  */
        struct reparse_buffer_disk rpfixbuf;
 
        /* Array of open handles to filesystem streams currently being written
@@ -235,7 +235,7 @@ win32_get_supported_features(const wchar_t *target,
        return 0;
 }
 
-/* Load the patterns from [PrepopulateList] of WimBootCompresse.ini in the WIM
+/* Load the patterns from [PrepopulateList] of WimBootCompress.ini in the WIM
  * image being extracted.  */
 static int
 load_prepopulate_pats(struct win32_apply_ctx *ctx)
@@ -325,8 +325,7 @@ start_wimboot_extraction(struct win32_apply_ctx *ctx)
        if (ret == WIMLIB_ERR_NOMEM)
                return ret;
 
-       if (!wim_info_get_wimboot(wim->wim_info,
-                                 wim->current_image))
+       if (!wim_info_get_wimboot(wim->wim_info, wim->current_image))
                WARNING("Image is not marked as WIMBoot compatible!");
 
        ret = hash_lookup_table(ctx->common.wim,
@@ -334,6 +333,20 @@ start_wimboot_extraction(struct win32_apply_ctx *ctx)
        if (ret)
                return ret;
 
+       /* TODO: DISM seems to set HKEY_LOCAL_MACHINE\SOFTWARE\Setup
+        * "WimBoot"=dword:00000001 in the registry of the extracted image.  Do
+        * we need to do this too?  I'd really prefer not to be mucking around
+        * with the extracted files, and certainly not the registry...
+        *
+        * It changed two other keys as well:
+        *
+        * [HKEY_LOCAL_MACHINE\SOFTWARE\ControlSet001\Control\ProductOptions]
+        *         value "ProductPolicy"
+        *
+        * [HKEY_LOCAL_MACHINE\SOFTWARE\ControlSet001\Control\SessionManager\AppCompatCache]
+        *         value "AppCompatCache"
+        */
+
        return wimboot_alloc_data_source_id(wim->filename,
                                            wim->hdr.guid,
                                            wim->current_image,
@@ -366,7 +379,7 @@ dentry_extraction_path_length(const struct wim_dentry *dentry)
  *
  * If the inode has no named data streams, this will be 0.  Otherwise, this will
  * be 1 plus the length of the longest-named data stream, since the data stream
- * name must be separated form the path by the ':' character.  */
+ * name must be separated from the path by the ':' character.  */
 static size_t
 inode_longest_named_data_stream_spec(const struct wim_inode *inode)
 {
@@ -663,7 +676,7 @@ adjust_compression_attribute(HANDLE h, const struct wim_dentry *dentry,
  * handle to the file.  If it does, it sets it to NULL.
  */
 static int
-maybe_clear_encryption_attribute(HANDLE *h_ret, const struct wim_dentry *dentry,
+maybe_clear_encryption_attribute(HANDLE *h_ptr, const struct wim_dentry *dentry,
                                 struct win32_apply_ctx *ctx)
 {
        if (dentry->d_inode->i_attributes & FILE_ATTRIBUTE_ENCRYPTED)
@@ -680,7 +693,7 @@ maybe_clear_encryption_attribute(HANDLE *h_ret, const struct wim_dentry *dentry,
        BOOL bret;
 
        /* Get current attributes  */
-       status = (*func_NtQueryInformationFile)(*h_ret, &ctx->iosb,
+       status = (*func_NtQueryInformationFile)(*h_ptr, &ctx->iosb,
                                                &info, sizeof(info),
                                                FileBasicInformation);
        if (NT_SUCCESS(status) &&
@@ -696,8 +709,8 @@ maybe_clear_encryption_attribute(HANDLE *h_ret, const struct wim_dentry *dentry,
         * handle to the file so we don't get ERROR_SHARING_VIOLATION.  We also
         * hack together a Win32 path, although we will use the \\?\ prefix so
         * it will actually be a NT path in disguise...  */
-       (*func_NtClose)(*h_ret);
-       *h_ret = NULL;
+       (*func_NtClose)(*h_ptr);
+       *h_ptr = NULL;
 
        build_win32_extraction_path(dentry, ctx);
 
@@ -950,7 +963,7 @@ create_directories(struct list_head *dentry_list,
                 * wait until later to actually set the reparse data.  */
 
                /* If the root dentry is being extracted, it was already done so
-                * it prepare_target().  */
+                * in prepare_target().  */
                if (dentry_is_root(dentry))
                        continue;
 
@@ -961,6 +974,10 @@ create_directories(struct list_head *dentry_list,
                ret = create_any_empty_ads(dentry, ctx);
                if (ret)
                        return ret;
+
+               ret = report_file_created(&ctx->common);
+               if (ret)
+                       return ret;
        }
        return 0;
 }
@@ -1208,6 +1225,9 @@ create_nondirectories(struct list_head *dentry_list, struct win32_apply_ctx *ctx
                ret = create_nondirectory(inode, ctx);
                if (ret)
                        return ret;
+               ret = report_file_created(&ctx->common);
+               if (ret)
+                       return ret;
        }
        return 0;
 }
@@ -1971,6 +1991,9 @@ apply_metadata(struct list_head *dentry_list, struct win32_apply_ctx *ctx)
                ret = apply_metadata_to_file(dentry, ctx);
                if (ret)
                        return ret;
+               ret = report_file_metadata_applied(&ctx->common);
+               if (ret)
+                       return ret;
        }
        return 0;
 }
@@ -2018,6 +2041,8 @@ win32_extract(struct list_head *dentry_list, struct apply_ctx *_ctx)
                        goto out;
        }
 
+       reset_file_progress(&ctx->common);
+
        ret = create_directories(dentry_list, ctx);
        if (ret)
                goto out;
@@ -2038,6 +2063,8 @@ win32_extract(struct list_head *dentry_list, struct apply_ctx *_ctx)
        if (ret)
                goto out;
 
+       reset_file_progress(&ctx->common);
+
        ret = apply_metadata(dentry_list, ctx);
        if (ret)
                goto out;