From c0ea1c0e9f03f93e62cdf7367d5e35907ca6b111 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Sun, 6 Jul 2025 15:24:25 +0200 Subject: [PATCH] [USER32][APITESTS] Use the correct user32 icon resource ids (#7807) --- .../rostests/apitests/comctl32/imagelist.c | 6 +-- modules/rostests/apitests/user32/LoadImage.c | 38 +++++++++++++++++++ win32ss/user/ntuser/callback.c | 2 +- win32ss/user/ntuser/cursoricon.c | 2 +- win32ss/user/ntuser/cursoricon.h | 2 + win32ss/user/user32/user32.rc | 13 ++++--- win32ss/user/user32/windows/cursoricon.c | 15 ++++++++ 7 files changed, 65 insertions(+), 13 deletions(-) diff --git a/modules/rostests/apitests/comctl32/imagelist.c b/modules/rostests/apitests/comctl32/imagelist.c index 967ce2755e8..77b605d7d81 100644 --- a/modules/rostests/apitests/comctl32/imagelist.c +++ b/modules/rostests/apitests/comctl32/imagelist.c @@ -48,12 +48,8 @@ static BOOL IL_AddImagesForTest(HIMAGELIST himl) HINSTANCE hInst = LoadLibraryW(L"USER32"); if (!hInst) return FALSE; - HICON hIco = (HICON)LoadImage(hInst, MAKEINTRESOURCE(100), /* Windows */ + HICON hIco = (HICON)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_ICON, IL_IMGSIZE, IL_IMGSIZE, 0); - if (!hIco) - hIco = (HICON)LoadImage(hInst, MAKEINTRESOURCE(32512), /* ReactOS */ - IMAGE_ICON, IL_IMGSIZE, IL_IMGSIZE, 0); - if (hIco) { idx = ImageList_AddIcon(himl, hIco); diff --git a/modules/rostests/apitests/user32/LoadImage.c b/modules/rostests/apitests/user32/LoadImage.c index f46e4be7846..8a2aa56f57b 100644 --- a/modules/rostests/apitests/user32/LoadImage.c +++ b/modules/rostests/apitests/user32/LoadImage.c @@ -45,6 +45,42 @@ static void test_LoadImage_DataFile(void) } } +static void test_LoadIcon_SystemIds(void) +{ + static const WORD icomap[][2] = { + { 100, (WORD)(SIZE_T)IDI_APPLICATION }, + { 101, (WORD)(SIZE_T)IDI_WARNING }, + { 102, (WORD)(SIZE_T)IDI_QUESTION }, + { 103, (WORD)(SIZE_T)IDI_ERROR }, + { 104, (WORD)(SIZE_T)IDI_INFORMATION }, + { 105, (WORD)(SIZE_T)IDI_WINLOGO } + }; + HINSTANCE hInst = GetModuleHandleW(L"USER32"); + typedef BOOL (WINAPI*SHAIE)(HICON, HICON); + SHAIE pfnSHAreIconsEqual; + HMODULE hSHLWAPI = LoadLibraryA("SHLWAPI"); + if (!hSHLWAPI) + { + skip("Could not initialize\n"); + return; + } + pfnSHAreIconsEqual = (SHAIE)GetProcAddress(hSHLWAPI, MAKEINTRESOURCEA(548)); + if (!pfnSHAreIconsEqual) + { + FreeLibrary(hSHLWAPI); + skip("Could not initialize\n"); + return; + } + + for (UINT i = 0; i < _countof(icomap); i++) + { + HICON hIcoRes = LoadIconW(hInst, MAKEINTRESOURCEW(icomap[i][0])); + HICON hIcoSys = LoadIconW(NULL, MAKEINTRESOURCEW(icomap[i][1])); + ok(hIcoRes && pfnSHAreIconsEqual(hIcoRes, hIcoSys), "SysIcon %d must be resource %d\n", icomap[i][1], icomap[i][0]); + } + FreeLibrary(hSHLWAPI); +} + START_TEST(LoadImage) { char path[MAX_PATH]; @@ -133,4 +169,6 @@ START_TEST(LoadImage) si.cb = sizeof(si); CreateProcessA( NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ); WaitForSingleObject (pi.hProcess, INFINITE); + + test_LoadIcon_SystemIds(); } diff --git a/win32ss/user/ntuser/callback.c b/win32ss/user/ntuser/callback.c index 801e8e971db..6c8e121327b 100644 --- a/win32ss/user/ntuser/callback.c +++ b/win32ss/user/ntuser/callback.c @@ -1144,7 +1144,7 @@ co_IntSetWndIcons(VOID) IntLoadSystenIcons(Common->hIconBang, OIC_BANG); IntLoadSystenIcons(Common->hIconNote, OIC_NOTE); IntLoadSystenIcons(gpsi->hIconWindows, OIC_WINLOGO); - IntLoadSystenIcons(gpsi->hIconSmWindows, OIC_WINLOGO+1); + IntLoadSystenIcons(gpsi->hIconSmWindows, OIC_INTERNAL_WINSMALL); ERR("hIconSmWindows %p hIconWindows %p \n",gpsi->hIconSmWindows,gpsi->hIconWindows); diff --git a/win32ss/user/ntuser/cursoricon.c b/win32ss/user/ntuser/cursoricon.c index f0fdbac223e..fc187c7489a 100644 --- a/win32ss/user/ntuser/cursoricon.c +++ b/win32ss/user/ntuser/cursoricon.c @@ -155,7 +155,7 @@ IntLoadSystenIcons(HICON hcur, DWORD id) return; // Set Small Window Icon and do not link. - if ( id == OIC_WINLOGO+1 ) + if ( id == OIC_INTERNAL_WINSMALL ) { pcur->CURSORF_flags |= CURSORF_GLOBAL; UserReferenceObject(pcur); diff --git a/win32ss/user/ntuser/cursoricon.h b/win32ss/user/ntuser/cursoricon.h index 01e276f5ec9..0a7124a6545 100644 --- a/win32ss/user/ntuser/cursoricon.h +++ b/win32ss/user/ntuser/cursoricon.h @@ -108,6 +108,8 @@ extern SYSTEMCURICO gasyscur[]; #define ROIC_BANG 3 #define ROIC_NOTE 4 #define ROIC_WINLOGO 5 +#define ROIC_SHIELD 6 +#define OIC_INTERNAL_WINSMALL 6 /* Note: This needs to change if SHIELD is added to gasysico. */ #define ROCR_ARROW 0 #define ROCR_IBEAM 1 diff --git a/win32ss/user/user32/user32.rc b/win32ss/user/user32/user32.rc index a3210a30787..172e796e13b 100644 --- a/win32ss/user/user32/user32.rc +++ b/win32ss/user/user32/user32.rc @@ -55,12 +55,13 @@ OCR_HAND CURSOR "resources/ocr_hand.cur" /* Icons */ -OIC_SAMPLE ICON "resources/oic_sample.ico" -OIC_HAND ICON "resources/oic_hand.ico" -OIC_QUES ICON "resources/oic_ques.ico" -OIC_BANG ICON "resources/oic_bang.ico" -OIC_NOTE ICON "resources/oic_note.ico" -OIC_WINLOGO ICON "resources/oic_reactos.ico" +100 ICON "resources/oic_sample.ico" /* IDI_APPLICATION */ +101 ICON "resources/oic_bang.ico" /* IDI_WARNING */ +102 ICON "resources/oic_ques.ico" /* IDI_QUESTION */ +103 ICON "resources/oic_hand.ico" /* IDI_ERROR */ +104 ICON "resources/oic_note.ico" /* IDI_INFORMATION */ +105 ICON "resources/oic_reactos.ico" /* IDI_WINLOGO */ +/* 106 ICON "resources/oic_shield.ico" IDI_SHIELD */ /* Bitmaps */ diff --git a/win32ss/user/user32/windows/cursoricon.c b/win32ss/user/user32/windows/cursoricon.c index 746a0f6e949..f021016ed3f 100644 --- a/win32ss/user/user32/windows/cursoricon.c +++ b/win32ss/user/user32/windows/cursoricon.c @@ -1738,8 +1738,23 @@ CURSORICON_LoadImageW( /* Check if caller wants OEM icons */ if(!hinst) + { + #ifndef IDI_SHIELD + #define IDI_SHIELD MAKEINTRESOURCE(32518) + #endif + hinst = User32Instance; + /* Map IDI to resource id */ + if (bIcon && lpszName >= IDI_APPLICATION && lpszName <= IDI_SHIELD) + { + SIZE_T id = 100 + (SIZE_T)lpszName - (SIZE_T)IDI_APPLICATION; + if ((id | 2) == 103) + id ^= 2; /* Must swap IDI_ERROR and IDI_WARNING */ + lpszName = MAKEINTRESOURCEW(id); + } + } + if(lpszName) { /* Prepare the resource name string */