[PATCH 1/4] win32u: Move NtUserRegisterRawInputDevices from user32.
Zebediah Figura
wine at gitlab.winehq.org
Sat Jun 25 11:57:52 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/user32/rawinput.c | 63 -----------------------------------------
dlls/user32/user32.spec | 2 +-
dlls/win32u/rawinput.c | 61 +++++++++++++++++++++++++++++++++++++++
dlls/win32u/syscall.c | 1 +
dlls/win32u/win32u.spec | 2 +-
dlls/wow64win/syscall.h | 1 +
dlls/wow64win/user.c | 40 ++++++++++++++++++++++++++
include/ntuser.h | 1 +
8 files changed, 106 insertions(+), 65 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index d6290f08d12..1b02be1398d 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -401,69 +401,6 @@ UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_coun
return rawinput_devices_count;
}
-/***********************************************************************
- * RegisterRawInputDevices (USER32.@)
- */
-BOOL WINAPI DECLSPEC_HOTPATCH RegisterRawInputDevices(const RAWINPUTDEVICE *devices, UINT device_count, UINT size)
-{
- struct rawinput_device *d;
- BOOL ret;
- UINT i;
-
- TRACE("devices %p, device_count %u, size %u.\n", devices, device_count, size);
-
- if (size != sizeof(*devices))
- {
- WARN("Invalid structure size %u.\n", size);
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- for (i = 0; i < device_count; ++i)
- {
- if ((devices[i].dwFlags & RIDEV_INPUTSINK) &&
- (devices[i].hwndTarget == NULL))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- if ((devices[i].dwFlags & RIDEV_REMOVE) &&
- (devices[i].hwndTarget != NULL))
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- }
-
- if (!(d = HeapAlloc( GetProcessHeap(), 0, device_count * sizeof(*d) ))) return FALSE;
-
- for (i = 0; i < device_count; ++i)
- {
- TRACE("device %u: page %#x, usage %#x, flags %#lx, target %p.\n",
- i, devices[i].usUsagePage, devices[i].usUsage,
- devices[i].dwFlags, devices[i].hwndTarget);
- if (devices[i].dwFlags & ~(RIDEV_REMOVE|RIDEV_NOLEGACY|RIDEV_INPUTSINK|RIDEV_DEVNOTIFY))
- FIXME("Unhandled flags %#lx for device %u.\n", devices[i].dwFlags, i);
-
- d[i].usage_page = devices[i].usUsagePage;
- d[i].usage = devices[i].usUsage;
- d[i].flags = devices[i].dwFlags;
- d[i].target = wine_server_user_handle( devices[i].hwndTarget );
- }
-
- SERVER_START_REQ( update_rawinput_devices )
- {
- wine_server_add_data( req, d, device_count * sizeof(*d) );
- ret = !wine_server_call( req );
- }
- SERVER_END_REQ;
-
- HeapFree( GetProcessHeap(), 0, d );
-
- return ret;
-}
-
/***********************************************************************
* GetRawInputDeviceInfoA (USER32.@)
*/
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 887394227a3..dbe2a4c1430 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -605,7 +605,7 @@
@ stub RegisterNetworkCapabilities
@ stdcall RegisterPointerDeviceNotifications(long long)
@ stdcall RegisterPowerSettingNotification(long ptr long)
-@ stdcall RegisterRawInputDevices(ptr long long)
+@ stdcall RegisterRawInputDevices(ptr long long) NtUserRegisterRawInputDevices
@ stdcall RegisterServicesProcess(long)
@ stdcall RegisterShellHookWindow (long)
@ stdcall RegisterSuspendResumeNotification(long long)
diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c
index d6d4e0c13f7..359faa39083 100644
--- a/dlls/win32u/rawinput.c
+++ b/dlls/win32u/rawinput.c
@@ -366,3 +366,64 @@ BOOL process_rawinput_message( MSG *msg, UINT hw_id, const struct hardware_msg_d
msg->pt = point_phys_to_win_dpi( msg->hwnd, msg->pt );
return TRUE;
}
+
+/**********************************************************************
+ * NtUserRegisterRawInputDevices (win32u.@)
+ */
+BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT device_count, UINT size )
+{
+ struct rawinput_device *server_devices;
+ BOOL ret;
+ UINT i;
+
+ TRACE( "devices %p, device_count %u, size %u.\n", devices, device_count, size );
+
+ if (size != sizeof(*devices))
+ {
+ WARN( "Invalid structure size %u.\n", size );
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ for (i = 0; i < device_count; ++i)
+ {
+ if ((devices[i].dwFlags & RIDEV_INPUTSINK) && !devices[i].hwndTarget)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ if ((devices[i].dwFlags & RIDEV_REMOVE) && devices[i].hwndTarget)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ }
+
+ if (!(server_devices = malloc( device_count * sizeof(*server_devices) ))) return FALSE;
+
+ for (i = 0; i < device_count; ++i)
+ {
+ TRACE( "device %u: page %#x, usage %#x, flags %#x, target %p.\n",
+ i, devices[i].usUsagePage, devices[i].usUsage,
+ devices[i].dwFlags, devices[i].hwndTarget );
+ if (devices[i].dwFlags & ~(RIDEV_REMOVE|RIDEV_NOLEGACY|RIDEV_INPUTSINK|RIDEV_DEVNOTIFY))
+ FIXME( "Unhandled flags %#x for device %u.\n", devices[i].dwFlags, i );
+
+ server_devices[i].usage_page = devices[i].usUsagePage;
+ server_devices[i].usage = devices[i].usUsage;
+ server_devices[i].flags = devices[i].dwFlags;
+ server_devices[i].target = wine_server_user_handle( devices[i].hwndTarget );
+ }
+
+ SERVER_START_REQ( update_rawinput_devices )
+ {
+ wine_server_add_data( req, server_devices, device_count * sizeof(*server_devices) );
+ ret = !wine_server_call( req );
+ }
+ SERVER_END_REQ;
+
+ free( server_devices );
+
+ return ret;
+}
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 12af30f6c98..3f2c596f727 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -160,6 +160,7 @@ static void * const syscalls[] =
NtUserOpenDesktop,
NtUserOpenInputDesktop,
NtUserOpenWindowStation,
+ NtUserRegisterRawInputDevices,
NtUserRemoveClipboardFormatListener,
NtUserRemoveMenu,
NtUserRemoveProp,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index c71f0d20429..687ef3af8dc 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -1130,7 +1130,7 @@
@ stub NtUserRegisterManipulationThread
@ stub NtUserRegisterPointerDeviceNotifications
@ stub NtUserRegisterPointerInputTarget
-@ stub NtUserRegisterRawInputDevices
+@ stdcall -syscall NtUserRegisterRawInputDevices(ptr long long)
@ stub NtUserRegisterServicesProcess
@ stub NtUserRegisterSessionPort
@ stub NtUserRegisterShellPTPListener
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index 618a7990554..531f9f7f9cd 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -147,6 +147,7 @@
SYSCALL_ENTRY( NtUserOpenDesktop ) \
SYSCALL_ENTRY( NtUserOpenInputDesktop ) \
SYSCALL_ENTRY( NtUserOpenWindowStation ) \
+ SYSCALL_ENTRY( NtUserRegisterRawInputDevices ) \
SYSCALL_ENTRY( NtUserRemoveClipboardFormatListener ) \
SYSCALL_ENTRY( NtUserRemoveMenu ) \
SYSCALL_ENTRY( NtUserRemoveProp ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 9c6730b24ae..5c110c7c97b 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -64,6 +64,14 @@ typedef struct
UINT32 wParam;
} RAWINPUTHEADER32;
+typedef struct
+{
+ USHORT usUsagePage;
+ USHORT usUsage;
+ DWORD dwFlags;
+ UINT32 hwndTarget;
+} RAWINPUTDEVICE32;
+
static MSG *msg_32to64( MSG *msg, MSG32 *msg32 )
{
if (!msg32) return NULL;
@@ -975,3 +983,35 @@ NTSTATUS WINAPI wow64_NtUserGetRawInputBuffer( UINT *args )
* whether it's operating under WoW64 or not. */
return NtUserGetRawInputBuffer( data, data_size, sizeof(RAWINPUTHEADER) );
}
+
+NTSTATUS WINAPI wow64_NtUserRegisterRawInputDevices( UINT *args )
+{
+ const RAWINPUTDEVICE *devices32 = get_ptr( &args );
+ UINT count = get_ulong( &args );
+ UINT size = get_ulong( &args );
+
+ RAWINPUTDEVICE *devices64;
+ unsigned int i;
+
+ if (size != sizeof(RAWINPUTDEVICE32))
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ if (!(devices64 = Wow64AllocateTemp( count * sizeof(*devices64) )))
+ {
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ return FALSE;
+ }
+
+ for (i = 0; i < count; ++i)
+ {
+ devices64[i].usUsagePage = devices32[i].usUsagePage;
+ devices64[i].usUsage = devices32[i].usUsage;
+ devices64[i].dwFlags = devices32[i].dwFlags;
+ devices64[i].hwndTarget = devices32[i].hwndTarget;
+ }
+
+ return NtUserRegisterRawInputDevices( devices64, count, sizeof(*devices64) );
+}
diff --git a/include/ntuser.h b/include/ntuser.h
index bf4e9f4b13a..ea2f8408318 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -655,6 +655,7 @@ ATOM WINAPI NtUserRegisterClassExWOW( const WNDCLASSEXW *wc, UNICODE_STRING *
struct client_menu_name *client_menu_name, DWORD fnid, DWORD flags,
DWORD *wow );
BOOL WINAPI NtUserRegisterHotKey( HWND hwnd, INT id, UINT modifiers, UINT vk );
+BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT device_count, UINT size );
INT WINAPI NtUserReleaseDC( HWND hwnd, HDC hdc );
BOOL WINAPI NtUserRemoveClipboardFormatListener( HWND hwnd );
BOOL WINAPI NtUserRemoveMenu( HMENU menu, UINT id, UINT flags );
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/313
More information about the wine-devel
mailing list