[PATCH 5/7] win32u: Move NtUserInternalGetWindowIcon implementation from user32.

Jacek Caban wine at gitlab.winehq.org
Wed Jun 8 19:14:34 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/user32/user32.spec      |  2 +-
 dlls/user32/user_main.c      |  8 ++++++
 dlls/user32/win.c            | 47 -----------------------------------
 dlls/win32u/cursoricon.c     | 21 ++++++++++++++++
 dlls/win32u/gdiobj.c         |  1 +
 dlls/win32u/win32u.spec      |  2 +-
 dlls/win32u/win32u_private.h |  1 +
 dlls/win32u/window.c         | 48 ++++++++++++++++++++++++++++++++++++
 dlls/win32u/wrappers.c       |  7 ++++++
 include/ntuser.h             | 15 ++++++++++-
 10 files changed, 102 insertions(+), 50 deletions(-)

diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 8a7387040dc..b41d661ee2a 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -445,7 +445,7 @@
 @ stdcall InsertMenuItemA(long long long ptr)
 @ stdcall InsertMenuItemW(long long long ptr)
 @ stdcall InsertMenuW(long long long long ptr)
-@ stdcall InternalGetWindowIcon(ptr long)
+@ stdcall InternalGetWindowIcon(ptr long) NtUserInternalGetWindowIcon
 @ stdcall InternalGetWindowText(long ptr long) NtUserInternalGetWindowText
 @ stdcall IntersectRect(ptr ptr ptr)
 @ stdcall InvalidateRect(long ptr long)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index d0c1cc616a7..755fc3d578e 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -164,6 +164,13 @@ static NTSTATUS WINAPI User32CopyImage( const struct copy_image_params *params,
     return HandleToUlong( ret );
 }
 
+static NTSTATUS WINAPI User32LoadImage( const struct load_image_params *params, ULONG size )
+{
+    HANDLE ret = LoadImageW( params->hinst, params->name, params->type,
+                             params->dx, params->dy, params->flags );
+    return HandleToUlong( ret );
+}
+
 static NTSTATUS WINAPI User32FreeCachedClipboardData( const struct free_cached_data_params *params,
                                                       ULONG size )
 {
@@ -193,6 +200,7 @@ static const void *kernel_callback_table[NtUserCallCount] =
     User32CopyImage,
     User32FreeCachedClipboardData,
     User32LoadDriver,
+    User32LoadImage,
     User32RegisterBuiltinClasses,
     User32RenderSsynthesizedFormat,
 };
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 7b0fc884402..99753791f09 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1794,50 +1794,3 @@ BOOL WINAPI SetWindowCompositionAttribute(HWND hwnd, void *data)
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
-
-/***********************************************************************
- *              InternalGetWindowIcon   (USER32.@)
- */
-HICON WINAPI InternalGetWindowIcon( HWND hwnd, UINT type )
-{
-    WND *win = WIN_GetPtr( hwnd );
-    HICON ret;
-
-    TRACE( "hwnd %p, type %#x\n", hwnd, type );
-
-    if (!win)
-    {
-        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
-        return 0;
-    }
-    if (win == WND_OTHER_PROCESS || win == WND_DESKTOP)
-    {
-        if (IsWindow( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
-        return 0;
-    }
-
-    switch (type)
-    {
-        case ICON_BIG:
-            ret = win->hIcon;
-            if (!ret) ret = (HICON)GetClassLongPtrW( hwnd, GCLP_HICON );
-            break;
-
-        case ICON_SMALL:
-        case ICON_SMALL2:
-            ret = win->hIconSmall ? win->hIconSmall : win->hIconSmall2;
-            if (!ret) ret = (HICON)GetClassLongPtrW( hwnd, GCLP_HICONSM );
-            if (!ret) ret = (HICON)GetClassLongPtrW( hwnd, GCLP_HICON );
-            break;
-
-        default:
-            SetLastError( ERROR_INVALID_PARAMETER );
-            WIN_ReleasePtr( win );
-            return 0;
-    }
-
-    if (!ret) ret = LoadIconW( 0, (const WCHAR *)IDI_APPLICATION );
-
-    WIN_ReleasePtr( win );
-    return CopyIcon( ret );
-}
diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c
index e51feb87115..eaafd07e190 100644
--- a/dlls/win32u/cursoricon.c
+++ b/dlls/win32u/cursoricon.c
@@ -801,3 +801,24 @@ HANDLE WINAPI CopyImage( HANDLE hwnd, UINT type, INT dx, INT dy, UINT flags )
     ret = KeUserModeCallback( NtUserCopyImage, &params, sizeof(params), &ret_ptr, &ret_len );
     return UlongToHandle( ret );
 }
+
+/******************************************************************************
+ *           LoadImage (win32u.so)
+ */
+HANDLE WINAPI LoadImageW( HINSTANCE hinst, const WCHAR *name, UINT type,
+                          INT dx, INT dy, UINT flags )
+{
+    void *ret_ptr;
+    ULONG ret_len;
+    NTSTATUS ret;
+    struct load_image_params params =
+        { .hinst = hinst, .name = name, .type = type, .dx = dx, .dy = dy, .flags = flags };
+
+    if (HIWORD(name))
+    {
+        ERR( "name %s not supported in Unix modules\n", debugstr_w( name ));
+        return 0;
+    }
+    ret = KeUserModeCallback( NtUserLoadImage, &params, sizeof(params), &ret_ptr, &ret_len );
+    return UlongToHandle( ret );
+}
diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c
index 7d9adcdec6a..72924bb658a 100644
--- a/dlls/win32u/gdiobj.c
+++ b/dlls/win32u/gdiobj.c
@@ -1187,6 +1187,7 @@ static struct unix_funcs unix_funcs =
     NtUserGetUpdatedClipboardFormats,
     NtUserGetWindowPlacement,
     NtUserHideCaret,
+    NtUserInternalGetWindowIcon,
     NtUserIsClipboardFormatAvailable,
     NtUserMapVirtualKeyEx,
     NtUserMessageCall,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index 28c839f5901..de500da143b 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -1044,7 +1044,7 @@
 @ stub NtUserInjectPointerInput
 @ stub NtUserInjectTouchInput
 @ stub NtUserInteractiveControlQueryUsage
-@ stub NtUserInternalGetWindowIcon
+@ stdcall NtUserInternalGetWindowIcon(ptr long)
 @ stdcall -syscall NtUserInternalGetWindowText(long ptr long)
 @ stub NtUserInternalToUnicode
 @ stub NtUserInvalidateRect
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index e72ab8ff1d7..09c800bd777 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -249,6 +249,7 @@ struct unix_funcs
     BOOL     (WINAPI *pNtUserGetUpdatedClipboardFormats)( UINT *formats, UINT size, UINT *out_size );
     BOOL     (WINAPI *pNtUserGetWindowPlacement)( HWND hwnd, WINDOWPLACEMENT *placement );
     BOOL     (WINAPI *pNtUserHideCaret)( HWND hwnd );
+    HICON    (WINAPI *pNtUserInternalGetWindowIcon)( HWND hwnd, UINT type );
     BOOL     (WINAPI *pNtUserIsClipboardFormatAvailable)( UINT format );
     UINT     (WINAPI *pNtUserMapVirtualKeyEx)( UINT code, UINT type, HKL layout );
     LRESULT  (WINAPI *pNtUserMessageCall)( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index d09a719185a..08e901cc855 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -4554,6 +4554,54 @@ static BOOL set_window_context_help_id( HWND hwnd, DWORD id )
     return TRUE;
 }
 
+/***********************************************************************
+ *           NtUserInternalGetWindowIcon   (win32u.@)
+ */
+HICON WINAPI NtUserInternalGetWindowIcon( HWND hwnd, UINT type )
+{
+    WND *win = get_win_ptr( hwnd );
+    HICON ret;
+
+    TRACE( "hwnd %p, type %#x\n", hwnd, type );
+
+    if (!win)
+    {
+        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
+        return 0;
+    }
+    if (win == WND_OTHER_PROCESS || win == WND_DESKTOP)
+    {
+        if (is_window( hwnd )) FIXME( "not supported on other process window %p\n", hwnd );
+        return 0;
+    }
+
+    switch (type)
+    {
+        case ICON_BIG:
+            ret = win->hIcon;
+            if (!ret) ret = (HICON)get_class_long_ptr( hwnd, GCLP_HICON, FALSE );
+            break;
+
+        case ICON_SMALL:
+        case ICON_SMALL2:
+            ret = win->hIconSmall ? win->hIconSmall : win->hIconSmall2;
+            if (!ret) ret = (HICON)get_class_long_ptr( hwnd, GCLP_HICONSM, FALSE );
+            if (!ret) ret = (HICON)get_class_long_ptr( hwnd, GCLP_HICON, FALSE );
+            break;
+
+        default:
+            SetLastError( ERROR_INVALID_PARAMETER );
+            release_win_ptr( win );
+            return 0;
+    }
+    release_win_ptr( win );
+
+    if (!ret) ret = LoadImageW( 0, (const WCHAR *)IDI_APPLICATION, IMAGE_ICON,
+                                0, 0, LR_SHARED | LR_DEFAULTSIZE );
+
+    return CopyImage( ret, IMAGE_ICON, 0, 0, 0 );
+}
+
 /***********************************************************************
  *           send_destroy_message
  */
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index e4219ed5648..99e0b9f3d88 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -1029,12 +1029,19 @@ BOOL WINAPI NtUserGetUpdatedClipboardFormats( UINT *formats, UINT size, UINT *ou
     return unix_funcs->pNtUserGetUpdatedClipboardFormats( formats, size, out_size );
 }
 
+
 BOOL WINAPI NtUserGetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *placement )
 {
     if (!unix_funcs) return FALSE;
     return unix_funcs->pNtUserGetWindowPlacement( hwnd, placement );
 }
 
+HICON WINAPI NtUserInternalGetWindowIcon( HWND hwnd, UINT type )
+{
+    if (!unix_funcs) return 0;
+    return unix_funcs->pNtUserInternalGetWindowIcon( hwnd, type );
+}
+
 BOOL WINAPI NtUserIsClipboardFormatAvailable( UINT format )
 {
     if (!unix_funcs) return FALSE;
diff --git a/include/ntuser.h b/include/ntuser.h
index 7451d649702..9d9ac0247d1 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -35,6 +35,7 @@ enum
     NtUserCopyImage,
     NtUserFreeCachedClipboardData,
     NtUserLoadDriver,
+    NtUserLoadImage,
     NtUserRegisterBuiltinClasses,
     NtUserRenderSynthesizedFormat,
     /* win16 hooks */
@@ -147,7 +148,7 @@ struct win_hook_params
     WCHAR module[MAX_PATH];
 };
 
-/* NtUserCopyMessage params */
+/* NtUserCopyImage params */
 struct copy_image_params
 {
     HANDLE hwnd;
@@ -164,6 +165,17 @@ struct free_cached_data_params
     HANDLE handle;
 };
 
+/* NtUserLoadImage params */
+struct load_image_params
+{
+    HINSTANCE hinst;
+    const WCHAR *name;
+    UINT type;
+    INT dx;
+    INT dy;
+    UINT flags;
+};
+
 /* NtUserRenderSynthesizedFormat params */
 struct render_synthesized_format_params
 {
@@ -589,6 +601,7 @@ BOOL    WINAPI NtUserHideCaret( HWND hwnd );
 NTSTATUS WINAPI NtUserInitializeClientPfnArrays( const struct user_client_procs *client_procsA,
                                                  const struct user_client_procs *client_procsW,
                                                  const void *client_workers, HINSTANCE user_module );
+HICON   WINAPI NtUserInternalGetWindowIcon( HWND hwnd, UINT type );
 INT     WINAPI NtUserInternalGetWindowText( HWND hwnd, WCHAR *text, INT count );
 BOOL    WINAPI NtUserIsClipboardFormatAvailable( UINT format );
 BOOL    WINAPI NtUserKillTimer( HWND hwnd, UINT_PTR id );
-- 
GitLab


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



More information about the wine-devel mailing list