mirror of
https://github.com/TangentFoxy/love-pe.git
synced 2025-07-28 02:02:16 +00:00
ICON SET WORKS !
This commit is contained in:
38
love-pe.lua
38
love-pe.lua
@@ -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
|
||||||
|
Reference in New Issue
Block a user