/*
* win32.c
*
- * All the library code specific to native Windows builds is in here.
+ * Most of the library code specific to native Windows builds is in here.
*/
/*
#define MAX_GET_SD_ACCESS_DENIED_WARNINGS 1
#define MAX_GET_SACL_PRIV_NOTHELD_WARNINGS 1
#define MAX_CREATE_HARD_LINK_WARNINGS 5
+#define MAX_CREATE_SOFT_LINK_WARNINGS 5
struct win32_capture_state {
unsigned long num_get_sd_access_denied;
unsigned long num_get_sacl_priv_notheld;
struct sd_set *sd_set,
const wchar_t *path,
struct win32_capture_state *state,
- int add_image_flags)
+ int add_flags)
{
SECURITY_INFORMATION requestedInformation;
DWORD lenNeeded = 0;
}
}
- if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_STRICT_ACLS)
+ if (add_flags & WIMLIB_ADD_FLAG_STRICT_ACLS)
goto fail;
switch (err) {
* fixup where we change it to be absolute relative to the root of the directory
* tree being captured.
*
- * Note that this is only executed when WIMLIB_ADD_IMAGE_FLAG_RPFIX has been
+ * Note that this is only executed when WIMLIB_ADD_FLAG_RPFIX has been
* set.
*
* @capture_root_ino and @capture_root_dev indicate the inode number and device
rpbuflen = bytesReturned;
reparse_tag = le32_to_cpu(*(u32*)rpbuf);
- if (params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_RPFIX &&
+ if (params->add_flags & WIMLIB_ADD_FLAG_RPFIX &&
(reparse_tag == WIM_IO_REPARSE_TAG_SYMLINK ||
reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT))
{
u16 not_rpfixed;
if (exclude_path(path, path_num_chars, params->config, true)) {
- if (params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) {
+ 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 ((params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE)
+ if ((params->add_flags & WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE)
&& params->progress_func)
{
union wimlib_progress_info info;
goto out;
}
- if ((params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE)
+ if ((params->add_flags & WIMLIB_ADD_FLAG_VERBOSE)
&& params->progress_func)
{
union wimlib_progress_info info;
inode->i_last_access_time = FILETIME_to_u64(&file_info.ftLastAccessTime);
inode->i_resolved = 1;
- params->add_image_flags &= ~(WIMLIB_ADD_IMAGE_FLAG_ROOT | WIMLIB_ADD_IMAGE_FLAG_SOURCE);
+ params->add_flags &= ~WIMLIB_ADD_FLAG_ROOT;
- if (!(params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_NO_ACLS)
+ if (!(params->add_flags & WIMLIB_ADD_FLAG_NO_ACLS)
&& (vol_flags & FILE_PERSISTENT_ACLS))
{
ret = win32_get_security_descriptor(root, params->sd_set,
path, state,
- params->add_image_flags);
+ params->add_flags);
if (ret)
goto out_close_handle;
}
static void
win32_do_capture_warnings(const struct win32_capture_state *state,
- int add_image_flags)
+ int add_flags)
{
if (state->num_get_sacl_priv_notheld == 0 &&
state->num_get_sd_access_denied == 0)
" desired metadata has been captured exactly. However, if you\n"
" do not care about capturing security descriptors correctly, then\n"
" nothing more needs to be done%ls\n",
- (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_NO_ACLS) ? L"." :
+ (add_flags & WIMLIB_ADD_FLAG_NO_ACLS) ? L"." :
L", although you might consider\n"
" passing the --no-acls flag to `wimlib-imagex capture' or\n"
" `wimlib-imagex append' to explicitly capture no security\n"
&state, vol_flags);
FREE(path);
if (ret == 0)
- win32_do_capture_warnings(&state, params->add_image_flags);
+ win32_do_capture_warnings(&state, params->add_flags);
return ret;
}
const struct wim_inode *inode,
const struct wim_lookup_table_entry *lte,
const wchar_t *path,
- const struct apply_args *args)
+ struct apply_args *args)
{
int ret;
u8 rpbuf[REPARSE_POINT_MAX_SIZE];
NULL /* lpOverlapped */))
{
DWORD err = GetLastError();
- ERROR("Failed to set reparse data on \"%ls\"", path);
- win32_error(err);
if (err == ERROR_ACCESS_DENIED || err == ERROR_PRIVILEGE_NOT_HELD)
- return WIMLIB_ERR_INSUFFICIENT_PRIVILEGES_TO_EXTRACT;
- else if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_SYMLINK ||
- inode->i_reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT)
- return WIMLIB_ERR_LINK;
- else
- return WIMLIB_ERR_WRITE;
+ {
+ args->num_soft_links_failed++;
+ if (args->num_soft_links_failed <= MAX_CREATE_SOFT_LINK_WARNINGS) {
+ WARNING("Can't set reparse data on \"%ls\": Access denied!\n"
+ " You may be trying to extract a symbolic "
+ "link without the\n"
+ " SeCreateSymbolicLink privilege, which by "
+ "default non-Administrator\n"
+ " accounts do not have.", path);
+ }
+ if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
+ WARNING("Suppressing further warnings regarding failure to extract\n"
+ " reparse points due to insufficient privileges...");
+ }
+ } else {
+ ERROR("Failed to set reparse data on \"%ls\"", path);
+ win32_error(err);
+ if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_SYMLINK ||
+ inode->i_reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT)
+ return WIMLIB_ERR_LINK;
+ else
+ return WIMLIB_ERR_WRITE;
+ }
}
return 0;
}
continue;
/* Skip special UNIX data entries (see documentation for
- * WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA) */
+ * WIMLIB_ADD_FLAG_UNIX_DATA) */
if (ads_entry->stream_name_nbytes == WIMLIB_UNIX_DATA_TAG_UTF16LE_NBYTES
&& !memcmp(ads_entry->stream_name,
WIMLIB_UNIX_DATA_TAG_UTF16LE,
return WIMLIB_ERR_LINK;
} else {
args->num_hard_links_failed++;
- if (args->num_hard_links_failed < MAX_CREATE_HARD_LINK_WARNINGS) {
+ if (args->num_hard_links_failed <= MAX_CREATE_HARD_LINK_WARNINGS) {
WARNING("Can't create hard link \"%ls => %ls\":\n"
" Volume does not support hard links!\n"
" Falling back to extracting a copy of the file.",
output_path, inode->i_extracted_file);
- } else if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
+ }
+ if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
WARNING("Suppressing further hard linking warnings...");
}
return -1;
int
win32_do_apply_dentry_timestamps(const wchar_t *path,
size_t path_num_chars,
- const struct wim_dentry *dentry,
- const struct apply_args *args)
+ struct wim_dentry *dentry,
+ struct apply_args *args)
{
DWORD err;
HANDLE h;
int
fsync(int fd)
{
- DWORD err;
HANDLE h;
h = (HANDLE)_get_osfhandle(fd);