From d52e04781b226e9d7da5a35cb955e311e6de9491 Mon Sep 17 00:00:00 2001
From: Juergen Schmied <juergen.schmied@debitel.net>
Date: Sat, 26 Feb 2000 18:47:23 +0000
Subject: [PATCH] Fix for OpenIcon.

---
 dlls/shell32/folders.c   |  2 +-
 dlls/shell32/iconcache.c | 25 +++++++++++++++++--------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c
index 672c9e2060c..9464a6f9484 100644
--- a/dlls/shell32/folders.c
+++ b/dlls/shell32/folders.c
@@ -191,7 +191,7 @@ static HRESULT WINAPI IExtractIconA_fnGetIconLocation(
 	  else
 	  {
 	    lstrcpynA(szIconFile, "shell32.dll", cchMax);
-	    *piIndex = 3;
+	    *piIndex = (uFlags & GIL_OPENICON)? 4 : 3;
 	  }
 	}
 	else	/* object is file */
diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 4b92cd49d74..e645eb333b8 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -614,7 +614,8 @@ BOOL SIC_Initialize(void)
 	  return TRUE;
 	  
 	InitializeCriticalSection(&SHELL32_SicCS);
-
+	MakeCriticalSectionGlobal(&SHELL32_SicCS);
+	
 	sic_hdpa = pDPA_Create(16);
 	
 	if (!sic_hdpa)
@@ -672,6 +673,7 @@ void SIC_Destroy(void)
 	sic_hdpa = NULL;
 
 	LeaveCriticalSection(&SHELL32_SicCS);
+	DeleteCriticalSection(&SHELL32_SicCS);
 }
 /*************************************************************************
  * Shell_GetImageList			[SHELL32.71]
@@ -698,23 +700,30 @@ BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList)
  *	sh	[IN]	IShellFolder
  *	pidl	[IN]
  *	bBigIcon [IN]
+ *	uFlags	[IN]	GIL_*
  *	pIndex	[OUT]	index within the SIC
  *
  */
-BOOL PidlToSicIndex (IShellFolder * sh, LPITEMIDLIST pidl, BOOL bBigIcon, UINT * pIndex)
+BOOL PidlToSicIndex (
+	IShellFolder * sh,
+	LPITEMIDLIST pidl,
+	BOOL bBigIcon,
+	UINT uFlags,
+	UINT * pIndex)
 {	
-	IExtractIcon	*ei;
+	IExtractIconA	*ei;
 	char		szIconFile[MAX_PATH];	/* file containing the icon */
 	INT		iSourceIndex;		/* index or resID(negated) in this file */
 	BOOL		ret = FALSE;
 	UINT		dwFlags = 0;
 	
-	TRACE("sf=%p pidl=%p\n", sh, pidl);
+	TRACE("sf=%p pidl=%p %s\n", sh, pidl, bBigIcon?"Big":"Small");
 
 	if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconA, 0, (void **)&ei)))
 	{
-	  if (NOERROR==IExtractIconA_GetIconLocation(ei, 0, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags))
-	  { *pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex);
+	  if (SUCCEEDED(IExtractIconA_GetIconLocation(ei, uFlags, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags)))
+	  {
+	    *pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex);
 	    ret = TRUE;
 	  }
 	  IExtractIconA_Release(ei);
@@ -744,8 +753,8 @@ UINT WINAPI SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh, LPITEMIDLIST pidl,
 	pdump(pidl);
 	
 	if (pIndex)
-	  PidlToSicIndex ( sh, pidl, 1, pIndex);
-	PidlToSicIndex ( sh, pidl, 0, &Index);
+	  PidlToSicIndex ( sh, pidl, 1, 0, pIndex);
+	PidlToSicIndex ( sh, pidl, 0, 0, &Index);
 	return Index;
 }
 
-- 
GitLab