X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwin32_capture.c;h=4adf3364cb8f5ae778f9bca4f4e787fe1fc07162;hp=ae9cbbe9500c9055689cf8c28c03a63404eb130f;hb=79d279cf4581fc0295576e33a28faf65686bee2c;hpb=f217a34cf5fecfd91b10395f9165a7ae9570c4aa;ds=sidebyside diff --git a/src/win32_capture.c b/src/win32_capture.c index ae9cbbe9..4adf3364 100644 --- a/src/win32_capture.c +++ b/src/win32_capture.c @@ -7,20 +7,18 @@ /* * Copyright (C) 2013, 2014 Eric Biggers * - * This file is part of wimlib, a library for working with WIM files. + * This file is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. * - * wimlib is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) - * any later version. - * - * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more + * This file is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * - * You should have received a copy of the GNU General Public License - * along with wimlib; if not, see http://www.gnu.org/licenses/. + * You should have received a copy of the GNU Lesser General Public License + * along with this file; if not, see http://www.gnu.org/licenses/. */ #ifdef __WIN32__ @@ -224,7 +222,7 @@ read_win32_encrypted_file_prefix(const struct wim_lookup_table_entry *lte, 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; @@ -263,7 +261,7 @@ winnt_get_short_name(HANDLE h, struct wim_dentry *dentry) } /* - * Load the security descriptor of a file into the corresponding inode, and the + * Load the security descriptor of a file into the corresponding inode and the * WIM image's security descriptor set. */ static NTSTATUS @@ -278,10 +276,27 @@ winnt_get_security_descriptor(HANDLE h, struct wim_inode *inode, ULONG len_needed; NTSTATUS status; - requestedInformation = DACL_SECURITY_INFORMATION | + /* + * LABEL_SECURITY_INFORMATION is needed on Windows Vista and 7 because + * Microsoft decided to add mandatory integrity labels to the SACL but + * not have them returned by SACL_SECURITY_INFORMATION. + * + * BACKUP_SECURITY_INFORMATION is needed on Windows 8 because Microsoft + * decided to add even more stuff to the SACL and still not have it + * returned by SACL_SECURITY_INFORMATION; but they did remember that + * backup applications exist and simply want to read the stupid thing + * once and for all, so they added a flag to read the entire security + * descriptor. + * + * Older versions of Windows tolerate these new flags being passed in. + */ + requestedInformation = OWNER_SECURITY_INFORMATION | + GROUP_SECURITY_INFORMATION | + DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION | - OWNER_SECURITY_INFORMATION | - GROUP_SECURITY_INFORMATION; + LABEL_SECURITY_INFORMATION | + BACKUP_SECURITY_INFORMATION; + buf = _buf; bufsize = sizeof(_buf); @@ -339,7 +354,9 @@ winnt_get_security_descriptor(HANDLE h, struct wim_inode *inode, if (requestedInformation & SACL_SECURITY_INFORMATION) { /* Try again without the SACL. */ stats->num_get_sacl_priv_notheld++; - requestedInformation &= ~SACL_SECURITY_INFORMATION; + requestedInformation &= ~(SACL_SECURITY_INFORMATION | + LABEL_SECURITY_INFORMATION | + BACKUP_SECURITY_INFORMATION); break; } /* Fake success (useful when capturing as @@ -368,7 +385,7 @@ winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret, size_t full_path_nchars, const wchar_t *filename, size_t filename_nchars, - struct add_image_params *params, + struct capture_params *params, struct winnt_scan_stats *stats, u32 vol_flags); @@ -377,7 +394,7 @@ winnt_recurse_directory(HANDLE h, wchar_t *full_path, size_t full_path_nchars, struct wim_dentry *parent, - struct add_image_params *params, + struct capture_params *params, struct winnt_scan_stats *stats, u32 vol_flags) { @@ -593,9 +610,8 @@ out_close_root_dir: } static int -winnt_rpfix_progress(struct add_image_params *params, const wchar_t *path, - const struct reparse_data *rpdata, - enum wimlib_progress_msg msg) +winnt_rpfix_progress(struct capture_params *params, const wchar_t *path, + 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]; @@ -605,13 +621,13 @@ winnt_rpfix_progress(struct add_image_params *params, const wchar_t *path, 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 winnt_try_rpfix(u8 *rpbuf, u16 *rpbuflen_p, u64 capture_root_ino, u64 capture_root_dev, - const wchar_t *path, struct add_image_params *params) + const wchar_t *path, struct capture_params *params) { struct reparse_data rpdata; const wchar_t *rel_target; @@ -670,7 +686,7 @@ winnt_try_rpfix(u8 *rpbuf, u16 *rpbuflen_p, } /* 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 @@ -730,7 +746,7 @@ winnt_try_rpfix(u8 *rpbuf, u16 *rpbuflen_p, */ static int winnt_get_reparse_data(HANDLE h, const wchar_t *path, - struct add_image_params *params, + struct capture_params *params, u8 *rpbuf, u16 *rpbuflen_ret) { DWORD bytes_returned; @@ -944,6 +960,7 @@ winnt_scan_stream(const wchar_t *path, size_t path_nchars, stream_id = 0; inode->i_lte = lte; } + lte->file_inode = inode; add_unhashed_stream(lte, inode, stream_id, unhashed_streams); return 0; } @@ -1083,7 +1100,7 @@ winnt_build_dentry_tree_recursive(struct wim_dentry **root_ret, size_t full_path_nchars, const wchar_t *filename, size_t filename_nchars, - struct add_image_params *params, + struct capture_params *params, struct winnt_scan_stats *stats, u32 vol_flags) { @@ -1366,10 +1383,12 @@ out_progress: out: if (likely(h != INVALID_HANDLE_VALUE)) (*func_NtClose)(h); - if (likely(ret == 0)) - *root_ret = root; - else + if (unlikely(ret)) { free_dentry_tree(root, params->lookup_table); + root = NULL; + ret = report_capture_error(params, ret, full_path); + } + *root_ret = root; return ret; } @@ -1401,7 +1420,7 @@ winnt_do_scan_warnings(const wchar_t *path, const struct winnt_scan_stats *stats int win32_build_dentry_tree(struct wim_dentry **root_ret, const wchar_t *root_disk_path, - struct add_image_params *params) + struct capture_params *params) { wchar_t *path; int ret;