From 94d61d1b280d0ef15474c0cf44f534d5d44eba1f Mon Sep 17 00:00:00 2001 From: Sven Baars Date: Wed, 12 Jul 2023 09:07:50 +0200 Subject: [PATCH] wow64win: Always use NtUserSetWindowLongPtr() for GWLP_HINSTANCE and GWLP_WNDPROC. --- dlls/user32/tests/win.c | 9 +++++++++ dlls/wow64win/user.c | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 31d14480861..a3216da9f46 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -7293,6 +7293,15 @@ static void test_SetWindowLong(void) "SetWindowLongPtr on invalid window proc shouldn't have changed the value returned by GetWindowLongPtr, instead of changing it to 0x%Ix\n", retval); ok(IsWindowUnicode(hwndMain), "hwndMain should now be Unicode\n"); + /* Make sure nothing changes if we set the same proc */ + retval = SetWindowLongPtrW(hwndMain, GWLP_WNDPROC, (LONG_PTR)old_window_procW); + todo_wine + ok((WNDPROC)retval == main_window_procA, "unexpected proc 0x%Ix\n", retval); + retval = GetWindowLongPtrW(hwndMain, GWLP_WNDPROC); + ok((WNDPROC)retval == old_window_procW, "unexpected proc 0x%Ix\n", retval); + retval = GetWindowLongPtrA(hwndMain, GWLP_WNDPROC); + ok((WNDPROC)retval == main_window_procA, "unexpected proc 0x%Ix\n", retval); + /* set it back to ANSI */ SetWindowLongPtrA(hwndMain, GWLP_WNDPROC, 0); } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 8065a05f44a..602ccfa79b9 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -3832,6 +3832,13 @@ NTSTATUS WINAPI wow64_NtUserSetWindowLong( UINT *args ) LONG newval = get_ulong( &args ); BOOL ansi = get_ulong( &args ); + switch (offset) + { + case GWLP_HINSTANCE: + case GWLP_WNDPROC: + return NtUserSetWindowLongPtr( hwnd, offset, (ULONG)newval, ansi ); + } + return NtUserSetWindowLong( hwnd, offset, newval, ansi ); }