Module: wine Branch: master Commit: dd2dd0066519800373b2f26100ecb6bd7b0ee33b URL: https://source.winehq.org/git/wine.git/?a=commit;h=dd2dd0066519800373b2f2610...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Feb 22 13:40:22 2022 +0100
user32: Store module as unicode string in cursoricon_object.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/cursoricon.c | 51 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 16 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 2b421cd1bf1..6da3e398db1 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -73,7 +73,7 @@ struct cursoricon_object struct user_object obj; /* object header */ struct list entry; /* entry in shared icons list */ ULONG_PTR param; /* opaque param used by 16-bit code */ - HMODULE module; /* module for icons loaded from resources */ + UNICODE_STRING module; /* module for icons loaded from resources */ LPWSTR resname; /* resource name for icons loaded from resources */ HRSRC rsrc; /* resource for shared icons */ BOOL is_shared; /* whether this object is shared */ @@ -1184,7 +1184,6 @@ done: struct cursoricon_frame *frame;
info->is_icon = bIcon; - info->module = module; info->hotspot = hotspot; frame = get_icon_frame( info, 0 ); frame->delay = ~0; @@ -1201,6 +1200,19 @@ done: } else info->resname = MAKEINTRESOURCEW( LOWORD(resname) );
+ if (module) + { + WCHAR buf[MAX_PATH]; + UNICODE_STRING module_name = { 0, sizeof(buf), buf }; + + if (!LdrGetDllFullName( module, &module_name ) && + (info->module.Buffer = HeapAlloc( GetProcessHeap(), 0, module_name.Length ))) + { + memcpy( info->module.Buffer, module_name.Buffer, module_name.Length ); + info->module.Length = module_name.Length; + } + } + if (cFlag & LR_SHARED) { info->is_shared = TRUE; @@ -1687,18 +1699,24 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name, /* If shared icon, check whether it was already loaded */ if (loadflags & LR_SHARED) { + WCHAR buf[MAX_PATH]; + UNICODE_STRING module = { 0, sizeof(buf) - sizeof(WCHAR), buf }; struct cursoricon_object *ptr;
- USER_Lock(); - LIST_FOR_EACH_ENTRY( ptr, &icon_cache, struct cursoricon_object, entry ) + if (!LdrGetDllFullName( hInstance, &module )) { - if (ptr->module != hInstance) continue; - if (ptr->rsrc != hRsrc) continue; - hIcon = ptr->obj.handle; - break; + USER_Lock(); + LIST_FOR_EACH_ENTRY( ptr, &icon_cache, struct cursoricon_object, entry ) + { + if (ptr->module.Length != module.Length) continue; + if (memcmp( ptr->module.Buffer, module.Buffer, module.Length )) continue; + if (ptr->rsrc != hRsrc) continue; + hIcon = ptr->obj.handle; + break; + } + USER_Unlock(); + if (hIcon) return hIcon; } - USER_Unlock(); - if (hIcon) return hIcon; }
if (!(handle = LoadResource( hInstance, hRsrc ))) return 0; @@ -2159,7 +2177,6 @@ BOOL WINAPI GetIconInfoExW( HICON icon, ICONINFOEXW *info ) { struct cursoricon_frame *frame; struct cursoricon_object *ptr; - HMODULE module; BOOL ret = TRUE;
if (info->cbSize != sizeof(*info)) @@ -2191,10 +2208,12 @@ BOOL WINAPI GetIconInfoExW( HICON icon, ICONINFOEXW *info ) info->wResID = 0; info->szModName[0] = 0; info->szResName[0] = 0; - if (ptr->module) + if (ptr->module.Length) { if (IS_INTRESOURCE( ptr->resname )) info->wResID = LOWORD( ptr->resname ); else lstrcpynW( info->szResName, ptr->resname, MAX_PATH ); + memcpy( info->szModName, ptr->module.Buffer, ptr->module.Length ); + info->szModName[ptr->module.Length / sizeof(WCHAR)] = 0; } if (!info->hbmMask || (!info->hbmColor && frame->color)) { @@ -2202,10 +2221,8 @@ BOOL WINAPI GetIconInfoExW( HICON icon, ICONINFOEXW *info ) DeleteObject( info->hbmColor ); ret = FALSE; } - module = ptr->module; release_icon_frame( ptr, frame ); release_user_handle_ptr( ptr ); - if (ret && module) GetModuleFileNameW( module, info->szModName, MAX_PATH ); return ret; }
@@ -3003,14 +3020,16 @@ HANDLE WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx, struct cursoricon_object *icon; int depth = (flags & LR_MONOCHROME) ? 1 : get_display_bpp(); HICON resource_icon = NULL; + HINSTANCE module; ICONINFO info; HICON res;
if (!(icon = get_icon_ptr( hnd ))) return 0;
- if (icon->rsrc && (flags & LR_COPYFROMRESOURCE)) + if (icon->rsrc && (flags & LR_COPYFROMRESOURCE) && icon->module.Length && + !LdrGetDllHandle( NULL, 0, &icon->module, &module )) { - resource_icon = CURSORICON_Load( icon->module, icon->resname, desiredx, + resource_icon = CURSORICON_Load( module, icon->resname, desiredx, desiredy, depth, !icon->is_icon, flags ); release_user_handle_ptr( icon ); if (!(icon = get_icon_ptr( resource_icon )))