1: PIMAGE_RESOURCE_DATA_ENTRY pResourceDataGroupIcon = (PIMAGE_RESOURCE_DATA_ENTRY)((DWORD_PTR)(m_pResourceDirectory) + (DWORD_PTR)(pResourceEntryGroupIcon->OffsetToData));
2:
3: // Entete de l'icône
4: LPGRPICONDIR pGrpIconDir = (LPGRPICONDIR)(m_pResourceDirectory + pResourceDataGroupIcon->OffsetToData - m_dVirtualAddressResource);
5:
6: // Nom du fichier icône <= ID de la ressource + _ + CodePage
7: std::wostringstream wossNameIcon;
8: wossNameIcon << wId << L"_" << pResourceEntryGroupIcon->Id << L".ico";
9:
10: // Début de la génération du fichier icône
11: std::ofstream ofsIcon(wossNameIcon.str().c_str(), std::ios_base::binary);
12: if (!ofsIcon)
13: {
14: m_wsMessage = L"Création du fichier icône impossible";
15: return -1;
16: }
17:
18: try
19: {
20: // Insere l'entete du fichier icône
21: ofsIcon.write((char*)&pGrpIconDir->idReserved, sizeof(pGrpIconDir->idReserved));
22: ofsIcon.write((char*)&pGrpIconDir->idType, sizeof(pGrpIconDir->idType));
23: ofsIcon.write((char*)&pGrpIconDir->idCount, sizeof(pGrpIconDir->idCount));
24:
25: // Emplacement de la première image
26: DWORD dImageOffset = 6 + 16 * pGrpIconDir->idCount;
27:
28: // Insere les infos de chaque image de l'icône
29: LPGRPICONDIRENTRY pGrpIconDireEntry = (LPGRPICONDIRENTRY) (pGrpIconDir->idEntries);
30: for (WORD numImage = 0; numImage < pGrpIconDir->idCount; numImage++, pGrpIconDireEntry++)
31: {
32: ofsIcon.write((char*)&pGrpIconDireEntry->bWidth, sizeof(pGrpIconDireEntry->bWidth));
33: ofsIcon.write((char*)&pGrpIconDireEntry->bHeight, sizeof(pGrpIconDireEntry->bHeight));
34: ofsIcon.write((char*)&pGrpIconDireEntry->bColorCount, sizeof(pGrpIconDireEntry->bColorCount));
35: ofsIcon.write((char*)&pGrpIconDireEntry->bReserved, sizeof(pGrpIconDireEntry->bReserved));
36: ofsIcon.write((char*)&pGrpIconDireEntry->wPlanes, sizeof(pGrpIconDireEntry->wPlanes));
37: ofsIcon.write((char*)&pGrpIconDireEntry->wBitCount, sizeof(pGrpIconDireEntry->wBitCount));
38: ofsIcon.write((char*)&pGrpIconDireEntry->dwBytesInRes, sizeof(pGrpIconDireEntry->dwBytesInRes));
39: ofsIcon.write((char*)&dImageOffset, sizeof(DWORD));
40:
41: // Emplacement de la prochaine image
42: dImageOffset += pGrpIconDireEntry->dwBytesInRes;
43: }
44:
45: iRetour = 1;
46:
47: // Insere chaque image de l'icône
48: pGrpIconDireEntry = (LPGRPICONDIRENTRY) (pGrpIconDir->idEntries);
49: for (WORD numImage = 0; numImage < pGrpIconDir->idCount; numImage++, pGrpIconDireEntry++)
50: {
51: if (!WriteImageIcon(ofsIcon, pGrpIconDireEntry->nID))
52: {
53: m_wsMessage = L"Insertion d'image impossible";
54: iRetour = -1;
55: }
56: }
57: }
58: catch (...)
59: {
60: m_wsMessage = L"Insertion dans le fichier icône impossible";
61: iRetour= -1;
62: }
63:
64: // Libère le fichier
65: ofsIcon.close();
66:
67: ....
68:
69: bool CExtractResourceFromPEFile::WriteImageIcon(std::ofstream &ofsIcon, WORD dIdImage)
70: {
71: // Racine de l'arborescence des ressources
72: PIMAGE_RESOURCE_DIRECTORY pResourceDirectoryRacine = (PIMAGE_RESOURCE_DIRECTORY)m_pResourceDirectory;
73:
74: // Premiere entrée pour la recherche des images de l'icône
75: PIMAGE_RESOURCE_DIRECTORY_ENTRY pResourceEntryRacineRechercheImageIcone = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pResourceDirectoryRacine + 1);
76:
77: // Recherche la branche contenant les images des icônes (dans le premier niveau de l'arborescence des ressources)
78: for (WORD numEntry1 = 0; numEntry1 < (pResourceDirectoryRacine->NumberOfNamedEntries + pResourceDirectoryRacine->NumberOfIdEntries); numEntry1++, pResourceEntryRacineRechercheImageIcone++)
79: {
80: // Branche d'image d'icône ?
81: if ((DWORD)RT_ICON == pResourceEntryRacineRechercheImageIcone->Name)
82: {
83: // Branche des images d'icônes
84: PIMAGE_RESOURCE_DIRECTORY pResourceDirectoryImageIcons = (PIMAGE_RESOURCE_DIRECTORY)((pResourceEntryRacineRechercheImageIcone->OffsetToData & 0x7FFFFFFF) + m_pResourceDirectory);
85:
86: // Recherche l'image correspondant à l'icône
87: PIMAGE_RESOURCE_DIRECTORY_ENTRY pResourceEntryImageIcons = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pResourceDirectoryImageIcons + 1);
88: for (WORD numImageIcon = 0; numImageIcon < (pResourceDirectoryImageIcons->NumberOfNamedEntries + pResourceDirectoryImageIcons->NumberOfIdEntries); numImageIcon++, pResourceEntryImageIcons++)
89: {
90: // Image de l'icône ?
91: if (dIdImage == pResourceEntryImageIcons->Id)
92: {
93: // Branche d'une image d'icône
94: PIMAGE_RESOURCE_DIRECTORY pResourceDirectoryImageIcon = (PIMAGE_RESOURCE_DIRECTORY)((pResourceEntryImageIcons->OffsetToData & 0x7FFFFFFF) + m_pResourceDirectory);
95:
96: // Icône
97: PIMAGE_RESOURCE_DIRECTORY_ENTRY pResourceEntryImageIcon = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(pResourceDirectoryImageIcon+1);
98: PIMAGE_RESOURCE_DATA_ENTRY pResourceDataImageIcon = (PIMAGE_RESOURCE_DATA_ENTRY)((DWORD_PTR)(m_pResourceDirectory) + (DWORD_PTR)(pResourceEntryImageIcon->OffsetToData));
99:
100: // Ajoute l'image au fichier icône
101: ofsIcon.write((char*)(m_pResourceDirectory + pResourceDataImageIcon->OffsetToData - m_dVirtualAddressResource), pResourceDataImageIcon->Size);
102: }
103: }
104: }
105: }
106:
107: return true;
108: }