From: ajkhoury aidankhoury@gmail.com
--- dlls/mspatcha/lzxd_dec.c | 8 +++----- dlls/mspatcha/pa19.c | 25 +++++++++++++++++++++++++ dlls/mspatcha/pa19.h | 3 +++ 3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/dlls/mspatcha/lzxd_dec.c b/dlls/mspatcha/lzxd_dec.c index fe04723b3a7..80ffa9060d9 100644 --- a/dlls/mspatcha/lzxd_dec.c +++ b/dlls/mspatcha/lzxd_dec.c @@ -29,6 +29,7 @@ #include "wine/debug.h"
#include "patchapi.h" +#include "pa19.h"
#include "lzxd_dec.h"
@@ -680,9 +681,6 @@ DWORD decode_lzxd_stream(const BYTE *src, const size_t input_size, if (input_size == 0) return (output_size == 0) ? ERROR_SUCCESS : ERROR_PATCH_CORRUPT;
- if (progress_fn != NULL && !progress_fn(progress_ctx, 0, (ULONG)output_size)) - return ERROR_CANCELLED; - dec = heap_alloc(sizeof(*dec)); if (dec == NULL) return ERROR_OUTOFMEMORY; @@ -753,9 +751,9 @@ DWORD decode_lzxd_stream(const BYTE *src, const size_t input_size, err = ERROR_PATCH_DECODE_FAILURE; goto free_dec; } - if (progress_fn != NULL && !progress_fn(progress_ctx, (ULONG)(index - predef_size), (ULONG)output_size)) + if (!progress_callback_wrapper(progress_fn, progress_ctx, (ULONG)(index - predef_size), (ULONG)output_size)) { - err = ERROR_CANCELLED; + err = GetLastError(); goto free_dec; } } diff --git a/dlls/mspatcha/pa19.c b/dlls/mspatcha/pa19.c index 55248156b39..a8adc01cc7c 100644 --- a/dlls/mspatcha/pa19.c +++ b/dlls/mspatcha/pa19.c @@ -2119,6 +2119,19 @@ static DWORD perform_patches_on_old_file_image( return err; }
+ +BOOL progress_callback_wrapper( + PPATCH_PROGRESS_CALLBACK progress_fn, void *progress_ctx, ULONG current, ULONG maximum) +{ + if (progress_fn != NULL && !progress_fn(progress_ctx, current, maximum)) { + if (GetLastError() == ERROR_SUCCESS) { + SetLastError(ERROR_CANCELLED); + } + return FALSE; + } + return TRUE; +} + DWORD apply_patch_to_file_by_buffers( const BYTE *patch_file_view, const ULONG patch_file_size, const BYTE *old_file_view, ULONG old_file_size, @@ -2210,6 +2223,12 @@ DWORD apply_patch_to_file_by_buffers( memcpy(old_file_buf, old_file_view, old_file_size); }
+ /* Make initial progress callback. */ + if (!progress_callback_wrapper(progress_fn, progress_ctx, 0, ph.patched_size)) { + err = GetLastError(); + goto cleanup; + } + patched = FALSE; retain_buffer = NULL; found_file = NULL; @@ -2426,6 +2445,12 @@ DWORD apply_patch_to_file_by_buffers( apply_retained_ranges(new_file_buf, found_file->retain_range_array, found_file->retain_range_count, retain_buffer);
+ /* Make final progress callback. */ + if (!progress_callback_wrapper(progress_fn, progress_ctx, 0, ph.patched_size)) { + err = GetLastError(); + goto cleanup; + } + if (!(apply_option_flags & APPLY_OPTION_TEST_ONLY)) { if (in_new_file_buf == NULL) { diff --git a/dlls/mspatcha/pa19.h b/dlls/mspatcha/pa19.h index 008b0f80bc4..066b3816c75 100644 --- a/dlls/mspatcha/pa19.h +++ b/dlls/mspatcha/pa19.h @@ -31,6 +31,9 @@ int normalize_old_file_image( const PATCH_IGNORE_RANGE *ignore_range_array, ULONG ignore_range_count, const PATCH_RETAIN_RANGE *retain_range_array, ULONG retain_range_count);
+BOOL progress_callback_wrapper( + PPATCH_PROGRESS_CALLBACK progress_fn, void *progress_ctx, ULONG current, ULONG maximum); + DWORD apply_patch_to_file_by_buffers(const BYTE *patch_file_view, const ULONG patch_file_size, const BYTE *old_file_view, ULONG old_file_size, BYTE **new_file_buf, const ULONG new_file_buf_size, ULONG *new_file_size,