From ea206e8a12094ba0d151e00ec19c03ec5ccfde81 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Thu, 26 Jul 2007 21:43:22 +0000 Subject: [PATCH] -fix crash in shell32 caused by clamwin installer (patch by w3seek) svn path=/trunk/; revision=27887 --- reactos/dll/win32/shell32/shell32_main.c | 62 +++++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/reactos/dll/win32/shell32/shell32_main.c b/reactos/dll/win32/shell32/shell32_main.c index 83b9c2d0629..a9134182371 100644 --- a/reactos/dll/win32/shell32/shell32_main.c +++ b/reactos/dll/win32/shell32/shell32_main.c @@ -509,23 +509,59 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, /* 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)) + if (!(flags & SHGFI_USEFILEATTRIBUTES)) { - hr = IExtractIconW_GetIconLocation(pei, uGilFlags, - szLocation, MAX_PATH, &iIndex, &uFlags); - psfi->iIcon = iIndex; + UINT uDummy,uFlags; - if (!(uFlags & GIL_NOTFILENAME)) - lstrcpyW (psfi->szDisplayName, szLocation); + 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; + { + WCHAR sTemp [MAX_PATH]; + WCHAR * szExt; + DWORD dwNr=0; + static const WCHAR p1W[] = {'%','1',0}; - IExtractIconA_Release(pei); + 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; + } + } } }