https://git.reactos.org/?p=reactos.git;a=commitdiff;h=51a89791c1dbd30e2dee3…
commit 51a89791c1dbd30e2dee34b17bf2a4d68cdb3a5e
Author: Whindmar Saksit <whindsaks(a)proton.me>
AuthorDate: Mon Nov 20 17:41:31 2023 +0100
Commit: Stanislav Motylkov <x86corez(a)gmail.com>
CommitDate: Mon Nov 20 20:50:42 2023 +0300
[RAPPS] Validate DisplayIcon value and support icon index (#5664)
- 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
```
---
base/applications/rapps/appview.cpp | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/base/applications/rapps/appview.cpp b/base/applications/rapps/appview.cpp
index 004e1623c3c..a34e9cd9cad 100644
--- a/base/applications/rapps/appview.cpp
+++ b/base/applications/rapps/appview.cpp
@@ -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) */
@@ -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);