Jacek Caban : wow64win: Fix NtUserGetMouseMovePointsEx thunk.

Alexandre Julliard julliard at winehq.org
Tue Aug 16 16:02:11 CDT 2022


Module: wine
Branch: master
Commit: fbcc124e0daba6ff3f649fae856b0b19138a30ef
URL:    https://gitlab.winehq.org/wine/wine/-/commit/fbcc124e0daba6ff3f649fae856b0b19138a30ef

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Aug 16 14:43:24 2022 +0200

wow64win: Fix NtUserGetMouseMovePointsEx thunk.

---

 dlls/wow64win/user.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)

diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index bb17e034eb2..8fb70c39fb5 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -119,6 +119,14 @@ typedef struct
     } DUMMYUNIONNAME;
 } INPUT32;
 
+typedef struct
+{
+    int x;
+    int y;
+    DWORD time;
+    ULONG dwExtraInfo;
+} MOUSEMOVEPOINT32;
+
 typedef struct
 {
     UINT32 hdc;
@@ -2107,12 +2115,45 @@ NTSTATUS WINAPI wow64_NtUserGetMessage( UINT *args )
 NTSTATUS WINAPI wow64_NtUserGetMouseMovePointsEx( UINT *args )
 {
     UINT size = get_ulong( &args );
-    MOUSEMOVEPOINT *ptin = get_ptr( &args );
-    MOUSEMOVEPOINT *ptout = get_ptr( &args );
+    MOUSEMOVEPOINT32 *ptin32 = get_ptr( &args );
+    MOUSEMOVEPOINT32 *ptout32 = get_ptr( &args );
     int count = get_ulong( &args );
     DWORD resolution = get_ulong( &args );
 
-    return NtUserGetMouseMovePointsEx( size, ptin, ptout, count, resolution );
+    MOUSEMOVEPOINT ptin[64], ptout[64];
+    int ret, i;
+
+    if (size != sizeof(MOUSEMOVEPOINT32) || count < 0 || count > ARRAYSIZE( ptin ))
+    {
+        RtlSetLastWin32Error( ERROR_INVALID_PARAMETER );
+        return -1;
+    }
+
+    if (!ptin32 || (!ptout32 && count))
+    {
+        set_last_error32( ERROR_NOACCESS );
+        return -1;
+    }
+
+    for (i = 0; i < count; i++)
+    {
+        ptin[i].x = ptin32[i].x;
+        ptin[i].y = ptin32[i].y;
+        ptin[i].time = ptin32[i].time;
+        ptin[i].dwExtraInfo = ptin32[i].dwExtraInfo;
+    }
+
+    ret = NtUserGetMouseMovePointsEx( sizeof(MOUSEMOVEPOINT), ptin, ptout, count, resolution );
+
+    for (i = 0; i < ret; i++)
+    {
+        ptout32[i].x = ptout[i].x;
+        ptout32[i].y = ptout[i].y;
+        ptout32[i].time = ptout[i].time;
+        ptout32[i].dwExtraInfo = ptout[i].dwExtraInfo;
+    }
+
+    return ret;
 }
 
 NTSTATUS WINAPI wow64_NtUserGetObjectInformation( UINT *args )




More information about the wine-cvs mailing list