1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

user32: Return result through NtCallbackReturn for the DDE message callback.

This commit is contained in:
Alexandre Julliard 2024-01-18 14:55:48 +01:00
parent 386e9fef2b
commit 85e351abaf
4 changed files with 26 additions and 33 deletions

View file

@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "user_private.h" #include "user_private.h"
#include "controls.h" #include "controls.h"
#include "imm.h" #include "imm.h"
@ -179,18 +181,17 @@ static BOOL WINAPI User32LoadDriver( const WCHAR *path, ULONG size )
return LoadLibraryW( path ) != NULL; return LoadLibraryW( path ) != NULL;
} }
static NTSTATUS WINAPI User32UnpackDDEMessage( const struct unpack_dde_message_params *params, ULONG size ) static NTSTATUS WINAPI User32UnpackDDEMessage( void *args, ULONG size )
{ {
const struct unpack_dde_message_params *params = args;
struct unpack_dde_message_result result = { .wparam = params->wparam, .lparam = params->lparam }; struct unpack_dde_message_result result = { .wparam = params->wparam, .lparam = params->lparam };
size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); size -= FIELD_OFFSET( struct unpack_dde_message_params, data );
if (!unpack_dde_message( params->hwnd, params->message, &result.wparam, &result.lparam, if (!unpack_dde_message( params->hwnd, params->message, &result.wparam, &result.lparam,
params->data, size )) params->data, size ))
return FALSE; return STATUS_NO_MEMORY;
if (params->result) *params->result = result; return NtCallbackReturn( &result, sizeof(result), STATUS_SUCCESS );
else NtCallbackReturn( &result, sizeof(result), TRUE );
return TRUE;
} }
static const void *kernel_callback_table[NtUserCallCount] = static const void *kernel_callback_table[NtUserCallCount] =

View file

@ -2894,27 +2894,27 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
} }
if (info.msg.message >= WM_DDE_FIRST && info.msg.message <= WM_DDE_LAST) if (info.msg.message >= WM_DDE_FIRST && info.msg.message <= WM_DDE_LAST)
{ {
struct unpack_dde_message_result result; struct unpack_dde_message_result *result;
struct unpack_dde_message_params *params; struct unpack_dde_message_params *params;
void *ret_ptr; NTSTATUS status;
ULONG len; ULONG len;
BOOL ret;
len = FIELD_OFFSET( struct unpack_dde_message_params, data[size] ); len = FIELD_OFFSET( struct unpack_dde_message_params, data[size] );
if (!(params = malloc( len ))) if (!(params = malloc( len )))
continue; continue;
params->result = &result;
params->hwnd = info.msg.hwnd; params->hwnd = info.msg.hwnd;
params->message = info.msg.message; params->message = info.msg.message;
params->wparam = info.msg.wParam; params->wparam = info.msg.wParam;
params->lparam = info.msg.lParam; params->lparam = info.msg.lParam;
if (size) memcpy( params->data, buffer, size ); if (size) memcpy( params->data, buffer, size );
ret = KeUserModeCallback( NtUserUnpackDDEMessage, params, len, &ret_ptr, &len ); status = KeUserModeCallback( NtUserUnpackDDEMessage, params, len, (void **)&result, &len );
if (len == sizeof(result)) result = *(struct unpack_dde_message_result *)ret_ptr;
free( params ); free( params );
if (!ret) continue; /* ignore it */ if (status) continue; /* ignore it */
info.msg.wParam = result.wparam; if (len == sizeof(*result))
info.msg.lParam = result.lparam; {
info.msg.wParam = result->wparam;
info.msg.lParam = result->lparam;
}
} }
*msg = info.msg; *msg = info.msg;
msg->pt = point_phys_to_win_dpi( info.msg.hwnd, info.msg.pt ); msg->pt = point_phys_to_win_dpi( info.msg.hwnd, info.msg.pt );

View file

@ -399,7 +399,6 @@ struct draw_text_params32
struct unpack_dde_message_params32 struct unpack_dde_message_params32
{ {
ULONG result;
ULONG hwnd; ULONG hwnd;
UINT message; UINT message;
LONG wparam; LONG wparam;
@ -1395,14 +1394,13 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size )
LONG wparam; LONG wparam;
LONG lparam; LONG lparam;
} *result32; } *result32;
void *ret_ptr;
ULONG ret_len; ULONG ret_len;
NTSTATUS status;
size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); size -= FIELD_OFFSET( struct unpack_dde_message_params, data );
if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct unpack_dde_message_params32, data[size] )))) if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct unpack_dde_message_params32, data[size] ))))
return 0; return STATUS_NO_MEMORY;
params32->result = 0;
params32->hwnd = HandleToUlong( params->hwnd ); params32->hwnd = HandleToUlong( params->hwnd );
params32->message = params->message; params32->message = params->message;
params32->wparam = params->wparam; params32->wparam = params->wparam;
@ -1410,18 +1408,14 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size )
if (size) memcpy( params32->data, params->data, size ); if (size) memcpy( params32->data, params->data, size );
size = FIELD_OFFSET( struct unpack_dde_message_params32, data[size] ); size = FIELD_OFFSET( struct unpack_dde_message_params32, data[size] );
if (!Wow64KiUserCallbackDispatcher( NtUserUnpackDDEMessage, params32, size, &ret_ptr, &ret_len )) status = Wow64KiUserCallbackDispatcher( NtUserUnpackDDEMessage, params32, size, (void **)&result32, &ret_len );
return FALSE; if (!status && ret_len == sizeof(*result32))
if (ret_len == sizeof(*result32))
{ {
result32 = ret_ptr;
result.wparam = result32->wparam; result.wparam = result32->wparam;
result.lparam = result32->lparam; result.lparam = result32->lparam;
return NtCallbackReturn( &result, sizeof(result), status );
} }
return status;
if (!params->result) NtCallbackReturn( &result, sizeof(result), TRUE );
*params->result = result;
return TRUE;
} }
static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size )

View file

@ -262,21 +262,19 @@ struct render_synthesized_format_params
}; };
/* NtUserUnpackDDEMessage params */ /* NtUserUnpackDDEMessage params */
struct unpack_dde_message_result
{
WPARAM wparam;
LPARAM lparam;
};
struct unpack_dde_message_params struct unpack_dde_message_params
{ {
struct unpack_dde_message_result *result; /* FIXME: Use NtCallbackReturn instead */
HWND hwnd; HWND hwnd;
UINT message; UINT message;
WPARAM wparam; WPARAM wparam;
LPARAM lparam; LPARAM lparam;
char data[1]; char data[1];
}; };
struct unpack_dde_message_result
{
WPARAM wparam;
LPARAM lparam;
};
/* process DPI awareness contexts */ /* process DPI awareness contexts */
#define NTUSER_DPI_UNAWARE 0x00006010 #define NTUSER_DPI_UNAWARE 0x00006010