diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index aad6a79f46c02f4ec8b472502d91b7c91cf88345..9b46f19ca7cddae6130496633639b0e4140e79ad 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -706,7 +706,7 @@ INT32 WINAPI Shell_GetCachedImageIndex32AW(LPCVOID szPath, INT32 nIndex, DWORD z
 /*************************************************************************
 *	ExtracticonEx32		[shell32.189]
 */
-HICON32 WINAPI ExtractIconEx32AW ( LPVOID lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
+HICON32 WINAPI ExtractIconEx32AW ( LPCVOID lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
 {	if (VERSION_OsIsUnicode())
 	  return ExtractIconEx32W ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
 	return ExtractIconEx32A ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
@@ -718,7 +718,7 @@ HICON32 WINAPI ExtractIconEx32AW ( LPVOID lpszFile, INT32 nIconIndex, HICON32 *
 *  1 file is not valid
 *  HICON32 handle of a icon (phiconLarge/Small == NULL)
 */
-HICON32 WINAPI ExtractIconEx32A ( LPSTR lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
+HICON32 WINAPI ExtractIconEx32A ( LPCSTR lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
 {	HICON32 ret=0;
 	
 	TRACE(shell,"file=%s idx=%i %p %p num=%i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons );
@@ -750,7 +750,7 @@ HICON32 WINAPI ExtractIconEx32A ( LPSTR lpszFile, INT32 nIconIndex, HICON32 * ph
 /*************************************************************************
 *	ExtracticonEx32W	[shell32.191]
 */
-HICON32 WINAPI ExtractIconEx32W ( LPWSTR lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
+HICON32 WINAPI ExtractIconEx32W ( LPCWSTR lpszFile, INT32 nIconIndex, HICON32 * phiconLarge, HICON32 * phiconSmall, UINT32 nIcons )
 {	LPSTR sFile;
 	DWORD ret;
 	
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 3a5ffb647cbad8cd533153f7781a03ae6bbdc2bc..50e8eeff9dd3975a92599f1f12b9ef03dc87218b 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -21,7 +21,7 @@ type	win16
  37 pascal   DoEnvironmentSubst(ptr word) DoEnvironmentSubst
  38 pascal   FindEnvironmentString(ptr) FindEnvironmentString
  39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon
- 40 stub ExtractIconEx
+ 40 pascal16 ExtractIconEx(str word ptr ptr word) ExtractIconEx16
 # 98 stub SHL3216_THUNKDATA16
 # 99 stub SHL1632_THUNKDATA16
 
diff --git a/include/shell.h b/include/shell.h
index 2b5cdf69137d477a51af905b2ae756ce47e21964..884ac5b19cd31666e636546615eea07721535775 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -311,10 +311,11 @@ LPWSTR WINAPI StrFormatByteSize32W ( DWORD dw, LPWSTR pszBuf, UINT32 cchBuf );
 /****************************************************************************
 *  other functions
 */
-HICON32 WINAPI ExtractIconEx32A ( LPSTR, INT32, HICON32 *, HICON32 *, UINT32 );
-HICON32 WINAPI ExtractIconEx32W ( LPWSTR, INT32, HICON32 *, HICON32 *, UINT32 );
+HICON16 WINAPI ExtractIconEx16 ( LPCSTR, INT16, HICON16 *, HICON16 *, UINT16 );
+HICON32 WINAPI ExtractIconEx32A( LPCSTR, INT32, HICON32 *, HICON32 *, UINT32 );
+HICON32 WINAPI ExtractIconEx32W( LPCWSTR, INT32, HICON32 *, HICON32 *, UINT32 );
 #define  ExtractIconEx WINELIB_NAME_AW(ExtractIconEx)
-HICON32 WINAPI ExtractIconEx32AW ( LPVOID, INT32, HICON32 *, HICON32 *, UINT32 );
+HICON32 WINAPI ExtractIconEx32AW(LPCVOID, INT32, HICON32 *, HICON32 *, UINT32 );
 
 LPVOID WINAPI SHAlloc(DWORD len);
 DWORD WINAPI SHFree(LPVOID x);
diff --git a/misc/shell.c b/misc/shell.c
index 4947eeb3d44a88991bf2350d9c1bb9201d8e3e4b..d30603214d80dedbffda4d3b1ce1860bf6c9f95c 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -875,7 +875,38 @@ HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
     return ExtractIcon32A( hInstance, lpszExeFileName, nIconIndex );
 }
 
-
+/*************************************************************************
+ *             ExtractIconEx16   (SHELL.40)
+ */
+HICON16 WINAPI ExtractIconEx16(
+	LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge,
+	HICON16 *phiconSmall, UINT16 nIcons
+) {
+    HICON32	*ilarge,*ismall;
+    UINT16	ret;
+    int		i;
+
+    if (phiconLarge)
+    	ilarge = (HICON32*)HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON32));
+    else
+    	ilarge = NULL;
+    if (phiconSmall)
+    	ismall = (HICON32*)HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON32));
+    else
+    	ismall = NULL;
+    ret = ExtractIconEx32A(lpszFile,nIconIndex,ilarge,ismall,nIcons);
+    if (ilarge) {
+    	for (i=0;i<nIcons;i++)
+	    phiconLarge[i]=ilarge[i];
+	HeapFree(GetProcessHeap(),0,ilarge);
+    }
+    if (ismall) {
+    	for (i=0;i<nIcons;i++)
+	    phiconSmall[i]=ismall[i];
+	HeapFree(GetProcessHeap(),0,ismall);
+    }
+    return ret;
+}
 
 /*************************************************************************
  *				ExtractAssociatedIcon	[SHELL.36]