sizeof(wchar_t));
if (!ads_entry)
return WIMLIB_ERR_NOMEM;
+ } else if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+ /* Ignore unnamed data stream of reparse point */
+ return 0;
} else {
ads_entry = NULL;
}
u16 rpbuflen;
u16 not_rpfixed;
- if (should_exclude_path(full_path + params->capture_root_nchars,
- full_path_nchars - params->capture_root_nchars,
- params->config))
+ ret = try_exclude(full_path, full_path_nchars, params);
+ if (ret < 0) /* Excluded? */
goto out_progress;
+ if (ret > 0) /* Error? */
+ goto out;
/* Open the file. */
status = winnt_openat(cur_dir,
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? */
int ret;
UNICODE_STRING ntpath;
struct winnt_scan_stats stats;
+ size_t ntpath_nchars;
/* WARNING: There is no check for overflow later when this buffer is
* being used! But it's as long as the maximum path length understood
{
ERROR("\"%ls\": unrecognized path format", root_disk_path);
ret = WIMLIB_ERR_INVALID_PARAM;
- goto out_free_path;
- }
-
- params->capture_root_nchars = ntpath.Length / sizeof(wchar_t);
- wmemcpy(path, ntpath.Buffer, params->capture_root_nchars);
- path[params->capture_root_nchars] = L'\0';
+ } else {
+ ntpath_nchars = ntpath.Length / sizeof(wchar_t);
+ wmemcpy(path, ntpath.Buffer, ntpath_nchars);
+ path[ntpath_nchars] = L'\0';
+ params->capture_root_nchars = ntpath_nchars;
+ if (path[ntpath_nchars - 1] == L'\\')
+ params->capture_root_nchars--;
+ ret = 0;
+ }
HeapFree(GetProcessHeap(), 0, ntpath.Buffer);
+ if (ret)
+ goto out_free_path;
memset(&stats, 0, sizeof(stats));
ret = winnt_build_dentry_tree_recursive(root_ret, NULL,
- path, params->capture_root_nchars,
+ path, ntpath_nchars,
L"", 0, params, &stats, 0);
out_free_path:
FREE(path);