Fixed: extract the icon by resource id.

diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index b923e15..25d503c 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -21,6 +21,8 @@
 #include "shellapi.h"
 #include "pidl.h"
 #include "shell32_main.h"
+#include "wine/undocshell.h"
+#include "shlwapi.h"
 
 DEFAULT_DEBUG_CHANNEL(shell)
 
@@ -210,7 +212,7 @@
  * returns
  *  failure:0; success: icon handle or nr of icons (nIconIndex-1)
  */
-HICON WINAPI ICO_ExtractIconEx(LPCSTR lpszExeFileName, HICON * RetPtr, UINT nIconIndex, UINT n, UINT cxDesired, UINT cyDesired )
+HICON WINAPI ICO_ExtractIconEx(LPCSTR lpszExeFileName, HICON * RetPtr, INT nIconIndex, UINT n, UINT cxDesired, UINT cyDesired )
 {	HGLOBAL		hRet = 0;
 	LPBYTE		pData;
 	OFSTRUCT	ofs;
@@ -358,8 +360,34 @@
 	    goto end_3;		/* success */
 	  }
 
+  /* (nIconIndex < 0): extract the icon by resource id */
+	  if( nIconIndex < 0 )
+	  {
+	    int n = 0;
+	    int iId = abs(nIconIndex);
+	    PIMAGE_RESOURCE_DIRECTORY_ENTRY xprdeTmp = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(icongroupresdir+1);
+
+	    while(n<iconDirCount && xprdeTmp)
+	    {              
+              if(xprdeTmp->u1.Id ==  iId)
+              {
+                  nIconIndex = n;
+                  break;
+              }
+              n++;
+              xprdeTmp++;                  
+	    }
+	    if (nIconIndex < 0)
+	    {
+	      WARN("resource id %d not found\n", iId);
+	      goto end_3;		/* failure */
+	    }
+	  }
+
+  /* check nIconIndex to be in range */
 	  if (nIconIndex >= iconDirCount) 
-	  { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
+	  {
+	    WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
 	    goto end_3;		/* failure */
 	  }
 
@@ -484,7 +512,7 @@
 
 	lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY));
 
-	lpsice->sSourceFile = HEAP_strdupA (GetProcessHeap(), 0, PathFindFilenameA(sSourceFile));
+	lpsice->sSourceFile = HEAP_strdupA (GetProcessHeap(), 0, PathFindFileNameA(sSourceFile));
 	lpsice->dwSourceIndex = dwSourceIndex;
 	
 	EnterCriticalSection(&SHELL32_SicCS);
@@ -549,7 +577,7 @@
 		
 	TRACE("%s %i\n", sSourceFile, dwSourceIndex);
 
-	sice.sSourceFile = PathFindFilenameA(sSourceFile);
+	sice.sSourceFile = PathFindFileNameA(sSourceFile);
 	sice.dwSourceIndex = dwSourceIndex;
 	
 	EnterCriticalSection(&SHELL32_SicCS);
@@ -741,7 +769,10 @@
  *	pIndex	[OUT][OPTIONAL]	SIC index for big icon
  *
  */
-UINT WINAPI SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh, LPITEMIDLIST pidl, UINT * pIndex)
+int WINAPI SHMapPIDLToSystemImageListIndex(
+	LPSHELLFOLDER sh,
+	LPCITEMIDLIST pidl,
+	UINT * pIndex)
 {
 	UINT	Index;