ExtractIconEx. Полный исходный код находится в моем проекте с открытым исходным кодом , файл с именем icon.cpp. Он поддерживает расширение системных переменных и получение иконки из индекса, например %SYSTEMROOT%\system32\shell32.dll,43
Вот его внутренности:
HICON GoFindAnIcon(LPCTSTR path)
{
HICON icon = 0;
//not using our parent's icon
if(_tcsicmp(L"parent", path))
{
icon = (HICON)LoadImage(0, path, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_LOADFROMFILE|LR_LOADMAP3DCOLORS);
if(!icon)
{
//Try something else
TCHAR mypath[MAX_PATH];
const TCHAR *cleanpath = path;
const TCHAR *comma;
comma = _tcsrchr(path, ',');
UINT index = 1;
if(comma)
{
_tcsncpy(mypath, path, comma-path); //Can you exploit this buffer overflow ?
mypath[comma-path] = TCHAR(0);
index = _ttoi(comma+1);
cleanpath = mypath;
}
ExtractIconEx(cleanpath, index, 0, &icon, 1);
}
}
else
{
icon = GetParentProcessIcon();
}
return icon;
}