ICON SET WORKS !

This commit is contained in:
RamiLego4Game
2018-05-13 15:19:59 +03:00
parent 596ad79acf
commit b7fff85777

View File

@@ -144,6 +144,8 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
local NumberOfNameEntries = decodeNumber(exeFile:read(2),true) local NumberOfNameEntries = decodeNumber(exeFile:read(2),true)
local NumberOfIDEntries = decodeNumber(exeFile:read(2),true) local NumberOfIDEntries = decodeNumber(exeFile:read(2),true)
print("--readResourceDirectoryTable",RootOffset,Level,MajorVersion,MinorVersion,TimeDateStamp,NumberOfNameEntries,NumberOfIDEntries)
--Parse Entries --Parse Entries
for i=1,NumberOfNameEntries+NumberOfIDEntries do for i=1,NumberOfNameEntries+NumberOfIDEntries do
local Name = decodeNumber(exeFile:read(4),true) local Name = decodeNumber(exeFile:read(4),true)
@@ -161,6 +163,8 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
local NameLength = decodeNumber(exeFile:read(2),true) local NameLength = decodeNumber(exeFile:read(2),true)
--Decode UTF-16LE string --Decode UTF-16LE string
Name = decodeUTF16(exeFile:read(NameLength*2)) Name = decodeUTF16(exeFile:read(NameLength*2))
print("Name Entry",Name)
else else
--Name is an ID --Name is an ID
Name = band(Name,0xFFFF) Name = band(Name,0xFFFF)
@@ -170,12 +174,15 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
Name = resourcesTypes[Name] Name = resourcesTypes[Name]
end end
end end
print("ID Entry",Name)
end end
if band(Offset,0x80000000) ~= 0 then if band(Offset,0x80000000) ~= 0 then
--Another directory --Another directory
exeFile:seek(RootOffset + band(Offset,0x7FFFFFFF)) exeFile:seek(RootOffset + band(Offset,0x7FFFFFFF))
print("Another Directory")
Tree[Name] = readResourceDirectoryTable(exeFile,Sections,RootOffset,Level+1) Tree[Name] = readResourceDirectoryTable(exeFile,Sections,RootOffset,Level+1)
else else
--Data offset --Data offset
@@ -185,6 +192,9 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
local DataSize = decodeNumber(exeFile:read(4),true) local DataSize = decodeNumber(exeFile:read(4),true)
local DataCodepage = decodeNumber(exeFile:read(4),true) local DataCodepage = decodeNumber(exeFile:read(4),true)
print("DATA",DataRVA,DataSize,DataCodepage)
if DataCodepage ~= 0 then print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") end
local DataOffset = convertRVA2Offset(DataRVA,Sections) local DataOffset = convertRVA2Offset(DataRVA,Sections)
exeFile:seek(DataOffset) exeFile:seek(DataOffset)
@@ -195,6 +205,8 @@ local function readResourceDirectoryTable(exeFile,Sections,RootOffset,Level)
exeFile:seek(ReturnOffset) exeFile:seek(ReturnOffset)
end end
print("---Directory end")
return Tree return Tree
end end
@@ -220,10 +232,12 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
end end
end end
table.sort(IDEntries,function(a,b) return a[1] < b[1] end)
--Write the resource directory table --Write the resource directory table
Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Characteristics Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Characteristics
Data[#Data+1] = encodeNumber(os.time(),4,false) Offset = Offset + 4 --Time/Date Stamp Data[#Data+1] = encodeNumber(0,4,false) Offset = Offset + 4 --Time/Date Stamp
Data[#Data+1] = encodeNumber(1,2,false) Offset = Offset + 2 --Major Version Data[#Data+1] = encodeNumber(0,2,false) Offset = Offset + 2 --Major Version
Data[#Data+1] = encodeNumber(0,2,false) Offset = Offset + 2 --Minor Version Data[#Data+1] = encodeNumber(0,2,false) Offset = Offset + 2 --Minor Version
Data[#Data+1] = encodeNumber(#NameEntries,2,false) Offset = Offset + 2 --Number of name entries Data[#Data+1] = encodeNumber(#NameEntries,2,false) Offset = Offset + 2 --Number of name entries
Data[#Data+1] = encodeNumber(#IDEntries,2,false) Offset = Offset + 2 --Number of ID entries Data[#Data+1] = encodeNumber(#IDEntries,2,false) Offset = Offset + 2 --Number of ID entries
@@ -277,13 +291,13 @@ local function buildResourcesDirectoryTable(ResourcesTree,VirtualAddress)
end end
for _, Entry in ipairs(NameEntries) do for _, Entry in ipairs(NameEntries) do
Data[EntriesID+1] = Entry[3]; EntriesID = EntriesID + 1 Data[EntriesID+1] = encodeNumber(Entry[3],4,false); EntriesID = EntriesID + 1
Data[EntriesID+1] = Entry[4]; EntriesID = EntriesID + 1 Data[EntriesID+1] = encodeNumber(Entry[4],4,false); EntriesID = EntriesID + 1
end end
for _, Entry in ipairs(IDEntries) do for _, Entry in ipairs(IDEntries) do
Data[EntriesID+1] = Entry[3]; EntriesID = EntriesID + 1 Data[EntriesID+1] = encodeNumber(Entry[3],4,false); EntriesID = EntriesID + 1
Data[EntriesID+1] = Entry[4]; EntriesID = EntriesID + 1 Data[EntriesID+1] = encodeNumber(Entry[4],4,false); EntriesID = EntriesID + 1
end end
Level = Level - 1 Level = Level - 1
@@ -653,6 +667,8 @@ function icapi.replaceIcon(exeFile,icoFile,newFile)
--Parse the resources data --Parse the resources data
local ResourcesTree = readResourceDirectoryTable(exeFile,Sections,ResourcesOffset,0) local ResourcesTree = readResourceDirectoryTable(exeFile,Sections,ResourcesOffset,0)
writeTree(ResourcesTree,"/!NEW RES/")
print("Finished reading...") print("Finished reading...")
local GroupID = getAnyKey(ResourcesTree["GROUP_ICON"]) local GroupID = getAnyKey(ResourcesTree["GROUP_ICON"])
@@ -682,10 +698,10 @@ function icapi.replaceIcon(exeFile,icoFile,newFile)
print("NEW OLD OFFSET",NewRSRCSize,OldRSRCSize,ShiftOffset) print("NEW OLD OFFSET",NewRSRCSize,OldRSRCSize,ShiftOffset)
DataDirectories[3][2] = NewRSRCSize DataDirectories[3][2] = NewRSRCSize
Sections[RSRC_ID].VirtualSize = Sections[RSRC_ID].VirtualSize + ShiftOffset --Sections[RSRC_ID].VirtualSize = Sections[RSRC_ID].VirtualSize + ShiftOffset
Sections[RSRC_ID].SizeOfRawData = Sections[RSRC_ID].SizeOfRawData + ShiftOffset Sections[RSRC_ID].SizeOfRawData = Sections[RSRC_ID].SizeOfRawData + ShiftOffset
local RSRC_Pointer = Sections[RSRC_ID].PointerToRawData --[[local RSRC_Pointer = Sections[RSRC_ID].PointerToRawData
for id, Section in ipairs(Sections) do for id, Section in ipairs(Sections) do
if Sections[id].PointerToRawData > RSRC_Pointer then if Sections[id].PointerToRawData > RSRC_Pointer then
@@ -699,6 +715,12 @@ function icapi.replaceIcon(exeFile,icoFile,newFile)
end end
end end
for id, Directory in ipairs(DataDirectories) do
if Directory[1] > Sections[RSRC_ID].VirtualAddress then
Directory[1] = Directory[1] + ShiftOffset
end
end]]
print("Writing the DOS,PE,COFF and PEOpt headers...",DataDirectoriesOffset) print("Writing the DOS,PE,COFF and PEOpt headers...",DataDirectoriesOffset)
--Copy the DOS,PE,COFF and PEOpt headers --Copy the DOS,PE,COFF and PEOpt headers