win32u: Move NtUserCallMsgFilter implementation from user32.

A/W conversion is not used in those cases anyway, so just use a single implementation.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2022-04-15 17:25:57 +02:00 committed by Alexandre Julliard
parent 7256519102
commit 70d3e41d64
14 changed files with 119 additions and 32 deletions

View File

@ -1164,7 +1164,7 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg )
if (!IsWindow( hwndDlg ))
return FALSE;
if (CallMsgFilterW( msg, MSGF_DIALOGBOX )) return TRUE;
if (NtUserCallMsgFilter( msg, MSGF_DIALOGBOX )) return TRUE;
hwndDlg = WIN_GetFullHandle( hwndDlg );
if (is_desktop_window(hwndDlg)) return FALSE;

View File

@ -383,26 +383,6 @@ BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC proc )
}
/***********************************************************************
* CallMsgFilterA (USER32.@)
*/
BOOL WINAPI CallMsgFilterA( LPMSG msg, INT code )
{
if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg, FALSE )) return TRUE;
return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg, FALSE );
}
/***********************************************************************
* CallMsgFilterW (USER32.@)
*/
BOOL WINAPI CallMsgFilterW( LPMSG msg, INT code )
{
if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg, TRUE )) return TRUE;
return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg, TRUE );
}
/***********************************************************************
* SetWinEventHook [USER32.@]
*

View File

@ -2974,7 +2974,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
{
if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ))
{
if (!CallMsgFilterW( &msg, MSGF_MENU )) break;
if (!NtUserCallMsgFilter( &msg, MSGF_MENU )) break;
/* remove the message from the queue */
PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
}

View File

@ -1249,7 +1249,7 @@ static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
BOOL oldstate = pressed;
if (!GetMessageW( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST )) break;
if (CallMsgFilterW( &msg, MSGF_MAX )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_MAX )) continue;
if(msg.message == WM_LBUTTONUP)
break;
@ -1314,7 +1314,7 @@ static void NC_TrackCloseButton (HWND hwnd, WPARAM wParam, LPARAM lParam)
BOOL oldstate = pressed;
if (!GetMessageW( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST )) break;
if (CallMsgFilterW( &msg, MSGF_MAX )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_MAX )) continue;
if(msg.message == WM_LBUTTONUP)
break;
@ -1464,7 +1464,7 @@ LRESULT NC_HandleNCRButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
for (;;)
{
if (!GetMessageW( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST )) break;
if (CallMsgFilterW( &msg, MSGF_MAX )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_MAX )) continue;
if (msg.message == WM_RBUTTONUP)
{
hittest = NC_HandleNCHitTest( hwnd, msg.pt );

View File

@ -1110,7 +1110,7 @@ void SCROLL_TrackScrollBar( HWND hwnd, INT scrollbar, POINT pt )
do
{
if (!GetMessageW( &msg, 0, 0, 0 )) break;
if (CallMsgFilterW( &msg, MSGF_SCROLLBAR )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_SCROLLBAR )) continue;
if (msg.message == WM_LBUTTONUP ||
msg.message == WM_MOUSEMOVE ||
msg.message == WM_MOUSELEAVE ||

View File

@ -25,9 +25,9 @@
# @ stub BuildReasonArray
@ stdcall CalcChildScroll(long long)
@ stdcall CalcMenuBar(long long long long ptr) CalcMenuBar
@ stdcall CallMsgFilter(ptr long) CallMsgFilterA
@ stdcall CallMsgFilterA(ptr long)
@ stdcall CallMsgFilterW(ptr long)
@ stdcall CallMsgFilter(ptr long) NtUserCallMsgFilter
@ stdcall CallMsgFilterA(ptr long) NtUserCallMsgFilter
@ stdcall CallMsgFilterW(ptr long) NtUserCallMsgFilter
@ stdcall CallNextHookEx(long long long long) NtUserCallNextHookEx
@ stdcall CallWindowProcA(ptr long long long long)
@ stdcall CallWindowProcW(ptr long long long long)

View File

@ -786,7 +786,7 @@ static LONG start_size_move( HWND hwnd, WPARAM wParam, POINT *capturePoint, LONG
while(!hittest)
{
if (!GetMessageW( &msg, 0, 0, 0 )) return 0;
if (CallMsgFilterW( &msg, MSGF_SIZE )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_SIZE )) continue;
switch(msg.message)
{
@ -952,7 +952,7 @@ void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam )
int dx = 0, dy = 0;
if (!GetMessageW( &msg, 0, 0, 0 )) break;
if (CallMsgFilterW( &msg, MSGF_SIZE )) continue;
if (NtUserCallMsgFilter( &msg, MSGF_SIZE )) continue;
/* Exit on button-up, Return, or Esc */
if ((msg.message == WM_LBUTTONUP) ||

View File

@ -172,6 +172,17 @@ BOOL unhook_windows_hook( INT id, HOOKPROC proc )
return !status;
}
/***********************************************************************
* NtUserCallMsgFilter (win32u.@)
*/
BOOL WINAPI NtUserCallMsgFilter( MSG *msg, INT code )
{
/* FIXME: We should use NtCallbackReturn instead of passing (potentially kernel) pointer
* like that, but we need to consequently use syscall thunks first for that to work. */
if (call_hooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg, TRUE )) return TRUE;
return call_hooks( WH_MSGFILTER, code, 0, (LPARAM)msg, TRUE );
}
static UINT get_ll_hook_timeout(void)
{
/* FIXME: should retrieve LowLevelHooksTimeout in HKEY_CURRENT_USER\Control Panel\Desktop */

View File

@ -106,6 +106,7 @@ static void * const syscalls[] =
NtUserAddClipboardFormatListener,
NtUserAttachThreadInput,
NtUserBuildHwndList,
NtUserCallMsgFilter,
NtUserCheckMenuItem,
NtUserChildWindowFromPointEx,
NtUserCloseDesktop,

View File

@ -579,6 +579,50 @@ static void test_menu(void)
ok( ret, "NtUserDestroyMenu failed: %lu\n", GetLastError() );
}
static MSG *msg_ptr;
static LRESULT WINAPI hook_proc( INT code, WPARAM wparam, LPARAM lparam )
{
msg_ptr = (MSG *)lparam;
ok( code == 100, "code = %d\n", code );
ok( msg_ptr->time == 1, "time = %lx\n", msg_ptr->time );
ok( msg_ptr->wParam == 10, "wParam = %Ix\n", msg_ptr->wParam );
ok( msg_ptr->lParam == 20, "lParam = %Ix\n", msg_ptr->lParam );
msg_ptr->time = 3;
msg_ptr->wParam = 1;
msg_ptr->lParam = 2;
return CallNextHookEx( NULL, code, wparam, lparam );
}
static void test_message_filter(void)
{
HHOOK hook;
MSG msg;
BOOL ret;
hook = SetWindowsHookExW( WH_MSGFILTER, hook_proc, NULL, GetCurrentThreadId() );
ok( hook != NULL, "SetWindowsHookExW failed\n");
memset( &msg, 0, sizeof(msg) );
msg.time = 1;
msg.wParam = 10;
msg.lParam = 20;
ret = NtUserCallMsgFilter( &msg, 100 );
ok( !ret, "CallMsgFilterW returned: %x\n", ret );
todo_wine
ok( msg_ptr != &msg, "our ptr was passed directly to hook\n" );
if (sizeof(void *) == 8) /* on some Windows versions, msg is not modified on wow64 */
{
ok( msg.time == 3, "time = %lx\n", msg.time );
ok( msg.wParam == 1, "wParam = %Ix\n", msg.wParam );
ok( msg.lParam == 2, "lParam = %Ix\n", msg.lParam );
}
ret = NtUserUnhookWindowsHookEx( hook );
ok( ret, "NtUserUnhookWindowsHook failed: %lu\n", GetLastError() );
}
START_TEST(win32u)
{
/* native win32u.dll fails if user32 is not loaded, so make sure it's fully initialized */
@ -592,6 +636,7 @@ START_TEST(win32u)
test_message_call();
test_window_text();
test_menu();
test_message_filter();
test_NtUserCloseWindowStation();
}

View File

@ -776,7 +776,7 @@
@ stub NtUserCallHwndParamLock
@ stub NtUserCallHwndParamLockSafe
@ stub NtUserCallHwndSafe
@ stub NtUserCallMsgFilter
@ stdcall -syscall NtUserCallMsgFilter(ptr long)
@ stdcall NtUserCallNextHookEx(long long long long)
@ stdcall NtUserCallNoParam(long)
@ stdcall NtUserCallOneParam(long long)

View File

@ -93,6 +93,7 @@
SYSCALL_ENTRY( NtUserAddClipboardFormatListener ) \
SYSCALL_ENTRY( NtUserAttachThreadInput ) \
SYSCALL_ENTRY( NtUserBuildHwndList ) \
SYSCALL_ENTRY( NtUserCallMsgFilter ) \
SYSCALL_ENTRY( NtUserCheckMenuItem ) \
SYSCALL_ENTRY( NtUserChildWindowFromPointEx ) \
SYSCALL_ENTRY( NtUserCloseDesktop ) \

View File

@ -46,6 +46,42 @@ typedef struct
UINT32 hbmpItem;
} MENUITEMINFOW32;
typedef struct
{
UINT32 hwnd;
UINT message;
UINT32 wParam;
UINT32 lParam;
DWORD time;
POINT pt;
} MSG32;
static MSG *msg_32to64( MSG *msg, MSG32 *msg32 )
{
if (!msg32) return NULL;
msg->hwnd = UlongToHandle( msg32->hwnd );
msg->message = msg32->message;
msg->wParam = msg32->wParam;
msg->lParam = msg32->lParam;
msg->time = msg32->time;
msg->pt = msg32->pt;
return msg;
}
static MSG32 *msg_64to32( MSG *msg, MSG32 *msg32 )
{
if (!msg32) return NULL;
msg32->hwnd = HandleToUlong( msg->hwnd );
msg32->message = msg->message;
msg32->wParam = msg->wParam;
msg32->lParam = msg->lParam;
msg32->time = msg->time;
msg32->pt = msg->pt;
return msg32;
}
NTSTATUS WINAPI wow64_NtUserInitializeClientPfnArrays( UINT *args )
{
FIXME( "\n" );
@ -555,6 +591,18 @@ NTSTATUS WINAPI wow64_NtUserUnhookWindowsHookEx( UINT *args )
return NtUserUnhookWindowsHookEx( handle );
}
NTSTATUS WINAPI wow64_NtUserCallMsgFilter( UINT *args )
{
MSG32 *msg32 = get_ptr( &args );
INT code = get_ulong( &args );
MSG msg;
BOOL ret;
ret = NtUserCallMsgFilter( msg_32to64( &msg, msg32 ), code );
msg_64to32( &msg, msg32 );
return ret;
}
NTSTATUS WINAPI wow64_NtUserGetForegroundWindow( UINT *args )
{
return HandleToUlong( NtUserGetForegroundWindow() );

View File

@ -462,6 +462,7 @@ NTSTATUS WINAPI NtUserBuildHwndList( HDESK desktop, ULONG unk2, ULONG unk3, ULON
ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code );
ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code );
LRESULT WINAPI NtUserCallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam );
BOOL WINAPI NtUserCallMsgFilter( MSG *msg, INT code );
ULONG_PTR WINAPI NtUserCallNoParam( ULONG code );
ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code );
ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code );