Module: wine Branch: master Commit: 33793446c438f99bfbe00602fb74e845a10a748c URL: https://gitlab.winehq.org/wine/wine/-/commit/33793446c438f99bfbe00602fb74e84...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jan 18 15:00:24 2024 +0100
user32: Return result through NtCallbackReturn for the load image callback.
---
dlls/user32/user_main.c | 6 ++++-- dlls/win32u/cursoricon.c | 3 ++- dlls/wow64win/user.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index efa33fb2760..79809835b91 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -145,11 +145,13 @@ static NTSTATUS WINAPI User32ImmTranslateMessage( const struct imm_translate_mes return ImmTranslateMessage( params->hwnd, params->msg, params->wparam, params->key_data ); }
-static NTSTATUS WINAPI User32LoadImage( const struct load_image_params *params, ULONG size ) +static NTSTATUS WINAPI User32LoadImage( void *args, ULONG size ) { + const struct load_image_params *params = args; HANDLE ret = LoadImageW( params->hinst, params->name, params->type, params->dx, params->dy, params->flags ); - return HandleToUlong( ret ); + if (!ret) return STATUS_NO_MEMORY; + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); }
static NTSTATUS WINAPI User32LoadSysMenu( const struct load_sys_menu_params *params, ULONG size ) diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index 5fe52fdb8b3..661ef34c2e0 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -740,5 +740,6 @@ HANDLE WINAPI LoadImageW( HINSTANCE hinst, const WCHAR *name, UINT type, return 0; } ret = KeUserModeCallback( NtUserLoadImage, ¶ms, sizeof(params), &ret_ptr, &ret_len ); - return UlongToHandle( ret ); + if (!ret && ret_len == sizeof(HANDLE)) return *(HANDLE *)ret_ptr; + return 0; } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 219c48b754f..d010b826ba1 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1343,6 +1343,9 @@ static NTSTATUS WINAPI wow64_NtUserLoadDriver( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size ) { struct load_image_params *params = arg; + void *ret_ptr; + ULONG ret_len; + NTSTATUS status; struct { ULONG hinst; @@ -1359,7 +1362,14 @@ static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size ) params32.dx = params->dx; params32.dy = params->dy; params32.flags = params->flags; - return dispatch_callback( NtUserLoadImage, ¶ms32, sizeof(params32) ); + status = Wow64KiUserCallbackDispatcher( NtUserLoadImage, ¶ms32, sizeof(params32), + &ret_ptr, &ret_len ); + if (!status && ret_len == sizeof(ULONG)) + { + HANDLE handle = ULongToHandle( *(ULONG *)ret_ptr ); + return NtCallbackReturn( &handle, sizeof(handle), status ); + } + return status; }
static NTSTATUS WINAPI wow64_NtUserLoadSysMenu( void *arg, ULONG size )