From: Kira Backes Subject: [PATCH v2] user32: Implement MOUSEHOOKSTRUCTEX Message-Id: Date: Mon, 21 Dec 2015 13:01:01 +0100 From a66c059284a6738b0188f64a67e5c92553a4787a Mon Sep 17 00:00:00 2001 From: Kira Backes Date: Mon, 21 Dec 2015 11:42:31 +0100 Subject: [PATCH] user32: Implement MOUSEHOOKSTRUCTEX - Fixes out-of-bounds access for programs which cast to MOUSEHOOKSTRUCTEX - Fixes mouse wheel support for those programs - Fixes Bug 38314 Signed-off-by: Kira Backes --- dlls/user32/message.c | 22 +++++++++------ dlls/user32/tests/generated.c | 65 +++++++++++++++++++++++++++++++++++++++++++ include/winuser.h | 6 ++++ tools/winapi/tests.dat | 3 ++ 4 files changed, 87 insertions(+), 9 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 96e7f2e..38e7555 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2488,7 +2488,7 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H INT hittest; EVENTMSG event; GUITHREADINFO info; - MOUSEHOOKSTRUCT hook; + MOUSEHOOKSTRUCTEX hook; BOOL eatMsg; /* find the window to dispatch this mouse message to */ @@ -2584,17 +2584,21 @@ static BOOL process_mouse_message( MSG *msg, UINT hw_id, ULONG_PTR extra_info, H /* message is accepted now (but may still get dropped) */ - hook.pt = msg->pt; - hook.hwnd = msg->hwnd; - hook.wHitTestCode = hittest; - hook.dwExtraInfo = extra_info; + hook.MOUSEHOOKSTRUCT.pt = msg->pt; + hook.MOUSEHOOKSTRUCT.hwnd = msg->hwnd; + hook.MOUSEHOOKSTRUCT.wHitTestCode = hittest; + hook.MOUSEHOOKSTRUCT.dwExtraInfo = extra_info; + /* the correct mouseData for the events WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, + * WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, and WM_NCXBUTTONDBLCLK is not yet implemented */ + hook.mouseData = (msg->message == WM_MOUSEWHEEL ? msg->wParam : 0); if (HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE, message, (LPARAM)&hook, TRUE )) { - hook.pt = msg->pt; - hook.hwnd = msg->hwnd; - hook.wHitTestCode = hittest; - hook.dwExtraInfo = extra_info; + hook.MOUSEHOOKSTRUCT.pt = msg->pt; + hook.MOUSEHOOKSTRUCT.hwnd = msg->hwnd; + hook.MOUSEHOOKSTRUCT.wHitTestCode = hittest; + hook.MOUSEHOOKSTRUCT.dwExtraInfo = extra_info; + hook.mouseData = (msg->message == WM_MOUSEWHEEL ? msg->wParam : 0); HOOK_CallHooks( WH_CBT, HCBT_CLICKSKIPPED, message, (LPARAM)&hook, TRUE ); accept_hardware_message( hw_id, TRUE ); return FALSE; diff --git a/dlls/user32/tests/generated.c b/dlls/user32/tests/generated.c index 2107a44..b3ef152 100644 --- a/dlls/user32/tests/generated.c +++ b/dlls/user32/tests/generated.c @@ -1467,6 +1467,15 @@ static void test_pack_LPMOUSEHOOKSTRUCT(void) TEST_TARGET_ALIGN(LPMOUSEHOOKSTRUCT, 8) } +static void test_pack_LPMOUSEHOOKSTRUCTEX(void) +{ + /* LPMOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (LPMOUSEHOOKSTRUCTEX, 8) + TEST_TYPE_ALIGN (LPMOUSEHOOKSTRUCTEX, 8) + TEST_TARGET_SIZE (LPMOUSEHOOKSTRUCTEX, 40) + TEST_TARGET_ALIGN(LPMOUSEHOOKSTRUCTEX, 8) +} + static void test_pack_LPMOUSEINPUT(void) { /* LPMOUSEINPUT */ @@ -2131,6 +2140,19 @@ static void test_pack_MOUSEHOOKSTRUCT(void) TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, dwExtraInfo, 24) } +static void test_pack_MOUSEHOOKSTRUCTEX(void) +{ + /* MOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (MOUSEHOOKSTRUCTEX, 40) + TEST_TYPE_ALIGN (MOUSEHOOKSTRUCTEX, 8) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 32) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 8) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 0) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCTEX, mouseData, 4) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCTEX, mouseData, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCTEX, mouseData, 32) +} + static void test_pack_MOUSEINPUT(void) { /* MOUSEINPUT */ @@ -2808,6 +2830,15 @@ static void test_pack_PMOUSEHOOKSTRUCT(void) TEST_TARGET_ALIGN(PMOUSEHOOKSTRUCT, 8) } +static void test_pack_PMOUSEHOOKSTRUCTEX(void) +{ + /* PMOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (PMOUSEHOOKSTRUCTEX, 8) + TEST_TYPE_ALIGN (PMOUSEHOOKSTRUCTEX, 8) + TEST_TARGET_SIZE (PMOUSEHOOKSTRUCTEX, 40) + TEST_TARGET_ALIGN(PMOUSEHOOKSTRUCTEX, 8) +} + static void test_pack_PMOUSEINPUT(void) { /* PMOUSEINPUT */ @@ -4971,6 +5002,15 @@ static void test_pack_LPMOUSEHOOKSTRUCT(void) TEST_TARGET_ALIGN(LPMOUSEHOOKSTRUCT, 4) } +static void test_pack_LPMOUSEHOOKSTRUCTEX(void) +{ + /* LPMOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (LPMOUSEHOOKSTRUCTEX, 4) + TEST_TYPE_ALIGN (LPMOUSEHOOKSTRUCTEX, 4) + TEST_TARGET_SIZE (LPMOUSEHOOKSTRUCTEX, 24) + TEST_TARGET_ALIGN(LPMOUSEHOOKSTRUCTEX, 4) +} + static void test_pack_LPMOUSEINPUT(void) { /* LPMOUSEINPUT */ @@ -5635,6 +5675,19 @@ static void test_pack_MOUSEHOOKSTRUCT(void) TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, dwExtraInfo, 16) } +static void test_pack_MOUSEHOOKSTRUCTEX(void) +{ + /* MOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (MOUSEHOOKSTRUCTEX, 24) + TEST_TYPE_ALIGN (MOUSEHOOKSTRUCTEX, 4) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 20) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCTEX, MOUSEHOOKSTRUCT, 0) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCTEX, mouseData, 4) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCTEX, mouseData, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCTEX, mouseData, 20) +} + static void test_pack_MOUSEINPUT(void) { /* MOUSEINPUT */ @@ -6312,6 +6365,15 @@ static void test_pack_PMOUSEHOOKSTRUCT(void) TEST_TARGET_ALIGN(PMOUSEHOOKSTRUCT, 4) } +static void test_pack_PMOUSEHOOKSTRUCTEX(void) +{ + /* PMOUSEHOOKSTRUCTEX */ + TEST_TYPE_SIZE (PMOUSEHOOKSTRUCTEX, 4) + TEST_TYPE_ALIGN (PMOUSEHOOKSTRUCTEX, 4) + TEST_TARGET_SIZE (PMOUSEHOOKSTRUCTEX, 24) + TEST_TARGET_ALIGN(PMOUSEHOOKSTRUCTEX, 4) +} + static void test_pack_PMOUSEINPUT(void) { /* PMOUSEINPUT */ @@ -7189,6 +7251,7 @@ static void test_pack(void) test_pack_LPMONITORINFOEXA(); test_pack_LPMONITORINFOEXW(); test_pack_LPMOUSEHOOKSTRUCT(); + test_pack_LPMOUSEHOOKSTRUCTEX(); test_pack_LPMOUSEINPUT(); test_pack_LPMOUSEKEYS(); test_pack_LPMSG(); @@ -7236,6 +7299,7 @@ static void test_pack(void) test_pack_MONITORINFOEXA(); test_pack_MONITORINFOEXW(); test_pack_MOUSEHOOKSTRUCT(); + test_pack_MOUSEHOOKSTRUCTEX(); test_pack_MOUSEINPUT(); test_pack_MOUSEKEYS(); test_pack_MSG(); @@ -7284,6 +7348,7 @@ static void test_pack(void) test_pack_PMINIMIZEDMETRICS(); test_pack_PMINMAXINFO(); test_pack_PMOUSEHOOKSTRUCT(); + test_pack_PMOUSEHOOKSTRUCTEX(); test_pack_PMOUSEINPUT(); test_pack_PMSG(); test_pack_PMSGBOXPARAMSA(); diff --git a/include/winuser.h b/include/winuser.h index 50821f4..d9d15ed 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -385,6 +385,12 @@ typedef struct ULONG_PTR dwExtraInfo; } MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT, *LPMOUSEHOOKSTRUCT; +typedef struct +{ + MOUSEHOOKSTRUCT MOUSEHOOKSTRUCT; + DWORD mouseData; +} MOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX; + /* Hardware hook structure */ diff --git a/tools/winapi/tests.dat b/tools/winapi/tests.dat index 9179d94..ba4bbd1 100644 --- a/tools/winapi/tests.dat +++ b/tools/winapi/tests.dat @@ -1432,6 +1432,7 @@ LPMONITORINFO LPMONITORINFOEXA LPMONITORINFOEXW LPMOUSEHOOKSTRUCT +LPMOUSEHOOKSTRUCTEX LPMOUSEINPUT LPMOUSEKEYS LPMSG @@ -1480,6 +1481,7 @@ MONITORINFO MONITORINFOEXA MONITORINFOEXW MOUSEHOOKSTRUCT +MOUSEHOOKSTRUCTEX MOUSEINPUT MOUSEKEYS MSG @@ -1528,6 +1530,7 @@ PMENUITEMTEMPLATEHEADER PMINIMIZEDMETRICS PMINMAXINFO PMOUSEHOOKSTRUCT +PMOUSEHOOKSTRUCTEX PMOUSEINPUT PMSG PMSGBOXPARAMSA -- 2.6.2