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_m... ============================================================================== --- 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; + } + } } }