[PATCH] user32: Implement MOUSEHOOKSTRUCTEX

Kira Backes kira.backes at nrwsoft.de
Mon Dec 21 05:14:44 CST 2015


- 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 <kira.backes at nrwsoft.de>
---
 dlls/user32/message.c  | 28 ++++++++++++++++------------
 include/winuser.h      |  6 ++++++
 tools/winapi/tests.dat |  3 +++
 3 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 96e7f2e..c1fc45d 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 hookEx;
     BOOL eatMsg;

     /* find the window to dispatch this mouse message to */
@@ -2584,18 +2584,22 @@ 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;
+    hookEx.MOUSEHOOKSTRUCT.pt           = msg->pt;
+    hookEx.MOUSEHOOKSTRUCT.hwnd         = msg->hwnd;
+    hookEx.MOUSEHOOKSTRUCT.wHitTestCode = hittest;
+    hookEx.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 */
+    hookEx.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_CallHooks( WH_CBT, HCBT_CLICKSKIPPED, message,
(LPARAM)&hook, TRUE );
+                        message, (LPARAM)&hookEx, TRUE ))
+    {
+        hookEx.MOUSEHOOKSTRUCT.pt           = msg->pt;
+        hookEx.MOUSEHOOKSTRUCT.hwnd         = msg->hwnd;
+        hookEx.MOUSEHOOKSTRUCT.wHitTestCode = hittest;
+        hookEx.MOUSEHOOKSTRUCT.dwExtraInfo  = extra_info;
+        hookEx.mouseData                    = (msg->message ==
WM_MOUSEWHEEL ? msg->wParam : 0);
+        HOOK_CallHooks( WH_CBT, HCBT_CLICKSKIPPED, message,
(LPARAM)&hookEx, TRUE );
         accept_hardware_message( hw_id, TRUE );
         return FALSE;
     }
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



More information about the wine-patches mailing list