]> wimlib.net Git - wimlib/blobdiff - src/win32_capture.c
win32_capture.c: Random cleanups
[wimlib] / src / win32_capture.c
index 71a593695d9630f038590c4793a8aba433092cac..e818eebc59c0253129d0d0a9d21f5312dc278be0 100644 (file)
@@ -224,7 +224,7 @@ read_win32_encrypted_file_prefix(const struct wim_lookup_table_entry *lte,
                        ret = WIMLIB_ERR_READ;
        } else if (export_ctx.bytes_remaining != 0) {
                ERROR("Only could read %"PRIu64" of %"PRIu64" bytes from "
-                     "encryted file \"%ls\"",
+                     "encrypted file \"%ls\"",
                      size - export_ctx.bytes_remaining, size,
                      printable_path(lte->file_on_disk));
                ret = WIMLIB_ERR_READ;
@@ -594,8 +594,7 @@ out_close_root_dir:
 
 static int
 winnt_rpfix_progress(struct add_image_params *params, const wchar_t *path,
-                    const struct reparse_data *rpdata,
-                    enum wimlib_progress_msg msg)
+                    const struct reparse_data *rpdata, int scan_status)
 {
        size_t print_name_nchars = rpdata->print_name_nbytes / sizeof(wchar_t);
        wchar_t print_name0[print_name_nchars + 1];
@@ -605,7 +604,7 @@ winnt_rpfix_progress(struct add_image_params *params, const wchar_t *path,
 
        params->progress.scan.cur_path = printable_path(path);
        params->progress.scan.symlink_target = print_name0;
-       return do_capture_progress(params, msg, NULL);
+       return do_capture_progress(params, scan_status, NULL);
 }
 
 static int
@@ -670,7 +669,7 @@ winnt_try_rpfix(u8 *rpbuf, u16 *rpbuflen_p,
        }
 
        /* We have an absolute target pointing within the directory being
-        * captured, @rel_target is the suffix of the link target that is the
+        * captured. @rel_target is the suffix of the link target that is the
         * part relative to the directory being captured.
         *
         * We will cut off the prefix before this part (which is the path to the
@@ -1123,7 +1122,10 @@ winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret,
                        ERROR_WITH_ERRNO("\"%ls\": Can't open file "
                                         "(status=0x%08"PRIx32")",
                                         printable_path(full_path), (u32)status);
-                       ret = WIMLIB_ERR_OPEN;
+                       if (status == STATUS_FVE_LOCKED_VOLUME)
+                               ret = WIMLIB_ERR_FVE_LOCKED_VOLUME;
+                       else
+                               ret = WIMLIB_ERR_OPEN;
                }
                /* XXX: Provide option to exclude files that fail with
                 * STATUS_SHARING_VIOLATION?  */
@@ -1234,13 +1236,17 @@ winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret,
         * However, we need to explicitly check for directories and files with
         * only 1 link and refuse to hard link them.  This is because Windows
         * has a bug where it can return duplicate File IDs for files and
-        * directories on the FAT filesystem. */
+        * directories on the FAT filesystem.
+        *
+        * Since we don't follow mount points on Windows, we don't need to query
+        * the volume ID per-file.  Just once, for the root, is enough.  But we
+        * can't simply pass 0, because then there could be inode collisions
+        * among multiple calls to win32_build_dentry_tree() that are scanning
+        * files on different volumes.  */
        ret = inode_table_new_dentry(params->inode_table,
                                     filename,
                                     file_info.InternalInformation.IndexNumber.QuadPart,
-                                    0, /* We don't follow mount points, so we
-                                          currently don't need to get the
-                                          volume ID / device number.  */
+                                    params->capture_root_dev,
                                     (file_info.StandardInformation.NumberOfLinks <= 1 ||
                                        (file_info.BasicInformation.FileAttributes &
                                         FILE_ATTRIBUTE_DIRECTORY)),
@@ -1285,7 +1291,7 @@ winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret,
                if (!NT_SUCCESS(status)) {
                        set_errno_from_nt_status(status);
                        ERROR_WITH_ERRNO("\"%ls\": Can't read security "
-                                        "descriptor (status=0x%08"PRIu32")",
+                                        "descriptor (status=0x%08"PRIx32")",
                                         printable_path(full_path),
                                         (u32)status);
                        ret = WIMLIB_ERR_STAT;