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;
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];
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
}
/* 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
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? */
* 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)),
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;