Stub implementations for SHUpdateImageA, SHHandleUpdateImage,
SHObjectProperties, SHGetNewLinkInfo{A,W}, SHStartNetConnectionDialog,
SHEmptyRecycleBin{A,W}, SHFormatDrive, SHQueryRecycleBin{A,W}.
'HeapAlloc can fail' fix for ExtractIconExA.
Implement ExtractAssociatedIconA -> W.
Correct prototype for SHObjectProperties.
Forward SHGetNewLinkInfo to SHGetNewLinkInfoA.

diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 410cc86..af4b2f5 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -420,15 +420,18 @@
  */
 UINT WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons)
 {
-    UINT ret;
+    UINT ret = 0;
     INT len = MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, NULL, 0);
     LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
 
     TRACE("%s %i %p %p %i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
 
-    MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len);
-    ret = ExtractIconExW (lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
-    HeapFree(GetProcessHeap(), 0, lpwstrFile);
+    if (lpwstrFile)
+    {
+        MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len);
+        ret = ExtractIconExW(lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
+        HeapFree(GetProcessHeap(), 0, lpwstrFile);
+    }
     return ret;
 }
 
@@ -440,43 +443,55 @@
  */
 HICON WINAPI ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon)
 {	
-	HICON hIcon;
-	WORD wDummyIcon = 0;
-	
-	TRACE("\n");
+    HICON hIcon = NULL;
+    INT len = MultiByteToWideChar(CP_ACP, 0, lpIconPath, -1, NULL, 0);
+    LPWSTR lpIconPathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
 
-	if(lpiIcon == NULL)
-	    lpiIcon = &wDummyIcon;
+    TRACE("%p %s %p\n", hInst, debugstr_a(lpIconPath), lpiIcon);
 
-	hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon);
+    if (lpIconPathW)
+    {
+        MultiByteToWideChar(CP_ACP, 0, lpIconPath, -1, lpIconPathW, len);
+        hIcon = ExtractAssociatedIconW(hInst, lpIconPathW, lpiIcon);
+        HeapFree(GetProcessHeap(), 0, lpIconPathW);
+    }
+    return hIcon;
+}
 
-	if( hIcon < (HICON)2 )
-	{ if( hIcon == (HICON)1 ) /* no icons found in given file */
-	  { char  tempPath[0x80];
-	    HINSTANCE uRet = FindExecutableA(lpIconPath,NULL,tempPath);
+HICON WINAPI ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon)
+{
+    HICON hIcon = NULL;
+    WORD wDummyIcon = 0;
 
-	    if( uRet > (HINSTANCE)32 && tempPath[0] )
-	    { strcpy(lpIconPath,tempPath);
-	      hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon);
-	      if( hIcon > (HICON)2 )
-	        return hIcon;
-	    }
-	    else hIcon = 0;
-	  }
+    TRACE("%p %s %p\n", hInst, debugstr_w(lpIconPath), lpiIcon);
 
-	  if( hIcon == (HICON)1 )
-	    *lpiIcon = 2;   /* MSDOS icon - we found .exe but no icons in it */
-	  else
-	    *lpiIcon = 6;   /* generic icon - found nothing */
+    if(lpiIcon == NULL)
+        lpiIcon = &wDummyIcon;
 
-	  if (GetModuleFileNameA(hInst, lpIconPath, 0x80))
-          {
-              /* terminate string (GetModuleFileName doesn't do if buffer is too small) */
-              lpIconPath[0x80 - 1] = '\0';
-              hIcon = LoadIconA( hInst, MAKEINTRESOURCEA(*lpiIcon));
-          }
-	}
-	return hIcon;
+    hIcon = ExtractIconW(hInst, lpIconPath, *lpiIcon);
+
+    if( hIcon < (HICON)2 )
+    { if( hIcon == (HICON)1 ) /* no icons found in given file */
+      { WCHAR tempPath[MAX_PATH];
+        HINSTANCE uRet = FindExecutableW(lpIconPath,NULL,tempPath);
+
+        if( uRet > (HINSTANCE)32 && tempPath[0] )
+        { lstrcpyW(lpIconPath,tempPath);
+          hIcon = ExtractIconW(hInst, lpIconPath, *lpiIcon);
+          if( hIcon > (HICON)2 )
+            return hIcon;
+        }
+      }
+
+      if( hIcon == (HICON)1 )
+        *lpiIcon = 2;   /* MSDOS icon - we found .exe but no icons in it */
+      else
+        *lpiIcon = 6;   /* generic icon - found nothing */
+
+      if (GetModuleFileNameW(hInst, lpIconPath, MAX_PATH))
+        hIcon = LoadIconW(hInst, MAKEINTRESOURCEW(*lpiIcon));
+    }
+    return hIcon;
 }
 
 /*************************************************************************
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 894924c..17e7098 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -169,9 +169,9 @@
  175 stdcall SHGetSpecialFolderPath(long long long long) SHGetSpecialFolderPathAW
  176 stdcall SHSetInstanceExplorer (long)
  177 stub DAD_SetDragImageFromListView
- 178 stub SHObjectProperties
- 179 stub SHGetNewLinkInfoA
- 180 stub SHGetNewLinkInfoW
+ 178 stdcall SHObjectProperties(long long wstr wstr)
+ 179 stdcall SHGetNewLinkInfoA(str str ptr long long)
+ 180 stdcall SHGetNewLinkInfoW(wstr wstr ptr long long)
  181 stdcall RegisterShellHook(long long)
  182 varargs ShellMessageBoxW(long long long str long)
  183 varargs ShellMessageBoxA(long long long str long)
@@ -182,9 +182,9 @@
  188 stdcall ShellDDEInit(long)
  189 stdcall ILCreateFromPathA(str)
  190 stdcall ILCreateFromPathW(wstr)
- 191 stub SHUpdateImageA
+ 191 stdcall SHUpdateImageA(str long long long)
  192 stdcall SHUpdateImageW(wstr long long long)
- 193 stub SHHandleUpdateImage
+ 193 stdcall SHHandleUpdateImage(ptr)
  194 stub SHCreatePropSheetExtArrayEx
  195 stdcall SHFree(ptr)
  196 stdcall SHAlloc(long)
@@ -206,7 +206,7 @@
  212 stub Printers_AddPrinterPropPages
  213 stub Printers_RegisterWindowW
  214 stub Printers_UnregisterWindow
- 215 stub SHStartNetConnectionDialog
+ 215 stdcall SHStartNetConnectionDialog(long str long)
  243 stdcall @(long long) shell32_243
  244 stdcall SHInitRestricted(ptr ptr)
  247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long)
@@ -242,8 +242,8 @@
  296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIconA
  297 stdcall Shell_NotifyIconA(long ptr)
  298 stdcall Shell_NotifyIconW(long ptr)
- 299 stub Shl1632_ThunkData32
- 300 stub Shl3216_ThunkData32
+#299 stub Shl1632_ThunkData32
+#300 stub Shl3216_ThunkData32
  301 stdcall StrChrA(str long) shlwapi.StrChrA
  302 stdcall StrChrIA(str long) shlwapi.StrChrIA
  303 stdcall StrChrIW(wstr long) shlwapi.StrChrIW
@@ -338,10 +338,10 @@
 @ stdcall DoEnvironmentSubstW(wstr wstr)
 @ stub DragQueryFileAorW
 @ stdcall DuplicateIcon(long long)
-@ stdcall ExtractAssociatedIconA(long ptr long)
+@ stdcall ExtractAssociatedIconA(long str ptr)
 @ stdcall ExtractAssociatedIconExA(long str long long)
 @ stdcall ExtractAssociatedIconExW(long wstr long long)
-@ stub ExtractAssociatedIconW
+@ stdcall ExtractAssociatedIconW(long wstr ptr)
 @ stdcall ExtractIconA(long str long)
 @ stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconExA
 @ stdcall ExtractIconExA(str long ptr ptr long)
@@ -376,12 +376,12 @@
 @ stdcall SHCreateDirectoryExA(long str ptr)
 @ stdcall SHCreateDirectoryExW(long wstr ptr)
 @ stub ShellHookProc
-@ stub SHEmptyRecycleBinA
-@ stub SHEmptyRecycleBinW
+@ stdcall SHEmptyRecycleBinA(long str long)
+@ stdcall SHEmptyRecycleBinW(long wstr long)
 @ stdcall SHFileOperation(ptr) SHFileOperationA
 @ stdcall SHFileOperationA(ptr)
 @ stdcall SHFileOperationW(ptr)
-@ stub SHFormatDrive
+@ stdcall SHFormatDrive(long long long long)
 @ stdcall SHFreeNameMappings(ptr)
 @ stdcall SHGetDesktopFolder(ptr)
 @ stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfoA
@@ -389,7 +389,7 @@
 @ stdcall SHGetFileInfoW(ptr long ptr long long)
 @ stdcall SHGetInstanceExplorer(long)
 @ stdcall SHGetMalloc(ptr)
-@ stub SHGetNewLinkInfo
+@ stdcall SHGetNewLinkInfo(str str ptr long long) SHGetNewLinkInfoA
 @ stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDListA
 @ stdcall SHGetPathFromIDListA(ptr ptr)
 @ stdcall SHGetPathFromIDListW(ptr ptr)
@@ -399,8 +399,8 @@
 @ stub SHHelpShortcuts_RunDLLA
 @ stub SHHelpShortcuts_RunDLLW
 @ stdcall SHLoadInProc(long)
-@ stub SHQueryRecycleBinA
-@ stub SHQueryRecycleBinW
+@ stdcall SHQueryRecycleBinA(str ptr)
+@ stdcall SHQueryRecycleBinW(wstr ptr)
 @ stub SHUpdateRecycleBinIcon
 @ stub WOWShellExecute
 
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 13f3d7a..ad6261e 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -1546,5 +1546,90 @@
  */
 void WINAPI SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex)
 {
-    FIXME("%s, %d, 0x%x, %d\n", debugstr_w(pszHashItem), iIndex, uFlags, iImageIndex);
+    FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_w(pszHashItem), iIndex, uFlags, iImageIndex);
+}
+
+VOID WINAPI SHUpdateImageA(LPCSTR pszHashItem, INT iIndex, UINT uFlags, INT iImageIndex)
+{
+    FIXME("%s, %d, 0x%x, %d - stub\n", debugstr_a(pszHashItem), iIndex, uFlags, iImageIndex);
+}
+
+INT WINAPI SHHandleUpdateImage(LPCITEMIDLIST pidlExtra)
+{
+    FIXME("%p - stub\n", pidlExtra);
+
+    return -1;
+}
+
+BOOL WINAPI SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR szObject, LPCWSTR szPage)
+{
+    FIXME("%p, 0x%08lx, %s, %s - stub\n", hwnd, dwType, debugstr_w(szObject), debugstr_w(szPage));
+
+    return TRUE;
+}
+
+BOOL WINAPI SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy,
+                              UINT uFlags)
+{
+    FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_a(pszLinkTo), debugstr_a(pszDir),
+          pszName, pfMustCopy, uFlags);
+
+    return FALSE;
+}
+
+BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy,
+                              UINT uFlags)
+{
+    FIXME("%s, %s, %p, %p, 0x%08x - stub\n", debugstr_w(pszLinkTo), debugstr_w(pszDir),
+          pszName, pfMustCopy, uFlags);
+
+    return FALSE;
+}
+
+HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType)
+{
+    FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRemoteName), dwType);
+
+    return S_OK;
+}
+
+HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
+{
+    FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRootPath), dwFlags);
+
+    return S_OK;
+}
+
+HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
+{
+    FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_w(pszRootPath), dwFlags);
+
+    return S_OK;
+}
+
+DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options)
+{
+    FIXME("%p, 0x%08x, 0x%08x, 0x%08x - stub\n", hwnd, drive, fmtID, options);
+
+    return SHFMT_NOFORMAT;
+}
+
+HRESULT WINAPI SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
+{
+    FIXME("%s, %p - stub\n", debugstr_a(pszRootPath), pSHQueryRBInfo);
+
+    pSHQueryRBInfo->i64Size = 0;
+    pSHQueryRBInfo->i64NumItems = 0;
+
+    return S_OK;
+}
+
+HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo)
+{
+    FIXME("%s, %p - stub\n", debugstr_w(pszRootPath), pSHQueryRBInfo);
+
+    pSHQueryRBInfo->i64Size = 0;
+    pSHQueryRBInfo->i64NumItems = 0;
+
+    return S_OK;
 }
diff --git a/include/shellapi.h b/include/shellapi.h
index e5d4ecc..50960ba 100644
--- a/include/shellapi.h
+++ b/include/shellapi.h
@@ -400,6 +400,24 @@
 #define     SHGetNewLinkInfo WINELIB_NAME_AW(SHGetNewLinkInfo)
 
 /******************************************
+ * Recycle bin
+ */
+
+typedef struct _SHQUERYRBINFO
+{
+    DWORD cbSize;
+    DWORDLONG i64Size;
+    DWORDLONG i64NumItems;
+} SHQUERYRBINFO, *LPSHQUERYRBINFO;
+
+HRESULT     WINAPI SHEmptyRecycleBinA(HWND,LPCSTR,DWORD);
+HRESULT     WINAPI SHEmptyRecycleBinW(HWND,LPCWSTR,DWORD);
+#define     SHEmptyRecycleBin WINELIB_NAME_AW(SHEmptyRecycleBin)
+HRESULT     WINAPI SHQueryRecycleBinA(LPCSTR,LPSHQUERYRBINFO);
+HRESULT     WINAPI SHQueryRecycleBinW(LPCWSTR,LPSHQUERYRBINFO);
+#define     SHQueryRecycleBin WINELIB_NAME_AW(SHQueryRecycleBin)
+
+/******************************************
  * Misc
  */
 
diff --git a/include/shlobj.h b/include/shlobj.h
index 839f8bf..259e66c 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -41,26 +41,34 @@
 #define             SHCLSIDFromString WINELIB_NAME_AW(SHCLSIDFromString)
 HRESULT      WINAPI SHCreateStdEnumFmtEtc(DWORD,const FORMATETC *,IEnumFORMATETC**);
 BOOL         WINAPI SHFindFiles(LPCITEMIDLIST,LPCITEMIDLIST);
+DWORD        WINAPI SHFormatDrive(HWND,UINT,UINT,UINT);
 void         WINAPI SHFree(LPVOID);
 BOOL         WINAPI GetFileNameFromBrowse(HWND,LPSTR,DWORD,LPCSTR,LPCSTR,LPCSTR,LPCSTR);
 BOOL         WINAPI SHGetPathFromIDListA(LPCITEMIDLIST,LPSTR);
 BOOL         WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR);
 #define             SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList)
+INT          WINAPI SHHandleUpdateImage(LPCITEMIDLIST);
 HRESULT      WINAPI SHILCreateFromPath(LPCWSTR,LPITEMIDLIST*,DWORD*);
 HRESULT      WINAPI SHLoadOLE(LPARAM);
 LPITEMIDLIST WINAPI SHSimpleIDListFromPath(LPCWSTR);
 int          WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*);
-
+HRESULT      WINAPI SHStartNetConnectionDialog(HWND,LPCSTR,DWORD);
+VOID         WINAPI SHUpdateImageA(LPCSTR,INT,UINT,INT);
+VOID         WINAPI SHUpdateImageW(LPCWSTR,INT,UINT,INT);
+#define             SHUpdateImage WINELIB_NAME_AW(SHUpdateImage) 
 int          WINAPI RestartDialog(HWND,LPCWSTR,DWORD);
 int          WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD);
 
+#define SHFMT_ERROR     0xFFFFFFFFL  /* Error on last format, drive may be formatable */
+#define SHFMT_CANCEL    0xFFFFFFFEL  /* Last format was canceled */
+#define SHFMT_NOFORMAT  0xFFFFFFFDL  /* Drive is not formatable */
 
 /* SHObjectProperties flags */
 #define SHOP_PRINTERNAME 0x01
 #define SHOP_FILEPATH    0x02
 #define SHOP_VOLUMEGUID  0x04
 
-BOOL WINAPI SHObjectProperties(HWND,UINT,LPCWSTR,LPCWSTR);
+BOOL WINAPI SHObjectProperties(HWND,DWORD,LPCWSTR,LPCWSTR);
 
 #define PCS_FATAL           0x80000000
 #define PCS_REPLACEDCHAR    0x00000001