user32: Return result through NtCallbackReturn for the DDE message callback.
This commit is contained in:
parent
386e9fef2b
commit
85e351abaf
4 changed files with 26 additions and 33 deletions
|
@ -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] =
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue