Icon文件结构和资源提取
Icon文件结构
ico文件是一种目录结构的文件,即文件内的数据格式结构是可以存放多文件(多个ico图标),用以让应用程序适配各个大小、展示对应尺寸的图标。可以通过Resource Hacker等工具分析PE文件的资源,如下图(图标组)。
为了存储多个图像,Icon文件中前若干个连续字节是文件头,存储文件个数,各个文件的位置和参数等信息。
解析Icon文件时,只需要读取对应的字节,即可构建出Icon文件的数据结构。直接读入文件到内存地址即可
#pragma pack(2) typedef struct { BYTE bWidth; // 图像宽度,以象素为单位。一个字节 BYTE bHeight; // 图像高度,以象素为单位。一个字节 BYTE bColorCount; // 图像中的颜色数(如果是>=8bpp的位图则为0) BYTE bReserved; // 保留字,必须是0 WORD wPlanes; // 标设备说明位面数,其值将总是被设为1 WORD wBitCount; // 每象素所占位数 DWORD dwBYTEsInRes; // 每份资源所占字节数 DWORD dwImageOffset; // 图像数据(iconimage)起点偏移位置 } TResDirHeader;//16字节 #pragma pack() typedef struct { WORD idReserved; WORD idType; WORD idCount; TResDirHeader idEntries[1]; } TIconResDirGrp, *PIconResDirGrp;
// open the icon file HANDLE hFile = CreateFile("iconPath", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE) { MessageBox(0, L"Failed open Icon File!", NULL, 0); return FALSE; } // get the file size DWORD dwFileSize = GetFileSize(hFile, NULL); void *filemem = malloc(dwFileSize); // read file to memory DWORD dwBytesRead;
ReadFile(hFile, filemem, dwFileSize, &dwBytesRead, NULL); CloseHandle(hFile); // assume the TIconResDirGrp STRUCT auto FileGrp = PIconResDirGrp(filemem);
参考:https://www.freesion.com/article/49531235234/