Author: cwittich
Date: Fri Jul 27 01:43:22 2007
New Revision: 27887
URL:
http://svn.reactos.org/svn/reactos?rev=27887&view=rev
Log:
-fix crash in shell32 caused by clamwin installer (patch by w3seek)
Modified:
trunk/reactos/dll/win32/shell32/shell32_main.c
Modified: trunk/reactos/dll/win32/shell32/shell32_main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32_…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shell32_main.c (original)
+++ trunk/reactos/dll/win32/shell32/shell32_main.c Fri Jul 27 01:43:22 2007
@@ -509,23 +509,59 @@
/* get the iconlocation */
if (SUCCEEDED(hr) && (flags & SHGFI_ICONLOCATION ))
{
- UINT uDummy,uFlags;
-
- hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1,
- (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconA,
- &uDummy, (LPVOID*)&pei);
- if (SUCCEEDED(hr))
- {
- hr = IExtractIconW_GetIconLocation(pei, uGilFlags,
- szLocation, MAX_PATH, &iIndex, &uFlags);
- psfi->iIcon = iIndex;
-
- if (!(uFlags & GIL_NOTFILENAME))
- lstrcpyW (psfi->szDisplayName, szLocation);
+ if (!(flags & SHGFI_USEFILEATTRIBUTES))
+ {
+ UINT uDummy,uFlags;
+
+ hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1,
+ (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconA,
+ &uDummy, (LPVOID*)&pei);
+ if (SUCCEEDED(hr))
+ {
+ hr = IExtractIconW_GetIconLocation(pei, uGilFlags,
+ szLocation, MAX_PATH, &iIndex, &uFlags);
+ psfi->iIcon = iIndex;
+
+ if (!(uFlags & GIL_NOTFILENAME))
+ lstrcpyW (psfi->szDisplayName, szLocation);
+ else
+ ret = FALSE;
+
+ IExtractIconA_Release(pei);
+ }
+ }
+ else
+ {
+ if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ strcpyW(psfi->szDisplayName, swShell32Name);
+ psfi->iIcon = SIC_GetIconIndex(swShell32Name, -IDI_SHELL_FOLDER, 0);
+ }
else
- ret = FALSE;
-
- IExtractIconA_Release(pei);
+ {
+ WCHAR sTemp [MAX_PATH];
+ WCHAR * szExt;
+ DWORD dwNr=0;
+ static const WCHAR p1W[] = {'%','1',0};
+
+ lstrcpynW(sTemp, szFullPath, MAX_PATH);
+
+ psfi->iIcon = 0;
+ szExt = (LPWSTR) PathFindExtensionW(sTemp);
+ if ( szExt &&
+ HCR_MapTypeToValueW(szExt, sTemp, MAX_PATH, TRUE) &&
+ HCR_GetDefaultIconW(sTemp, sTemp, MAX_PATH, &dwNr))
+ {
+ if (!lstrcmpW(p1W,sTemp)) /* icon is in the file */
+ strcpyW(psfi->szDisplayName, szFullPath);
+ else
+ strcpyW(psfi->szDisplayName, sTemp);
+
+ psfi->iIcon = SIC_GetIconIndex(psfi->szDisplayName, dwNr, 0);
+ if (psfi->iIcon == -1)
+ psfi->iIcon = 0;
+ }
+ }
}
}