Fixes a hang when closing Windows Media Player 10.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/user32/message.c | 8 +++++++- dlls/user32/tests/msg.c | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 860ceefc38d..b0ab5be902b 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3836,6 +3836,12 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT HANDLE server_queue = get_server_queue_handle(); unsigned int mask = QS_POSTMESSAGE | QS_SENDMESSAGE; /* Always selected */
+ if (hwnd && !IsWindow( hwnd )) + { + SetLastError( ERROR_INVALID_WINDOW_HANDLE ); + return -1; + } + USER_CheckNotLock(); check_for_driver_events( 0 );
@@ -3866,7 +3872,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageW( MSG *msg, HWND hwnd, UINT first, UINT BOOL WINAPI DECLSPEC_HOTPATCH GetMessageA( MSG *msg, HWND hwnd, UINT first, UINT last ) { if (get_pending_wmchar( msg, first, last, TRUE )) return TRUE; - GetMessageW( msg, hwnd, first, last ); + if (GetMessageW( msg, hwnd, first, last ) == -1) return -1; map_wparam_WtoA( msg, TRUE ); return (msg->message != WM_QUIT); } diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 91d3fcc4846..aa5b89d15ec 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -17692,6 +17692,17 @@ static void test_SendMessage_pump(void) DestroyWindow(hwnd); }
+static void test_invalid_window(void) +{ + MSG msg; + BOOL ret; + + SetLastError(0xdeadbeef); + ret = GetMessageA(&msg, (HWND)0xdeadbeef, 0, 0); + ok(ret == -1, "wrong ret %d\n", ret); + ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %u\n", GetLastError()); +} + static void init_funcs(void) { HMODULE hKernel32 = GetModuleHandleA("kernel32.dll"); @@ -17817,6 +17828,7 @@ START_TEST(msg) test_notify_message(); test_SetActiveWindow(); test_restore_messages(); + test_invalid_window();
if (!pTrackMouseEvent) win_skip("TrackMouseEvent is not available\n");