X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwin32_capture.c;h=331a0dce32e505c0d91932718ef98f54aebb271a;hb=5a50cccf768a6bf6e9ccfd2337bcedc0cbf1ba6c;hp=bc05d70779459c59871530c88cae5585d4ead1f5;hpb=876385a3ab5dde09322c094c582edd84609d85c9;p=wimlib diff --git a/src/win32_capture.c b/src/win32_capture.c index bc05d707..331a0dce 100644 --- a/src/win32_capture.c +++ b/src/win32_capture.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2013-2018 Eric Biggers + * Copyright (C) 2013-2021 Eric Biggers * * 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 @@ -21,7 +21,7 @@ * along with this file; if not, see http://www.gnu.org/licenses/. */ -#ifdef __WIN32__ +#ifdef _WIN32 #ifdef HAVE_CONFIG_H # include "config.h" @@ -330,7 +330,7 @@ read_winnt_stream_prefix(const struct windows_file *file, }; HANDLE h; NTSTATUS status; - u8 buf[BUFFER_SIZE] _aligned_attribute(8); + u8 buf[BUFFER_SIZE] __attribute__((aligned(8))); u64 bytes_remaining; int ret; @@ -488,7 +488,8 @@ read_win32_encrypted_file_prefix(const wchar_t *path, bool is_dir, u64 size, * described by @blob. */ int read_windows_file_prefix(const struct blob_descriptor *blob, u64 size, - const struct consume_chunk_callback *cb) + const struct consume_chunk_callback *cb, + bool recover_data) { const struct windows_file *file = blob->windows_file; @@ -511,7 +512,7 @@ winnt_get_short_name(HANDLE h, struct wim_dentry *dentry) * course has to create its own handle. */ NTSTATUS status; IO_STATUS_BLOCK iosb; - u8 buf[128] _aligned_attribute(8); + u8 buf[128] __attribute__((aligned(8))); const FILE_NAME_INFORMATION *info; status = NtQueryInformationFile(h, &iosb, buf, sizeof(buf), @@ -536,7 +537,7 @@ winnt_load_security_descriptor(HANDLE h, struct wim_inode *inode, struct winnt_scan_ctx *ctx) { SECURITY_INFORMATION requestedInformation; - u8 _buf[4096] _aligned_attribute(8); + u8 _buf[4096] __attribute__((aligned(8))); u8 *buf; ULONG bufsize; ULONG len_needed; @@ -704,7 +705,7 @@ winnt_load_xattrs(HANDLE h, struct wim_inode *inode, { IO_STATUS_BLOCK iosb; NTSTATUS status; - u8 _buf[1024] _aligned_attribute(4); + u8 _buf[1024] __attribute__((aligned(4))); u8 *buf = _buf; const FILE_FULL_EA_INFORMATION *ea; struct wim_xattr_entry *entry; @@ -1320,22 +1321,17 @@ winnt_scan_data_stream(wchar_t *raw_stream_name, size_t raw_stream_name_nchars, * Load information about the data streams of an open file into a WIM inode. * * We use the NtQueryInformationFile() system call instead of FindFirstStream() - * and FindNextStream(). This is done for two reasons: - * - * - FindFirstStream() opens its own handle to the file or directory and - * apparently does so without specifying FILE_FLAG_BACKUP_SEMANTICS, thereby - * causing access denied errors on certain files (even when running as the - * Administrator). - * - FindFirstStream() and FindNextStream() is only available on Windows Vista - * and later, whereas the stream support in NtQueryInformationFile() was - * already present in Windows XP. + * and FindNextStream(), since FindFirstStream() opens its own handle to the + * file or directory and apparently does so without specifying + * FILE_FLAG_BACKUP_SEMANTICS. This causing access denied errors on certain + * files, even when running as the Administrator. */ static noinline_for_stack int winnt_scan_data_streams(HANDLE h, struct wim_inode *inode, u64 file_size, struct winnt_scan_ctx *ctx) { int ret; - u8 _buf[4096] _aligned_attribute(8); + u8 _buf[4096] __attribute__((aligned(8))); u8 *buf; size_t bufsize; IO_STATUS_BLOCK iosb; @@ -1517,7 +1513,7 @@ try_to_use_wimboot_hash(HANDLE h, struct wim_inode *inode, if (inode->i_attributes & FILE_ATTRIBUTE_REPARSE_POINT) { struct reparse_buffer_disk rpbuf; struct { - struct wof_external_info wof_info; + WOF_EXTERNAL_INFO wof_info; struct wim_provider_rpdata wim_info; } *rpdata = (void *)rpbuf.rpdata; struct blob_descriptor *reparse_blob; @@ -1535,8 +1531,8 @@ try_to_use_wimboot_hash(HANDLE h, struct wim_inode *inode, if (ret) return ret; - if (rpdata->wof_info.version != WOF_CURRENT_VERSION || - rpdata->wof_info.provider != WOF_PROVIDER_WIM || + if (rpdata->wof_info.Version != WOF_CURRENT_VERSION || + rpdata->wof_info.Provider != WOF_PROVIDER_WIM || rpdata->wim_info.version != 2) return 0; /* Not a WIM-backed file */ @@ -1544,8 +1540,8 @@ try_to_use_wimboot_hash(HANDLE h, struct wim_inode *inode, copy_hash(hash, rpdata->wim_info.unnamed_data_stream_hash); } else { struct { - struct wof_external_info wof_info; - struct wim_provider_external_info wim_info; + WOF_EXTERNAL_INFO wof_info; + WIM_PROVIDER_EXTERNAL_INFO wim_info; } out; NTSTATUS status; @@ -1579,13 +1575,13 @@ try_to_use_wimboot_hash(HANDLE h, struct wim_inode *inode, } /* Is this file backed by a WIM? */ - if (out.wof_info.version != WOF_CURRENT_VERSION || - out.wof_info.provider != WOF_PROVIDER_WIM || - out.wim_info.version != WIM_PROVIDER_CURRENT_VERSION) + if (out.wof_info.Version != WOF_CURRENT_VERSION || + out.wof_info.Provider != WOF_PROVIDER_WIM || + out.wim_info.Version != WIM_PROVIDER_CURRENT_VERSION) return 0; /* Okay, this is a WIM backed file. Get its SHA-1 hash. */ - copy_hash(hash, out.wim_info.unnamed_data_stream_hash); + copy_hash(hash, out.wim_info.ResourceHash); } /* If the file's unnamed data stream is nonempty, then fill in its hash @@ -1603,7 +1599,8 @@ try_to_use_wimboot_hash(HANDLE h, struct wim_inode *inode, return 0; back_ptr = retrieve_pointer_to_unhashed_blob(blob); copy_hash(blob->hash, hash); - if (after_blob_hashed(blob, back_ptr, blob_table) != blob) + if (after_blob_hashed(blob, back_ptr, blob_table, + inode) != blob) free_blob_descriptor(blob); } @@ -1657,7 +1654,8 @@ get_file_info(HANDLE h, struct file_info *info) static void get_volume_information(HANDLE h, struct winnt_scan_ctx *ctx) { - u8 _attr_info[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 128] _aligned_attribute(8); + u8 _attr_info[sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 128] + __attribute__((aligned(8))); FILE_FS_ATTRIBUTE_INFORMATION *attr_info = (void *)_attr_info; FILE_FS_VOLUME_INFORMATION vol_info; struct file_info file_info; @@ -3049,4 +3047,4 @@ out: return ret; } -#endif /* __WIN32__ */ +#endif /* _WIN32 */