From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/user32/user_main.c | 8 ++++++++ dlls/wow64win/user.c | 28 ++++++++++++++++++++++++++++ include/ntuser.h | 8 ++++++++ 3 files changed, 44 insertions(+)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 15e4796bab2..a6943bc9dc9 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "controls.h" #include "imm.h" @@ -210,6 +212,11 @@ static DWORD WINAPI User32ThunkLock( DWORD *param, ULONG size ) return wow_handlers.thunk_lock( param ? *param : 0, size == sizeof(DWORD) ); }
+static NTSTATUS WINAPI User32DispatchCallback( const struct user32_callback_params *params, ULONG size ) +{ + return params->func( (void*)params, size ); +} + static const void *kernel_callback_table[NtUserCallCount] = { User32CallEnumDisplayMonitor, @@ -233,6 +240,7 @@ static const void *kernel_callback_table[NtUserCallCount] = User32UnpackDDEMessage, User32CallFreeIcon, User32ThunkLock, + User32DispatchCallback, };
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 256add62aab..48f34f01a40 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -328,6 +328,11 @@ struct unpack_dde_message_params32 char data[1]; };
+struct user32_callback_params32 +{ + ULONG func; +}; + static MSG *msg_32to64( MSG *msg, const MSG32 *msg32 ) { if (!msg32) return NULL; @@ -1008,6 +1013,28 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size ) return TRUE; }
+static NTSTATUS WINAPI wow64_NtUserDispatchCallback( void *arg, ULONG size ) +{ + struct user32_callback_params *params = arg; + struct user32_callback_params32 *params32; + NTSTATUS status; + void *ret_ptr; + ULONG ret_len; + + size -= sizeof(*params); + if (!(params32 = Wow64AllocateTemp( sizeof(*params32) + size ))) + return 0; + + params32->func = (ULONG)(ULONG_PTR)params->func; + if (size) memcpy( params32 + 1, params + 1, size ); + + status = Wow64KiUserCallbackDispatcher( NtUserDispatchCallback, params32, size + sizeof(*params32), + &ret_ptr, &ret_len ); + params->func = (void*)(ULONG_PTR)params32->func; + if (size) memcpy( params + 1, params32 + 1, size ); + return NtCallbackReturn( ret_ptr, ret_len, status ); +} + static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) { return dispatch_callback( NtUserCallFreeIcon, arg, size ); @@ -1108,6 +1135,7 @@ user_callback user_callbacks[] = wow64_NtUserPostDDEMessage, wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, + wow64_NtUserDispatchCallback, /* win16 hooks */ wow64_NtUserCallFreeIcon, wow64_NtUserThunkLock, diff --git a/include/ntuser.h b/include/ntuser.h index 5331b3d7400..081056d6384 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -47,6 +47,7 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, + NtUserDispatchCallback, /* win16 hooks */ NtUserCallFreeIcon, NtUserThunkLock, @@ -270,6 +271,13 @@ struct unpack_dde_message_params char data[1]; };
+typedef NTSTATUS (WINAPI *user32_callback_func)( void *args, ULONG len ); + +struct user32_callback_params +{ + user32_callback_func func; +}; + /* process DPI awareness contexts */ #define NTUSER_DPI_UNAWARE 0x00006010 #define NTUSER_DPI_SYSTEM_AWARE 0x00006011