From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/user32/user_main.c | 8 ++++++++ dlls/wow64win/user.c | 19 +++++++++++++++++++ include/ntuser.h | 10 ++++++++++ 3 files changed, 37 insertions(+)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index bfaee6ca649..01f8b325f3a 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" @@ -203,6 +205,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( params->args, params->len ); +} + static const void *kernel_callback_table[NtUserCallCount] = { User32CallEnumDisplayMonitor, @@ -225,6 +232,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 041285fa37f..17b119e94ea 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -328,6 +328,13 @@ struct unpack_dde_message_params32 char data[1]; };
+struct user32_callback_params32 +{ + ULONG func; + ULONG args; + ULONG len; +}; + static MSG *msg_32to64( MSG *msg, const MSG32 *msg32 ) { if (!msg32) return NULL; @@ -986,6 +993,17 @@ 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; + + params32.func = (ULONG)(ULONG_PTR)params->func; + params32.args = (ULONG)(ULONG_PTR)params->args; + params32.len = params->len; + return dispatch_callback( NtUserDispatchCallback, ¶ms32, sizeof(params32) ); +} + static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) { return dispatch_callback( NtUserCallFreeIcon, arg, size ); @@ -1079,6 +1097,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 d724ccad103..015f4cb7e35 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -46,6 +46,7 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, + NtUserDispatchCallback, /* win16 hooks */ NtUserCallFreeIcon, NtUserThunkLock, @@ -267,6 +268,15 @@ 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; + void *args; + ULONG len; +}; + /* process DPI awareness contexts */ #define NTUSER_DPI_UNAWARE 0x00006010 #define NTUSER_DPI_SYSTEM_AWARE 0x00006011