]> wimlib.net Git - wimlib/blobdiff - src/win32_capture.c
update_image.c: Check for unsupported NTFS mode earlier
[wimlib] / src / win32_capture.c
index 6f748a36a757522c5533fec97541c9f3906945ec..c62abce7c91c175a21bb8882232b0f87cde913b7 100644 (file)
@@ -1141,12 +1141,10 @@ win32_build_dentry_tree_recursive(struct wim_dentry **root_ret,
        DWORD desiredAccess;
 
 
-       if (exclude_path(path, path_num_chars, params->config, true)) {
-               if (params->add_flags & WIMLIB_ADD_FLAG_ROOT) {
-                       ERROR("Cannot exclude the root directory from capture");
-                       ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
-                       goto out;
-               }
+       if (exclude_path(path + params->capture_root_nchars,
+                        path_num_chars - params->capture_root_nchars,
+                        params->config))
+       {
                ret = 0;
                goto out_progress;
        }
@@ -1218,7 +1216,7 @@ again:
         * 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. */
-       ret = inode_table_new_dentry(&params->inode_table,
+       ret = inode_table_new_dentry(params->inode_table,
                                     path_basename_with_len(path, path_num_chars),
                                     ((u64)file_info.nFileIndexHigh << 32) |
                                         (u64)file_info.nFileIndexLow,
@@ -1252,7 +1250,7 @@ again:
            && (vol_flags & FILE_PERSISTENT_ACLS))
        {
                ret = win32_get_security_descriptor(hFile, path, inode,
-                                                   &params->sd_set, state,
+                                                   params->sd_set, state,
                                                    params->add_flags);
                if (ret)
                        goto out;
@@ -1413,32 +1411,22 @@ win32_build_dentry_tree(struct wim_dentry **root_ret,
                wmemcpy(path, root_disk_path, path_nchars + 1);
        }
 
-       /* Strip trailing slashes.  */
+       /* Strip trailing slashes.  If we don't do this, we may create a path
+       * with multiple consecutive backslashes, which for some reason causes
+       * Windows to report that the file cannot be found.  */
        while (path_nchars >= 2 &&
-              is_any_path_separator(path[path_nchars - 1]) &&
+              path[path_nchars - 1] == L'\\' &&
               path[path_nchars - 2] != L':')
        {
                path[--path_nchars] = L'\0';
        }
 
-       /* Update pattern prefix.  */
-       if (params->config != NULL)
-       {
-               params->config->prefix = TSTRDUP(path);
-               params->config->prefix_num_tchars = path_nchars;
-               if (params->config->prefix == NULL)
-               {
-                       ret = WIMLIB_ERR_NOMEM;
-                       goto out_free_path;
-               }
-       }
+       params->capture_root_nchars = path_nchars;
 
        memset(&state, 0, sizeof(state));
        ret = win32_build_dentry_tree_recursive(root_ret, path,
                                                path_nchars, params,
                                                &state, vol_flags);
-       if (params->config != NULL)
-               FREE(params->config->prefix);
 out_free_path:
        FREE(path);
        if (ret == 0)