Skip to content

Commit

Permalink
[RAPPS] Validate DisplayIcon value and support icon index (reactos#5664)
Browse files Browse the repository at this point in the history
- If the DisplayIcon value points to an invalid path, ExtractIconW()
  can return 1! ExtractIconExW() does not have this problem nor the -1 issue.
  Reference: https://devblogs.microsoft.com/oldnewthing/20050526-07/?p=35533
- Use the icon index from PathParseIconLocationW().

Addendum to c6c7fc1. CORE-19317

Test to reproduce:

```
@echo off
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex1 /v DisplayName /d "Ex1 Normal" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex1 /v DisplayIcon /d "%windir%\explorer.exe" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex1 /v UninstallString /d "calc.exe" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex2 /v DisplayName /d "Ex2 Bad icon path" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex2 /v DisplayIcon /d "%windir%\DoesNotExist.exe" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex2 /v UninstallString /d "calc.exe" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex3 /v DisplayName /d "Ex3 Resource index" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex3 /v DisplayIcon /d "%windir%\explorer.exe,4" /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ex3 /v UninstallString /d "calc.exe" /f
start appwiz.cpl
```
  • Loading branch information
whindsaks authored and binarymaster committed Nov 20, 2023
1 parent 4add3fd commit 51a8979
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions base/applications/rapps/appview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1289,14 +1289,13 @@ CAppsListView::AddApplication(CAppInfo *AppInfo, BOOL InitialCheckState)
/* Load icon from registry */
HICON hIcon = NULL;
CStringW szIconPath;
int IconIndex;
if (AppInfo->RetrieveIcon(szIconPath))
{
PathParseIconLocationW((LPWSTR)szIconPath.GetString());
IconIndex = PathParseIconLocationW(szIconPath.GetBuffer());
szIconPath.ReleaseBuffer();

/* Load only the 1st icon from the application executable,
* because all apps provide the executables which have the main icon
* as 1st in the index , so we don't need other icons here */
hIcon = ExtractIconW(hInst, szIconPath.GetString(), 0);
ExtractIconExW(szIconPath.GetString(), IconIndex, &hIcon, NULL, 1);
}

/* Use the default icon if none were found in the file, or if it is not supported (returned 1) */
Expand All @@ -1306,7 +1305,7 @@ CAppsListView::AddApplication(CAppInfo *AppInfo, BOOL InitialCheckState)
hIcon = LoadIconW(hInst, MAKEINTRESOURCEW(IDI_MAIN));
}

int IconIndex = ImageList_AddIcon(m_hImageListView, hIcon);
IconIndex = ImageList_AddIcon(m_hImageListView, hIcon);
DestroyIcon(hIcon);

int Index = AddItem(ItemCount, IconIndex, AppInfo->szDisplayName, (LPARAM)AppInfo);
Expand Down

0 comments on commit 51a8979

Please sign in to comment.