creationDisposition, FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OPEN_REPARSE_POINT,
NULL);
- if (h == INVALID_HANDLE_VALUE)
- goto error;
+ if (h == INVALID_HANDLE_VALUE) {
+ set_errno_from_GetLastError();
+ ret = WIMLIB_ERR_OPEN;
+ goto out;
+ }
- ret = 0;
- if (!lte)
+ if (!lte) {
+ ret = 0;
goto out_close_handle;
+ }
+
+ if (!SetFilePointerEx(h,
+ (LARGE_INTEGER) { .QuadPart = lte->size},
+ NULL,
+ FILE_BEGIN))
+ goto write_error;
+
+ if (!SetEndOfFile(h))
+ goto write_error;
+
+ if (!SetFilePointerEx(h,
+ (LARGE_INTEGER) { .QuadPart = 0},
+ NULL,
+ FILE_BEGIN))
+ goto write_error;
+
ret = extract_stream(lte, lte->size, win32_extract_wim_chunk, h);
-out_close_handle:
- if (!CloseHandle(h))
- goto error;
- if (ret && !errno)
- errno = -1;
- return ret;
+ goto out_close_handle;
-error:
+write_error:
set_errno_from_GetLastError();
- return WIMLIB_ERR_WRITE;
+ ret = WIMLIB_ERR_WRITE;
+
+out_close_handle:
+ if (!CloseHandle(h)) {
+ if (!ret) {
+ set_errno_from_GetLastError();
+ ret = WIMLIB_ERR_WRITE;
+ }
+ }
+out:
+ return ret;
}
static int
&& lte
&& lte->resource_location == RESOURCE_IN_WIM
&& lte->rspec->wim == ctx->wim
- && lte->size == lte->rspec->uncompressed_size
- && !in_prepopulate_list(dentry, ctx))
+ && lte->size == lte->rspec->uncompressed_size)
{
- const struct win32_apply_private_data *dat;
+ if (in_prepopulate_list(dentry, ctx)) {
+ if (ctx->progress_func) {
+ union wimlib_progress_info info;
- dat = get_private_data(ctx);
- return wimboot_set_pointer(file.path, lte,
- dat->data_source_id,
- dat->wim_lookup_table_hash,
- dat->wof_running);
+ info.wimboot_exclude.path_in_wim = dentry->_full_path;
+ info.wimboot_exclude.extraction_path = file.path;
+
+ ctx->progress_func(WIMLIB_PROGRESS_MSG_WIMBOOT_EXCLUDE,
+ &info);
+ }
+ } else {
+ const struct win32_apply_private_data *dat;
+
+ dat = get_private_data(ctx);
+ return wimboot_set_pointer(file.path, lte,
+ dat->data_source_id,
+ dat->wim_lookup_table_hash,
+ dat->wof_running);
+ }
}
return win32_extract_stream(file.path, NULL, 0, lte, ctx);