Hi!

I was looking for some help in a C code and i found this forum and decided to give it a try :P

After a couple of hours coding a console app to change an .exe icon (based on the article "Icons in Win32"), the result is quite surprising. I can't find any problem in the code or in the .exe after having its icon modified. In reshacker the Icon and IconGroup trees are fine. The problem is that the icon isnt displayed on explorer.

Here's my code, maybe someone can help me making it work properly. BTW, I'm not even checking previous icons yet, just replacing all the .exe resources.

Code:
#include <windows.h>
#include <stdio.h>

typedef struct _ICONDIRENTRY {
  BYTE bWidth;
  BYTE bHeight;
  BYTE bColorCount;
  BYTE bReserved;
  WORD wPlanes;
  WORD wBitCount;
  DWORD dwBytesInRes;
  DWORD dwImageOffset;
} ICONDIRENTRY, 
 * LPICONDIRENTRY;

typedef struct _ICONDIR {
  WORD idReserved;
  WORD idType;
  WORD idCount;
  ICONDIRENTRY idEntries[1];
} ICONDIR, 
 * LPICONDIR;

#pragma pack(push)
#pragma pack(2)
typedef struct _GRPICONDIRENTRY {
  BYTE bWidth;
  BYTE bHeight;
  BYTE bColorCount;
  BYTE bReserved;
  WORD wPlanes;
  WORD wBitCount;
  DWORD dwBytesInRes;
  WORD nID;
} GRPICONDIRENTRY, 
 * LPGRPICONDIRENTRY;
#pragma pack(pop)

#pragma pack(push)
#pragma pack(2)
typedef struct _GRPICONDIR {
  WORD idReserved;
  WORD idType;
  WORD idCount;
  GRPICONDIRENTRY idEntries[1];
} GRPICONDIR, 
 * LPGRPICONDIR;
#pragma pack(pop)

int main(int argc, char* argv[])
{
	/*if(argc != 3)
	{
		return 0;
	}*/
	HANDLE hFile = CreateFile("C:\\firefox.ico", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	LPICONDIR lpID = (LPICONDIR)malloc(sizeof(ICONDIR));
	DWORD dwBytesRead;
	ReadFile(hFile, &lpID->idReserved, sizeof(WORD), &dwBytesRead, NULL);
	ReadFile(hFile, &lpID->idType, sizeof(WORD), &dwBytesRead, NULL);
	ReadFile(hFile, &lpID->idCount, sizeof(WORD), &dwBytesRead, NULL);
	lpID = (LPICONDIR)realloc(lpID, (sizeof(WORD) * 3) + (sizeof(ICONDIRENTRY) * lpID->idCount));
	ReadFile(hFile, lpID->idEntries, sizeof(ICONDIRENTRY) * lpID->idCount, &dwBytesRead, NULL);
	LPGRPICONDIR lpGID = (LPGRPICONDIR)malloc(sizeof(GRPICONDIR));
	lpGID->idType = lpID->idReserved;
	lpGID->idType = lpID->idType;
	lpGID->idCount = lpID->idCount;
	lpGID = (LPGRPICONDIR)realloc(lpGID, (sizeof(WORD) * 3) + (sizeof(GRPICONDIRENTRY) * lpGID->idCount));
	int i;
	for(i = 0; i < lpGID->idCount; i++)
	{
		lpGID->idEntries[i].bWidth = lpID->idEntries[i].bWidth;
		lpGID->idEntries[i].bHeight = lpID->idEntries[i].bHeight;
		lpGID->idEntries[i].bColorCount = lpID->idEntries[i].bColorCount;
		lpGID->idEntries[i].bReserved = lpID->idEntries[i].bReserved;
		lpGID->idEntries[i].wPlanes = lpID->idEntries[i].wPlanes;
		lpGID->idEntries[i].wBitCount = lpID->idEntries[i].wBitCount;
		lpGID->idEntries[i].dwBytesInRes = lpID->idEntries[i].dwBytesInRes;
		lpGID->idEntries[i].nID = i + 1;
	}
	HANDLE hUpdate;
	hUpdate = BeginUpdateResource("C:\\app.exe", TRUE);
	if(hUpdate == NULL)
	{
		return 0;
	}
	for(i = 0; i < lpID->idCount; i++)
	{
		LPBYTE lpBuffer = (LPBYTE)malloc(lpID->idEntries[i].dwBytesInRes);
		SetFilePointer(hFile, lpID->idEntries[i].dwImageOffset, NULL, FILE_BEGIN);
		ReadFile(hFile, lpBuffer, lpID->idEntries[i].dwBytesInRes, &dwBytesRead, NULL);
		UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(lpGID->idEntries[i].nID), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), &lpBuffer[0], lpID->idEntries[i].dwBytesInRes);
		free(lpBuffer);
	}
	CloseHandle(hFile);
	UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), &lpGID[0], (sizeof(WORD) * 3) + (sizeof(GRPICONDIRENTRY) * lpGID->idCount));
	EndUpdateResource(hUpdate, FALSE);
	printf("Icon changed!\n");
	return 0;
}
Thanks in advance