From: James McDonnell topgamer7@gmail.com
Try to lookup icon information from shell32.dll. --- dlls/shell32/iconcache.c | 107 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c index 8f9519d2ca8..5058f3c74d8 100644 --- a/dlls/shell32/iconcache.c +++ b/dlls/shell32/iconcache.c @@ -976,6 +976,109 @@ INT WINAPI SHGetIconOverlayIndexW(LPCWSTR pszIconPath, INT iIconIndex) return -1; }
+static INT stock_icon_id_to_resource_id(SHSTOCKICONID id) +{ + switch(id) + { +#define MISSING_ICON(x) case x : FIXME("Missing stock icon %s\n", #x); return -1 + case SIID_DOCNOASSOC: return IDI_SHELL_FILE; + case SIID_DOCASSOC: return IDI_SHELL_DOCUMENT; + case SIID_APPLICATION: return IDI_SHELL_WINDOW; + case SIID_FOLDER: return IDI_SHELL_FOLDER; + case SIID_FOLDEROPEN: return IDI_SHELL_FOLDER_OPEN; + case SIID_DRIVE525: return IDI_SHELL_5_12_FLOPPY; + case SIID_DRIVE35: return IDI_SHELL_3_14_FLOPPY; + case SIID_DRIVERREMOVE: return IDI_SHELL_FLOPPY; + case SIID_DRIVERFIXED: return IDI_SHELL_DRIVE; + case SIID_DRIVERNET: return IDI_SHELL_NETDRIVE; + case SIID_DRIVERNETDISABLE: return IDI_SHELL_NETDRIVE2; + case SIID_DRIVERCD: return IDI_SHELL_OPTICAL_DRIVE; + case SIID_DRIVERRAM: return IDI_SHELL_RAMDISK; + case SIID_WORLD: return IDI_SHELL_ENTIRE_NETWORK; + case SIID_SERVER: return IDI_SHELL_MY_COMPUTER; + case SIID_PRINTER: return IDI_SHELL_PRINTER; + case SIID_MYNETWORK: return IDI_SHELL_MY_NETWORK_PLACES; + case SIID_FIND: return IDI_SHELL_SEARCH; + case SIID_HELP: return IDI_SHELL_HELP; + MISSING_ICON(SIID_SHARE); + case SIID_LINK: return IDI_SHELL_SHORTCUT; + MISSING_ICON(SIID_SLOWFILE); + case SIID_RECYCLER: return IDI_SHELL_EMPTY_RECYCLE_BIN; + case SIID_RECYCLERFULL: return IDI_SHELL_FULL_RECYCLE_BIN; + case SIID_MEDIACDAUDIO: return IDI_SHELL_MUSIC_CD; + case SIID_LOCK: return IDI_SHELL_SECURITY; + MISSING_ICON(SIID_AUTOLIST); + case SIID_PRINTERNET: return IDI_SHELL_REMOTE_PRINTER; + MISSING_ICON(SIID_SERVERSHARE); + case SIID_PRINTERFAX: return IDI_SHELL_PRINTER; + MISSING_ICON(SIID_PRINTERFAXNET); + MISSING_ICON(SIID_PRINTERFILE); + MISSING_ICON(SIID_STACK); + MISSING_ICON(SIID_MEDIASVCD); + MISSING_ICON(SIID_STUFFEDFOLDER); + case SIID_DRIVEUNKNOWN: return IDI_SHELL_UNKNOWN_DRIVE; + MISSING_ICON(SIID_DRIVEDVD); + MISSING_ICON(SIID_MEDIADVD); + MISSING_ICON(SIID_MEDIADVDRAM); + MISSING_ICON(SIID_MEDIADVDRW); + MISSING_ICON(SIID_MEDIADVDR); + MISSING_ICON(SIID_MEDIADVDROM); + MISSING_ICON(SIID_MEDIACDAUDIOPLUS); + MISSING_ICON(SIID_MEDIACDRW); + MISSING_ICON(SIID_MEDIACDR); + MISSING_ICON(SIID_MEDIACDBURN); + MISSING_ICON(SIID_MEDIABLANKCD); + MISSING_ICON(SIID_MEDIACDROM); + MISSING_ICON(SIID_AUDIOFILES); + MISSING_ICON(SIID_IMAGEFILES); + MISSING_ICON(SIID_VIDEOFILES); + MISSING_ICON(SIID_MIXEDFILES); + MISSING_ICON(SIID_FOLDERBACK); + MISSING_ICON(SIID_FOLDERFRONT); + case SIID_SHIELD: return IDI_SHELL_SHIELD; + MISSING_ICON(SIID_WARNING); + MISSING_ICON(SIID_INFO); + case SIID_ERROR: return IDI_SHELL_RESTRICTED; + MISSING_ICON(SIID_KEY); + MISSING_ICON(SIID_SOFTWARE); + case SIID_RENAME: return IDI_SHELL_RENAME; + case SIID_DELETE: return IDI_SHELL_DELETE; + MISSING_ICON(SIID_MEDIAAUDIODVD); + MISSING_ICON(SIID_MEDIAMOVIEDVD); + MISSING_ICON(SIID_MEDIAENHANCEDCD); + MISSING_ICON(SIID_MEDIAENHANCEDDVD); + MISSING_ICON(SIID_MEDIAHDDVD); + MISSING_ICON(SIID_MEDIABLUERAY); + MISSING_ICON(SIID_MEDIAVCD); + MISSING_ICON(SIID_MEDIADVDPLUSR); + MISSING_ICON(SIID_MEDIADVDPLUSRW); + MISSING_ICON(SIID_DESKTOPPC); + MISSING_ICON(SIID_MOBILEPC); + case SIID_USERS: return IDI_SHELL_USERS; + MISSING_ICON(SIID_MEDIASMARTMEDIA); + MISSING_ICON(SIID_MEDIACOMPACTFLASH); + MISSING_ICON(SIID_DEVICECELLPHONE); + MISSING_ICON(SIID_DEVICECAMERA); + MISSING_ICON(SIID_DEVICEVIDEOCAMERA); + MISSING_ICON(SIID_DEVICEAUDIOPLAYER); + MISSING_ICON(SIID_NETWORKCONNECT); + case SIID_INTERNET: return IDI_SHELL_ENTIRE_NETWORK; + MISSING_ICON(SIID_ZIPFILE); + case SIID_SETTINGS: return IDI_SHELL_SETTINGS; + MISSING_ICON(SIID_DRIVEHDDVD); + MISSING_ICON(SIID_DRIVEBD); + MISSING_ICON(SIID_MEDIAHDDVDROM); + MISSING_ICON(SIID_MEDIAHDDVDR); + MISSING_ICON(SIID_MEDIAHDDVDRAM); + MISSING_ICON(SIID_MEDIABDROM); + MISSING_ICON(SIID_MEDIABDR); + MISSING_ICON(SIID_MEDIABDRE); + MISSING_ICON(SIID_CLUSTEREDDRIVE); + default: FIXME("Undefined stock icon id %d\n", id); return -1; +#undef MISSING_ICON + } +} + /**************************************************************************** * SHGetStockIconInfo [SHELL32.@] * @@ -1004,12 +1107,12 @@ HRESULT WINAPI SHGetStockIconInfo(SHSTOCKICONID id, UINT flags, SHSTOCKICONINFO sii->iIcon = -IDI_SHELL_FILE; lstrcatW(sii->szPath, L"\shell32.dll");
- if (flags) + if (flags & ~SHGSI_ICON) FIXME("flags 0x%x not implemented\n", flags);
sii->hIcon = NULL; if (flags & SHGSI_ICON) - sii->hIcon = LoadIconW(GetModuleHandleW(sii->szPath), MAKEINTRESOURCEW(sii->iIcon)); + sii->hIcon = LoadIconW(GetModuleHandleW(sii->szPath), MAKEINTRESOURCEW(stock_icon_id_to_resource_id(id))); sii->iSysImageIndex = -1;
TRACE("%3d: returning %s (%d)\n", id, debugstr_w(sii->szPath), sii->iIcon);