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;
}
* 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(¶ms->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,
&& (vol_flags & FILE_PERSISTENT_ACLS))
{
ret = win32_get_security_descriptor(hFile, path, inode,
- ¶ms->sd_set, state,
+ params->sd_set, state,
params->add_flags);
if (ret)
goto out;
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)