From 399dfc2580b2a124d8711b15b6e11fdae49ff910 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek@codeweavers.com>
Date: Sun, 10 Jul 2022 21:53:49 +0200
Subject: [PATCH] win32u: Use syscall interface for cursor icon functions.

---
 dlls/win32u/gdiobj.c         |  7 ---
 dlls/win32u/syscall.c        |  7 +++
 dlls/win32u/win32u.spec      | 14 +++---
 dlls/win32u/win32u_private.h | 10 ----
 dlls/win32u/wrappers.c       | 45 ------------------
 dlls/wow64win/syscall.h      |  7 +++
 dlls/wow64win/user.c         | 88 ++++++++++++++++++++++++++++++++++++
 7 files changed, 109 insertions(+), 69 deletions(-)

diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c
index 4ccfd77dfa0..6244e7ab472 100644
--- a/dlls/win32u/gdiobj.c
+++ b/dlls/win32u/gdiobj.c
@@ -1136,17 +1136,14 @@ static struct unix_funcs unix_funcs =
     NtGdiUnrealizeObject,
     NtGdiUpdateColors,
     NtGdiWidenPath,
-    NtUserClipCursor,
     NtUserCreateCaret,
     NtUserCreateWindowEx,
     NtUserDeferWindowPosAndBand,
-    NtUserDestroyCursor,
     NtUserDestroyMenu,
     NtUserDestroyWindow,
     NtUserDisableThreadIme,
     NtUserDragDetect,
     NtUserDrawCaptionTemp,
-    NtUserDrawIconEx,
     NtUserDrawMenuBarTemp,
     NtUserEnableMenuItem,
     NtUserEnableScrollBar,
@@ -1155,7 +1152,6 @@ static struct unix_funcs unix_funcs =
     NtUserExcludeUpdateRgn,
     NtUserFlashWindowEx,
     NtUserGetClassInfoEx,
-    NtUserGetIconInfo,
     NtUserGetMenuBarInfo,
     NtUserGetScrollBarInfo,
     NtUserGetSystemMenu,
@@ -1173,8 +1169,6 @@ static struct unix_funcs unix_funcs =
     NtUserSetClassLong,
     NtUserSetClassLongPtr,
     NtUserSetClassWord,
-    NtUserSetCursor,
-    NtUserSetCursorIconData,
     NtUserSetFocus,
     NtUserSetInternalWindowPos,
     NtUserSetLayeredWindowAttributes,
@@ -1189,7 +1183,6 @@ static struct unix_funcs unix_funcs =
     NtUserSetWindowRgn,
     NtUserSetWindowWord,
     NtUserShowCaret,
-    NtUserShowCursor,
     NtUserShowScrollBar,
     NtUserShowWindow,
     NtUserShowWindowAsync,
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 982a75a0bd9..2bc178db91d 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -117,6 +117,7 @@ static void * const syscalls[] =
     NtUserChangeDisplaySettings,
     NtUserCheckMenuItem,
     NtUserChildWindowFromPointEx,
+    NtUserClipCursor,
     NtUserCloseClipboard,
     NtUserCloseDesktop,
     NtUserCloseWindowStation,
@@ -128,8 +129,10 @@ static void * const syscalls[] =
     NtUserCreateWindowStation,
     NtUserDeleteMenu,
     NtUserDestroyAcceleratorTable,
+    NtUserDestroyCursor,
     NtUserDestroyInputContext,
     NtUserDispatchMessage,
+    NtUserDrawIconEx,
     NtUserEmptyClipboard,
     NtUserEndMenu,
     NtUserEnumDisplayDevices,
@@ -157,6 +160,7 @@ static void * const syscalls[] =
     NtUserGetDpiForMonitor,
     NtUserGetForegroundWindow,
     NtUserGetGUIThreadInfo,
+    NtUserGetIconInfo,
     NtUserGetIconSize,
     NtUserGetKeyNameText,
     NtUserGetKeyState,
@@ -217,6 +221,8 @@ static void * const syscalls[] =
     NtUserSendInput,
     NtUserSetClipboardData,
     NtUserSetClipboardViewer,
+    NtUserSetCursor,
+    NtUserSetCursorIconData,
     NtUserSetCursorPos,
     NtUserSetKeyboardState,
     NtUserSetMenuContextHelpId,
@@ -231,6 +237,7 @@ static void * const syscalls[] =
     NtUserSetTimer,
     NtUserSetWinEventHook,
     NtUserSetWindowsHookEx,
+    NtUserShowCursor,
     NtUserThunkedMenuInfo,
     NtUserThunkedMenuItemInfo,
     NtUserToUnicodeEx,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index a15e1cadbd3..fb61addd3a8 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -792,7 +792,7 @@
 @ stub NtUserCheckWindowThreadDesktop
 @ stdcall -syscall NtUserChildWindowFromPointEx(long long long long)
 @ stub NtUserClearForeground
-@ stdcall NtUserClipCursor(ptr)
+@ stdcall -syscall NtUserClipCursor(ptr)
 @ stdcall -syscall NtUserCloseClipboard()
 @ stdcall -syscall NtUserCloseDesktop(long)
 @ stdcall -syscall NtUserCloseWindowStation(long)
@@ -829,7 +829,7 @@
 @ stdcall -syscall NtUserDestroyAcceleratorTable(long)
 @ stub NtUserDestroyActivationGroup
 @ stub NtUserDestroyActivationObject
-@ stdcall NtUserDestroyCursor(long long)
+@ stdcall -syscall NtUserDestroyCursor(long long)
 @ stub NtUserDestroyDCompositionHwndTarget
 @ stdcall -syscall NtUserDestroyInputContext(long)
 @ stdcall NtUserDestroyMenu(long)
@@ -850,7 +850,7 @@
 @ stub NtUserDrawAnimatedRects
 @ stub NtUserDrawCaption
 @ stdcall NtUserDrawCaptionTemp(long long ptr long long wstr long)
-@ stdcall NtUserDrawIconEx(long long long long long long long long long)
+@ stdcall -syscall NtUserDrawIconEx(long long long long long long long long long)
 @ stdcall NtUserDrawMenuBarTemp(long long ptr long long)
 @ stub NtUserDwmGetRemoteSessionOcclusionEvent
 @ stub NtUserDwmGetRemoteSessionOcclusionState
@@ -934,7 +934,7 @@
 @ stub NtUserGetGuiResources
 @ stub NtUserGetHDevName
 @ stub NtUserGetHimetricScaleFactorFromPixelLocation
-@ stdcall NtUserGetIconInfo(long ptr ptr ptr ptr long)
+@ stdcall -syscall NtUserGetIconInfo(long ptr ptr ptr ptr long)
 @ stdcall -syscall NtUserGetIconSize(long long ptr ptr)
 @ stub NtUserGetImeHotKey
 @ stub NtUserGetImeInfoEx
@@ -1178,9 +1178,9 @@
 @ stdcall -syscall NtUserSetClipboardViewer(long)
 @ stub NtUserSetCoreWindow
 @ stub NtUserSetCoreWindowPartner
-@ stdcall NtUserSetCursor(long)
+@ stdcall -syscall NtUserSetCursor(long)
 @ stub NtUserSetCursorContents
-@ stdcall NtUserSetCursorIconData(long ptr ptr ptr)
+@ stdcall -syscall NtUserSetCursorIconData(long ptr ptr ptr)
 @ stdcall -syscall NtUserSetCursorPos(long long)
 @ stub NtUserSetDesktopColorTransform
 @ stub NtUserSetDesktopVisualInputSink
@@ -1258,7 +1258,7 @@
 @ stub NtUserSetWindowsHookAW
 @ stdcall -syscall NtUserSetWindowsHookEx(ptr ptr long long ptr long)
 @ stdcall NtUserShowCaret(long)
-@ stdcall NtUserShowCursor(long)
+@ stdcall -syscall NtUserShowCursor(long)
 @ stdcall NtUserShowScrollBar(long long long)
 @ stub NtUserShowSystemCursor
 @ stdcall NtUserShowWindow(long long)
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 50236ea2c63..b96d02e12f4 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -186,7 +186,6 @@ struct unix_funcs
     BOOL     (WINAPI *pNtGdiUnrealizeObject)( HGDIOBJ obj );
     BOOL     (WINAPI *pNtGdiUpdateColors)( HDC hdc );
     BOOL     (WINAPI *pNtGdiWidenPath)( HDC hdc );
-    BOOL     (WINAPI *pNtUserClipCursor)( const RECT *rect );
     BOOL     (WINAPI *pNtUserCreateCaret)( HWND hwnd, HBITMAP bitmap, int width, int height );
     HWND     (WINAPI *pNtUserCreateWindowEx)( DWORD ex_style, UNICODE_STRING *class_name,
                                               UNICODE_STRING *version, UNICODE_STRING *window_name,
@@ -196,15 +195,12 @@ struct unix_funcs
     HDWP     (WINAPI *pNtUserDeferWindowPosAndBand)( HDWP hdwp, HWND hwnd, HWND after,
                                                      INT x, INT y, INT cx, INT cy,
                                                      UINT flags, UINT unk1, UINT unk2 );
-    BOOL     (WINAPI *pNtUserDestroyCursor)( HCURSOR cursor, ULONG arg );
     BOOL     (WINAPI *pNtUserDestroyMenu)( HMENU handle );
     BOOL     (WINAPI *pNtUserDestroyWindow)( HWND hwnd );
     BOOL     (WINAPI *pNtUserDisableThreadIme)( DWORD thread_id );
     BOOL     (WINAPI *pNtUserDragDetect)( HWND hwnd, int x, int y );
     BOOL     (WINAPI *pNtUserDrawCaptionTemp)( HWND hwnd, HDC hdc, const RECT *rect, HFONT font,
                                                HICON icon, const WCHAR *str, UINT flags );
-    BOOL     (WINAPI *pNtUserDrawIconEx)( HDC hdc, INT x0, INT y0, HICON icon, INT width,
-                                          INT height, UINT istep, HBRUSH hbr, UINT flags );
     DWORD    (WINAPI *pNtUserDrawMenuBarTemp)( HWND hwnd, HDC hdc, RECT *rect, HMENU handle, HFONT font );
     BOOL     (WINAPI *pNtUserEnableMenuItem)( HMENU handle, UINT id, UINT flags );
     BOOL     (WINAPI *pNtUserEnableScrollBar)( HWND hwnd, UINT bar, UINT flags );
@@ -214,8 +210,6 @@ struct unix_funcs
     BOOL     (WINAPI *pNtUserFlashWindowEx)( FLASHWINFO *info );
     ATOM     (WINAPI *pNtUserGetClassInfoEx)( HINSTANCE instance, UNICODE_STRING *name, WNDCLASSEXW *wc,
                                               struct client_menu_name *menu_name, BOOL ansi );
-    BOOL     (WINAPI *pNtUserGetIconInfo)( HICON icon, ICONINFO *info, UNICODE_STRING *module,
-                                           UNICODE_STRING *res_name, DWORD *bpp, LONG unk );
     BOOL     (WINAPI *pNtUserGetMenuBarInfo)( HWND hwnd, LONG id, LONG item, MENUBARINFO *info );
     BOOL     (WINAPI *pNtUserGetScrollBarInfo)( HWND hwnd, LONG id, SCROLLBARINFO *info );
     HMENU    (WINAPI *pNtUserGetSystemMenu)( HWND hwnd, BOOL revert );
@@ -237,9 +231,6 @@ struct unix_funcs
     DWORD    (WINAPI *pNtUserSetClassLong)( HWND hwnd, INT offset, LONG newval, BOOL ansi );
     ULONG_PTR (WINAPI *pNtUserSetClassLongPtr)( HWND hwnd, INT offset, LONG_PTR newval, BOOL ansi );
     WORD     (WINAPI *pNtUserSetClassWord)( HWND hwnd, INT offset, WORD newval );
-    HCURSOR  (WINAPI *pNtUserSetCursor)( HCURSOR cursor );
-    BOOL     (WINAPI *pNtUserSetCursorIconData)( HCURSOR cursor, UNICODE_STRING *module,
-                                                 UNICODE_STRING *res_name, struct cursoricon_desc *desc );
     HWND     (WINAPI *pNtUserSetFocus)( HWND hwnd );
     void     (WINAPI *pNtUserSetInternalWindowPos)( HWND hwnd, UINT cmd, RECT *rect, POINT *pt );
     BOOL     (WINAPI *pNtUserSetLayeredWindowAttributes)( HWND hwnd, COLORREF key, BYTE alpha, DWORD flags );
@@ -254,7 +245,6 @@ struct unix_funcs
     int      (WINAPI *pNtUserSetWindowRgn)( HWND hwnd, HRGN hrgn, BOOL redraw );
     WORD     (WINAPI *pNtUserSetWindowWord)( HWND hwnd, INT offset, WORD newval );
     BOOL     (WINAPI *pNtUserShowCaret)( HWND hwnd );
-    INT      (WINAPI *pNtUserShowCursor)( BOOL show );
     BOOL     (WINAPI *pNtUserShowScrollBar)( HWND hwnd, INT bar, BOOL show );
     BOOL     (WINAPI *pNtUserShowWindow)( HWND hwnd, INT cmd );
     BOOL     (WINAPI *pNtUserShowWindowAsync)( HWND hwnd, INT cmd );
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index 5b0e4f19b0f..98f8638c193 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -725,12 +725,6 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER
     return unix_funcs->pNtGdiDdDDISetVidPnSourceOwner( desc );
 }
 
-BOOL WINAPI NtUserClipCursor( const RECT *rect )
-{
-    if (!unix_funcs) return FALSE;
-    return unix_funcs->pNtUserClipCursor( rect );
-}
-
 BOOL WINAPI NtUserCreateCaret( HWND hwnd, HBITMAP bitmap, int width, int height )
 {
     if (!unix_funcs) return 0;
@@ -758,12 +752,6 @@ HDWP WINAPI NtUserDeferWindowPosAndBand( HDWP hdwp, HWND hwnd, HWND after,
                                                      flags, unk1, unk2 );
 }
 
-BOOL WINAPI NtUserDestroyCursor( HCURSOR cursor, ULONG arg )
-{
-    if (!unix_funcs) return FALSE;
-    return unix_funcs->pNtUserDestroyCursor( cursor, arg );
-}
-
 BOOL WINAPI NtUserDestroyMenu( HMENU handle )
 {
     if (!unix_funcs) return FALSE;
@@ -795,13 +783,6 @@ BOOL WINAPI NtUserDrawCaptionTemp( HWND hwnd, HDC hdc, const RECT *rect, HFONT f
     return unix_funcs->pNtUserDrawCaptionTemp( hwnd, hdc, rect, font, icon, str, flags );
 }
 
-BOOL WINAPI NtUserDrawIconEx( HDC hdc, INT x0, INT y0, HICON icon, INT width,
-                              INT height, UINT istep, HBRUSH hbr, UINT flags )
-{
-    if (!unix_funcs) return FALSE;
-    return unix_funcs->pNtUserDrawIconEx( hdc, x0, y0, icon, width, height, istep, hbr, flags );
-}
-
 DWORD WINAPI NtUserDrawMenuBarTemp( HWND hwnd, HDC hdc, RECT *rect, HMENU handle, HFONT font )
 {
     if (!unix_funcs) return 0;
@@ -845,13 +826,6 @@ ATOM WINAPI NtUserGetClassInfoEx( HINSTANCE instance, UNICODE_STRING *name, WNDC
     return unix_funcs->pNtUserGetClassInfoEx( instance, name, wc, menu_name, ansi );
 }
 
-BOOL WINAPI NtUserGetIconInfo( HICON icon, ICONINFO *info, UNICODE_STRING *module,
-                               UNICODE_STRING *res_name, DWORD *bpp, LONG unk )
-{
-    if (!unix_funcs) return FALSE;
-    return unix_funcs->pNtUserGetIconInfo( icon, info, module, res_name, bpp, unk );
-}
-
 BOOL WINAPI NtUserGetMenuBarInfo( HWND hwnd, LONG id, LONG item, MENUBARINFO *info )
 {
     if (!unix_funcs) return 0;
@@ -939,12 +913,6 @@ HWND WINAPI NtUserSetCapture( HWND hwnd )
     return unix_funcs->pNtUserSetCapture( hwnd );
 }
 
-HCURSOR WINAPI NtUserSetCursor( HCURSOR cursor )
-{
-    if (!unix_funcs) return 0;
-    return unix_funcs->pNtUserSetCursor( cursor );
-}
-
 DWORD WINAPI NtUserSetClassLong( HWND hwnd, INT offset, LONG newval, BOOL ansi )
 {
     if (!unix_funcs) return 0;
@@ -963,13 +931,6 @@ WORD WINAPI NtUserSetClassWord( HWND hwnd, INT offset, WORD newval )
     return unix_funcs->pNtUserSetClassWord( hwnd, offset, newval );
 }
 
-BOOL WINAPI NtUserSetCursorIconData( HCURSOR cursor, UNICODE_STRING *module, UNICODE_STRING *res_name,
-                                     struct cursoricon_desc *desc )
-{
-    if (!unix_funcs) return FALSE;
-    return unix_funcs->pNtUserSetCursorIconData( cursor, module, res_name, desc );
-}
-
 HWND WINAPI NtUserSetFocus( HWND hwnd )
 {
     if (!unix_funcs) return FALSE;
@@ -1054,12 +1015,6 @@ BOOL WINAPI NtUserShowCaret( HWND hwnd )
     return unix_funcs->pNtUserShowCaret( hwnd );
 }
 
-INT WINAPI NtUserShowCursor( BOOL show )
-{
-    if (!unix_funcs) return 0;
-    return unix_funcs->pNtUserShowCursor( show );
-}
-
 BOOL WINAPI NtUserShowScrollBar( HWND hwnd, INT bar, BOOL show )
 {
     if (!unix_funcs) return FALSE;
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index b5fa4cb9e48..0f6217fee63 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -104,6 +104,7 @@
     SYSCALL_ENTRY( NtUserChangeDisplaySettings ) \
     SYSCALL_ENTRY( NtUserCheckMenuItem ) \
     SYSCALL_ENTRY( NtUserChildWindowFromPointEx ) \
+    SYSCALL_ENTRY( NtUserClipCursor ) \
     SYSCALL_ENTRY( NtUserCloseClipboard ) \
     SYSCALL_ENTRY( NtUserCloseDesktop ) \
     SYSCALL_ENTRY( NtUserCloseWindowStation ) \
@@ -115,8 +116,10 @@
     SYSCALL_ENTRY( NtUserCreateWindowStation ) \
     SYSCALL_ENTRY( NtUserDeleteMenu ) \
     SYSCALL_ENTRY( NtUserDestroyAcceleratorTable ) \
+    SYSCALL_ENTRY( NtUserDestroyCursor ) \
     SYSCALL_ENTRY( NtUserDestroyInputContext ) \
     SYSCALL_ENTRY( NtUserDispatchMessage ) \
+    SYSCALL_ENTRY( NtUserDrawIconEx ) \
     SYSCALL_ENTRY( NtUserEmptyClipboard ) \
     SYSCALL_ENTRY( NtUserEndMenu ) \
     SYSCALL_ENTRY( NtUserEnumDisplayDevices ) \
@@ -144,6 +147,7 @@
     SYSCALL_ENTRY( NtUserGetDpiForMonitor ) \
     SYSCALL_ENTRY( NtUserGetForegroundWindow ) \
     SYSCALL_ENTRY( NtUserGetGUIThreadInfo ) \
+    SYSCALL_ENTRY( NtUserGetIconInfo ) \
     SYSCALL_ENTRY( NtUserGetIconSize ) \
     SYSCALL_ENTRY( NtUserGetKeyNameText ) \
     SYSCALL_ENTRY( NtUserGetKeyState ) \
@@ -204,6 +208,8 @@
     SYSCALL_ENTRY( NtUserSendInput ) \
     SYSCALL_ENTRY( NtUserSetClipboardData ) \
     SYSCALL_ENTRY( NtUserSetClipboardViewer ) \
+    SYSCALL_ENTRY( NtUserSetCursor ) \
+    SYSCALL_ENTRY( NtUserSetCursorIconData ) \
     SYSCALL_ENTRY( NtUserSetCursorPos ) \
     SYSCALL_ENTRY( NtUserSetKeyboardState ) \
     SYSCALL_ENTRY( NtUserSetMenuContextHelpId ) \
@@ -218,6 +224,7 @@
     SYSCALL_ENTRY( NtUserSetTimer ) \
     SYSCALL_ENTRY( NtUserSetWinEventHook ) \
     SYSCALL_ENTRY( NtUserSetWindowsHookEx ) \
+    SYSCALL_ENTRY( NtUserShowCursor ) \
     SYSCALL_ENTRY( NtUserThunkedMenuInfo ) \
     SYSCALL_ENTRY( NtUserThunkedMenuItemInfo ) \
     SYSCALL_ENTRY( NtUserToUnicodeEx ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 8b81baa0e58..2eb53272ca4 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -327,6 +327,13 @@ NTSTATUS WINAPI wow64_NtUserChildWindowFromPointEx( UINT *args )
     return HandleToUlong( NtUserChildWindowFromPointEx( parent, x, y, flags ));
 }
 
+NTSTATUS WINAPI wow64_NtUserClipCursor( UINT *args )
+{
+    const RECT *rect = get_ptr( &args );
+
+    return NtUserClipCursor( rect );
+}
+
 NTSTATUS WINAPI wow64_NtUserCloseClipboard( UINT *args )
 {
     return NtUserCloseClipboard();
@@ -426,6 +433,14 @@ NTSTATUS WINAPI wow64_NtUserDestroyAcceleratorTable( UINT *args )
     return NtUserDestroyAcceleratorTable( handle );
 }
 
+NTSTATUS WINAPI wow64_NtUserDestroyCursor( UINT *args )
+{
+    HCURSOR cursor = get_handle( &args );
+    ULONG arg = get_ulong( &args );
+
+    return NtUserDestroyCursor( cursor, arg );
+}
+
 NTSTATUS WINAPI wow64_NtUserDestroyInputContext( UINT *args )
 {
     HIMC handle = get_handle( &args );
@@ -441,6 +456,21 @@ NTSTATUS WINAPI wow64_NtUserDispatchMessage( UINT *args )
     return NtUserDispatchMessage( msg_32to64( &msg, msg32 ));
 }
 
+NTSTATUS WINAPI wow64_NtUserDrawIconEx( UINT *args )
+{
+    HDC hdc = get_handle( &args );
+    int x0 = get_ulong( &args );
+    int y0 = get_ulong( &args );
+    HICON icon = get_handle( &args );
+    int width = get_ulong( &args );
+    int height = get_ulong( &args );
+    UINT istep = get_ulong( &args );
+    HBRUSH hbr = get_handle( &args );
+    UINT flags = get_ulong( &args );
+
+    return NtUserDrawIconEx( hdc, x0, y0, icon, width, height, istep, hbr, flags );
+}
+
 NTSTATUS WINAPI wow64_NtUserEmptyClipboard( UINT *args )
 {
     return NtUserEmptyClipboard();
@@ -724,6 +754,39 @@ NTSTATUS WINAPI wow64_NtUserGetGUIThreadInfo( UINT *args )
     return TRUE;
 }
 
+NTSTATUS WINAPI wow64_NtUserGetIconInfo( UINT *args )
+{
+    HICON icon = get_handle( &args );
+    struct
+    {
+	BOOL   fIcon;
+	DWORD  xHotspot;
+	DWORD  yHotspot;
+	UINT32 hbmMask;
+	UINT32 hbmColor;
+    } *info32 = get_ptr( &args );
+    UNICODE_STRING32 *module32 = get_ptr( &args );
+    UNICODE_STRING32 *res_name32 = get_ptr( &args );
+    DWORD *bpp = get_ptr( &args );
+    LONG unk = get_ulong( &args );
+
+    ICONINFO info;
+    UNICODE_STRING module, res_name;
+
+    if (!NtUserGetIconInfo( icon, &info, unicode_str_32to64( &module, module32 ),
+                            unicode_str_32to64( &res_name, res_name32 ), bpp, unk ))
+        return FALSE;
+
+    info32->fIcon    = info.fIcon;
+    info32->xHotspot = info.xHotspot;
+    info32->yHotspot = info.yHotspot;
+    info32->hbmMask  = HandleToUlong( info.hbmMask );
+    info32->hbmColor = HandleToUlong( info.hbmColor );
+    if (module32) module32->Length = module.Length;
+    if (res_name32) res_name32->Length = res_name.Length;
+    return TRUE;
+}
+
 NTSTATUS WINAPI wow64_NtUserGetIconSize( UINT *args )
 {
     HICON handle = get_handle( &args );
@@ -1506,6 +1569,24 @@ NTSTATUS WINAPI wow64_NtUserSetClipboardViewer( UINT *args )
     return HandleToUlong( NtUserSetClipboardViewer( hwnd ));
 }
 
+NTSTATUS WINAPI wow64_NtUserSetCursor( UINT *args )
+{
+    HCURSOR cursor = get_handle( &args );
+
+    return HandleToUlong( NtUserSetCursor( cursor ));
+}
+
+NTSTATUS WINAPI wow64_NtUserSetCursorIconData( UINT *args )
+{
+    HCURSOR cursor = get_handle( &args );
+    UNICODE_STRING32 *module32 = get_ptr( &args );
+    UNICODE_STRING32 *res_name32 = get_ptr( &args );
+    void *desc = get_ptr( &args );
+
+    FIXME( "%p %p %p %p\n", cursor, module32, res_name32, desc );
+    return 0;
+}
+
 NTSTATUS WINAPI wow64_NtUserSetCursorPos( UINT *args )
 {
     INT x = get_ulong( &args );
@@ -1643,6 +1724,13 @@ NTSTATUS WINAPI wow64_NtUserSetWindowsHookEx( UINT *args )
     return HandleToUlong( ret );
 }
 
+NTSTATUS WINAPI wow64_NtUserShowCursor( UINT *args )
+{
+    BOOL show = get_ulong( &args );
+
+    return NtUserShowCursor( show );
+}
+
 NTSTATUS WINAPI wow64_NtUserThunkedMenuInfo( UINT *args )
 {
     HMENU menu = get_handle( &args );
-- 
GitLab