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