[PATCH v2 3/4] win32u: Use syscall interface for NtUserGetRawInputData.

Zebediah Figura wine at gitlab.winehq.org
Fri Jun 24 00:26:34 CDT 2022


From: Zebediah Figura <zfigura at codeweavers.com>

---
 dlls/win32u/gdiobj.c         |  1 -
 dlls/win32u/syscall.c        |  1 +
 dlls/win32u/win32u.spec      |  2 +-
 dlls/win32u/win32u_private.h |  2 -
 dlls/win32u/wrappers.c       |  6 ---
 dlls/wow64win/syscall.h      |  1 +
 dlls/wow64win/user.c         | 99 ++++++++++++++++++++++++++++++++++++
 7 files changed, 102 insertions(+), 10 deletions(-)

diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c
index 121ed4bbefd..0b148a628b3 100644
--- a/dlls/win32u/gdiobj.c
+++ b/dlls/win32u/gdiobj.c
@@ -1185,7 +1185,6 @@ static struct unix_funcs unix_funcs =
     NtUserGetPriorityClipboardFormat,
     NtUserGetQueueStatus,
     NtUserGetRawInputBuffer,
-    NtUserGetRawInputData,
     NtUserGetSystemMenu,
     NtUserGetUpdateRect,
     NtUserGetUpdateRgn,
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index ffb1529e03f..cf5615f4dde 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -145,6 +145,7 @@ static void * const syscalls[] =
     NtUserGetProcessDpiAwarenessContext,
     NtUserGetProcessWindowStation,
     NtUserGetProp,
+    NtUserGetRawInputData,
     NtUserGetSystemDpiForProcess,
     NtUserGetThreadDesktop,
     NtUserGetTitleBarInfo,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index 4a8d839007e..80bfb0bc253 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -984,7 +984,7 @@
 @ stdcall NtUserGetQueueStatus(long)
 @ stub NtUserGetQueueStatusReadonly
 @ stdcall NtUserGetRawInputBuffer(ptr ptr long)
-@ stdcall NtUserGetRawInputData(ptr long ptr ptr long)
+@ stdcall -syscall NtUserGetRawInputData(ptr long ptr ptr long)
 @ stub NtUserGetRawInputDeviceInfo
 @ stub NtUserGetRawInputDeviceList
 @ stub NtUserGetRawPointerDeviceData
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 51a3d752763..7b4b820d392 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -249,8 +249,6 @@ struct unix_funcs
     INT      (WINAPI *pNtUserGetPriorityClipboardFormat)( UINT *list, INT count );
     DWORD    (WINAPI *pNtUserGetQueueStatus)( UINT flags );
     UINT     (WINAPI *pNtUserGetRawInputBuffer)( RAWINPUT *data, UINT *data_size, UINT header_size );
-    UINT     (WINAPI *pNtUserGetRawInputData)( HRAWINPUT rawinput, UINT command,
-                                               void *data, UINT *data_size, UINT header_size );
     HMENU    (WINAPI *pNtUserGetSystemMenu)( HWND hwnd, BOOL revert );
     BOOL     (WINAPI *pNtUserGetUpdateRect)( HWND hwnd, RECT *rect, BOOL erase );
     INT      (WINAPI *pNtUserGetUpdateRgn)( HWND hwnd, HRGN hrgn, BOOL erase );
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index 05c25a006e9..a4504135314 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -1054,12 +1054,6 @@ UINT WINAPI DECLSPEC_HOTPATCH NtUserGetRawInputBuffer( RAWINPUT *data, UINT *dat
     return unix_funcs->pNtUserGetRawInputBuffer( data, data_size, header_size );
 }
 
-UINT WINAPI NtUserGetRawInputData( HRAWINPUT rawinput, UINT command, void *data, UINT *data_size, UINT header_size )
-{
-    if (!unix_funcs) return ~0u;
-    return unix_funcs->pNtUserGetRawInputData( rawinput, command, data, data_size, header_size );
-}
-
 BOOL WINAPI NtUserGetUpdatedClipboardFormats( UINT *formats, UINT size, UINT *out_size )
 {
     if (!unix_funcs) return FALSE;
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index e1364c2811e..6c4e12bf59a 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -132,6 +132,7 @@
     SYSCALL_ENTRY( NtUserGetProcessDpiAwarenessContext ) \
     SYSCALL_ENTRY( NtUserGetProcessWindowStation ) \
     SYSCALL_ENTRY( NtUserGetProp ) \
+    SYSCALL_ENTRY( NtUserGetRawInputData ) \
     SYSCALL_ENTRY( NtUserGetSystemDpiForProcess ) \
     SYSCALL_ENTRY( NtUserGetThreadDesktop ) \
     SYSCALL_ENTRY( NtUserGetTitleBarInfo ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 08b8fb6f2a0..8105b66654c 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -56,6 +56,14 @@ typedef struct
     POINT   pt;
 } MSG32;
 
+typedef struct
+{
+    DWORD dwType;
+    DWORD dwSize;
+    UINT32 hDevice;
+    UINT32 wParam;
+} RAWINPUTHEADER32;
+
 static MSG *msg_32to64( MSG *msg, MSG32 *msg32 )
 {
     if (!msg32) return NULL;
@@ -858,3 +866,94 @@ NTSTATUS WINAPI wow64_NtUserGetTitleBarInfo( UINT *args )
 
     return NtUserGetTitleBarInfo( hwnd, info );
 }
+
+NTSTATUS WINAPI wow64_NtUserGetRawInputData( UINT *args )
+{
+    HRAWINPUT handle = get_handle( &args );
+    UINT command = get_ulong( &args );
+    void *data = get_ptr( &args );
+    UINT *data_size = get_ptr( &args );
+    UINT header_size = get_ulong( &args );
+
+    if (header_size != sizeof(RAWINPUTHEADER32))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return ~0u;
+    }
+
+    switch (command)
+    {
+    case RID_INPUT:
+        if (data)
+        {
+            UINT data_size64, body_size, ret;
+            RAWINPUTHEADER32 *data32 = data;
+            RAWINPUTHEADER *data64 = NULL;
+
+            data_size64 = *data_size + sizeof(RAWINPUTHEADER);
+            if (!(data64 = Wow64AllocateTemp( data_size64 )))
+            {
+                SetLastError( STATUS_NO_MEMORY );
+                return ~0u;
+            }
+
+            ret = NtUserGetRawInputData( handle, command, data64, &data_size64, sizeof(RAWINPUTHEADER) );
+            if (ret == ~0u) return ret;
+
+            body_size = ret - sizeof(RAWINPUTHEADER);
+            if (*data_size < sizeof(RAWINPUTHEADER32) + body_size)
+            {
+                SetLastError( ERROR_INSUFFICIENT_BUFFER );
+                return ~0u;
+            }
+
+            data32->dwType = data64->dwType;
+            data32->dwSize = sizeof(RAWINPUTHEADER32) + body_size;
+            data32->hDevice = (UINT_PTR)data64->hDevice;
+            data32->wParam = data64->wParam;
+            memcpy( data32 + 1, data64 + 1, body_size );
+            return sizeof(RAWINPUTHEADER32) + body_size;
+        }
+        else
+        {
+            UINT data_size64, ret;
+
+            ret = NtUserGetRawInputData( handle, command, NULL, &data_size64, sizeof(RAWINPUTHEADER) );
+            if (ret == ~0u) return ret;
+            *data_size = data_size64 - sizeof(RAWINPUTHEADER) + sizeof(RAWINPUTHEADER32);
+            return 0;
+        }
+
+    case RID_HEADER:
+    {
+        UINT data_size64 = sizeof(RAWINPUTHEADER);
+        RAWINPUTHEADER32 *data32 = data;
+        RAWINPUTHEADER data64;
+        UINT ret;
+
+        if (!data)
+        {
+            *data_size = sizeof(RAWINPUTHEADER32);
+            return 0;
+        }
+
+        if (*data_size < sizeof(RAWINPUTHEADER32))
+        {
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
+            return ~0u;
+        }
+
+        ret = NtUserGetRawInputData( handle, command, &data64, &data_size64, sizeof(RAWINPUTHEADER) );
+        if (ret == ~0u) return ret;
+        data32->dwType = data64.dwType;
+        data32->dwSize = data64.dwSize - sizeof(RAWINPUTHEADER) + sizeof(RAWINPUTHEADER32);
+        data32->hDevice = (UINT_PTR)data64.hDevice;
+        data32->wParam = data64.wParam;
+        return sizeof(RAWINPUTHEADER32);
+    }
+
+    default:
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return ~0u;
+    }
+}
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/271



More information about the wine-devel mailing list