X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwimboot.c;h=514ff8c5b53c1122fbe70f48f80b90c04ad3abd9;hb=c78f76969f2f3c68b830defd4d495563a41e7129;hp=3dd6da1eded2135c0db75660292a75290d13cd61;hpb=2d14d2982e057b2d99128c20c9768985bdfcd0a0;p=wimlib diff --git a/src/wimboot.c b/src/wimboot.c index 3dd6da1e..514ff8c5 100644 --- a/src/wimboot.c +++ b/src/wimboot.c @@ -29,13 +29,12 @@ * along with wimlib; if not, see http://www.gnu.org/licenses/. */ +#ifdef __WIN32__ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#ifdef __WIN32__ - #include "wimlib/win32_common.h" #include "wimlib/win32.h" #include "wimlib/assert.h" @@ -49,8 +48,7 @@ static HANDLE open_file(const wchar_t *device_name, DWORD desiredAccess) { return CreateFile(device_name, desiredAccess, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, OPEN_EXISTING, + FILE_SHARE_VALID_FLAGS, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); } @@ -612,8 +610,8 @@ retry: if (wimlib_print_errors) { print_byte_field((const u8 *)hdr, sizeof(struct WimOverlay_dat_header), - stderr); - fputc('\n', stderr); + wimlib_error_file); + fputc('\n', wimlib_error_file); } ret = WIMLIB_ERR_UNSUPPORTED; goto out_free_contents; @@ -683,8 +681,9 @@ retry: path, i, entry_1->data_source_id); if (wimlib_print_errors) { print_byte_field((const u8 *)entry_2->wim_file_name, - wim_file_name_length, stderr); - fputc('\n', stderr); + wim_file_name_length, + wimlib_error_file); + fputc('\n', wimlib_error_file); } ret = WIMLIB_ERR_UNSUPPORTED; goto out_free_contents; @@ -721,8 +720,8 @@ retry: if (wimlib_print_errors) { print_byte_field((const u8 *)entry_2, entry_1->entry_2_length, - stderr); - fputc('\n', stderr); + wimlib_error_file); + fputc('\n', wimlib_error_file); } ret = WIMLIB_ERR_UNSUPPORTED; goto out_free_contents; @@ -808,6 +807,7 @@ update_wimoverlay_manually(const wchar_t *drive, const wchar_t *wim_path, if (ret) { ERROR_WITH_ERRNO("Can't rename \"%ls\" => \"%ls\"", path_main, path_wimlib_backup); + ret = WIMLIB_ERR_RENAME; goto out_free_new_contents; } } @@ -817,6 +817,7 @@ update_wimoverlay_manually(const wchar_t *drive, const wchar_t *wim_path, if (ret) { ERROR_WITH_ERRNO("Can't rename \"%ls\" => \"%ls\"", path_new, path_main); + ret = WIMLIB_ERR_RENAME; } out_free_new_contents: FREE(new_contents); @@ -830,26 +831,6 @@ out: return ret; } -static int -win32_get_drive_path(const wchar_t *file_path, wchar_t drive_path[7]) -{ - tchar *file_abspath; - - file_abspath = realpath(file_path, NULL); - if (!file_abspath) - return WIMLIB_ERR_NOMEM; - - if (file_abspath[0] == L'\0' || file_abspath[1] != L':') { - ERROR("\"%ls\": Path format not recognized", file_abspath); - FREE(file_abspath); - return WIMLIB_ERR_UNSUPPORTED; - } - - wsprintf(drive_path, L"\\\\.\\%lc:", file_abspath[0]); - FREE(file_abspath); - return 0; -} - /* Try to attach an instance of the Windows Overlay File System Filter Driver to * the specified drive (such as C:) */ static bool @@ -902,7 +883,7 @@ try_to_attach_wof(const wchar_t *drive) * @image * Number of the image in the WIM being applied. * @target - * Path to the target drive. + * Path to the target directory. * @data_source_id_ret * On success, an identifier for the backing WIM file will be returned * here. @@ -1043,8 +1024,10 @@ out: * This turns it into a reparse point that redirects accesses to it, to the * corresponding resource in the WIM archive. * - * @path - * Path to extracted file (already created). + * @attr + * Object attributes that specify the path to the file. + * @printable_name + * Printable representation of the path encoded in @attr. * @lte * Unnamed data stream of the file. * @data_source_id @@ -1058,23 +1041,28 @@ out: * Returns 0 on success, or a positive error code on failure. */ int -wimboot_set_pointer(const wchar_t *path, +wimboot_set_pointer(OBJECT_ATTRIBUTES *attr, + const wchar_t *printable_name, const struct wim_lookup_table_entry *lte, u64 data_source_id, const u8 lookup_table_hash[SHA1_HASH_SIZE], bool wof_running) { - HANDLE h; - DWORD bytes_returned; int ret; - - - /* Open the file */ - h = win32_open_existing_file(path, GENERIC_WRITE); - if (h == INVALID_HANDLE_VALUE) { - set_errno_from_GetLastError(); - ret = WIMLIB_ERR_OPEN; - goto out; + HANDLE h = NULL; + NTSTATUS status; + IO_STATUS_BLOCK iosb; + DWORD bytes_returned; + DWORD err; + + status = (*func_NtOpenFile)(&h, GENERIC_WRITE | SYNCHRONIZE, attr, + &iosb, FILE_SHARE_VALID_FLAGS, + FILE_OPEN_FOR_BACKUP_INTENT | + FILE_OPEN_REPARSE_POINT | + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) { + SetLastError((*func_RtlNtStatusToDosError)(status)); + goto fail; } if (wof_running) { @@ -1097,7 +1085,8 @@ wimboot_set_pointer(const wchar_t *path, /* lookup_table_hash is not necessary */ if (!DeviceIoControl(h, FSCTL_SET_EXTERNAL_BACKING, - &in, sizeof(in), NULL, 0, &bytes_returned, NULL)) + &in, sizeof(in), NULL, 0, + &bytes_returned, NULL)) goto fail; } else { @@ -1156,20 +1145,19 @@ wimboot_set_pointer(const wchar_t *path, } ret = 0; -out_close_handle: - CloseHandle(h); + goto out; + +fail: + err = GetLastError(); + set_errno_from_win32_error(err); + ERROR_WITH_ERRNO("\"%ls\": Couldn't set WIMBoot pointer data " + "(err=%"PRIu32")", printable_name, (u32)err); + ret = WIMLIB_ERR_WIMBOOT; out: + if (h) + (*func_NtClose)(h); return ret; -fail: - { - DWORD err = GetLastError(); - set_errno_from_win32_error(err); - ERROR_WITH_ERRNO("\"%ls\": Couldn't set WIMBoot pointer data " - "(err=0x%08"PRIx32")", path, (u32)err); - ret = WIMLIB_ERR_WIMBOOT; - goto out_close_handle; - } } #endif /* __WIN32__ */