Skip to content

Commit 625cf58

Browse files
committed
Fix wrong windows offsets
1 parent 7089bdc commit 625cf58

5 files changed

Lines changed: 33 additions & 21 deletions

File tree

src/formatter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
bool shouldSkipWindowsFunction(const ClassInfo &classInfo, std::size_t vtableIndex, std::size_t functionIndex, const FunctionInfo &functionInfo)
44
{
5-
if (functionInfo.name.contains("::~"))
5+
if (functionInfo.name.starts_with('~'))
66
{
77
return functionIndex > 0 && functionInfo.name == classInfo.vtables.at(vtableIndex).functions.at(functionIndex - 1)->name;
88
}
@@ -41,6 +41,7 @@ std::vector<Out2> formatVTable(const ClassInfo &classInfo)
4141

4242
Out2 function;
4343
function.id = functionInfo->id;
44+
function.symbol = functionInfo->demangledSymbol;
4445
function.name = functionInfo->name;
4546
function.shortName = functionInfo->shortName;
4647
function.nameSpace = functionInfo->nameSpace;

src/formatter.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ bool shouldSkipWindowsFunction(const ClassInfo &classInfo, std::size_t vtableInd
1010
struct Out2
1111
{
1212
LargeNumber id;
13-
std::string name;
14-
std::string shortName;
15-
std::string nameSpace;
13+
std::string symbol; // CNEO_Player::CBaseEntity::EndTouch(CBaseEntity*)
14+
std::string name; // EndTouch(CBaseEntity*)
15+
std::string shortName; // EndTouch
16+
std::string nameSpace; // CBaseEntity
1617
bool isMulti;
1718
std::optional<int> linuxIndex;
1819
std::optional<int> windowsIndex;

src/parser.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -225,34 +225,43 @@ Out parse(ProgramInfo &programInfo)
225225
}
226226
else
227227
{
228-
auto functionDemangledName = demangleSymbol(functionSymbolName.c_str());
229-
auto functionName = std::string(functionDemangledName.get());
230-
auto functionShortName = functionName;
228+
auto demangledSymbolPtr = demangleSymbol(functionSymbolName.c_str());
229+
auto demangledSymbol = std::string(demangledSymbolPtr.get());
230+
std::string name = demangledSymbol;
231+
std::string shortName = demangledSymbol;
232+
std::string nameSpace = demangledSymbol;
231233

232-
auto functionNameSpace = functionShortName;
233-
234-
auto startOfName = functionShortName.rfind("::");
234+
auto startOfName = demangledSymbol.rfind("::");
235235
if (startOfName != std::string::npos)
236236
{
237-
functionShortName = functionShortName.substr(startOfName + 2);
238-
functionNameSpace = functionNameSpace.substr(0, startOfName);
237+
name = name.substr(startOfName + 2);
238+
}
239+
240+
auto startOfArgs = demangledSymbol.rfind('(');
241+
if (startOfArgs != std::string::npos)
242+
{
243+
shortName = shortName.substr(startOfName + 2, startOfArgs - startOfName - 2);
239244
}
240245

246+
247+
nameSpace = nameSpace.substr(0, startOfName);
248+
241249
FunctionInfo functionInfo;
242250

243251
functionInfo.id = functionAddress;
244-
functionInfo.name = functionName;
245252
functionInfo.symbol = functionSymbol;
246-
functionInfo.shortName = functionShortName;
247-
functionInfo.nameSpace = functionNameSpace;
253+
functionInfo.demangledSymbol = demangledSymbol;
254+
functionInfo.name = name;
255+
functionInfo.shortName = shortName;
256+
functionInfo.nameSpace = nameSpace;
248257
functionInfo.isThunk = false;
249258
functionInfo.isMulti = functionSymbols.size() > 1;
250259
functionInfo.classes.push_back(&classInfo);
251260

252261
if (functionSymbol.name.starts_with("_ZTh"))
253262
{
254263
functionInfo.isThunk = true;
255-
functionInfo.name = functionName.substr(21); // remove "non-virtual thunk to" substring
264+
functionInfo.name = demangledSymbol.substr(21); // remove "non-virtual thunk to" substring
256265
}
257266

258267
out.functions.push_back(functionInfo);

src/parser.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ struct ClassInfo;
1919
struct FunctionInfo
2020
{
2121
LargeNumber id;
22-
std::string name;
23-
std::string shortName;
24-
std::string nameSpace;
2522
SymbolInfo symbol;
23+
std::string demangledSymbol; // CNEO_Player::CBaseEntity::EndTouch(CBaseEntity*)
24+
std::string name; // EndTouch(CBaseEntity*)
25+
std::string shortName; // EndTouch
26+
std::string nameSpace; // CBaseEntity
2627
bool isThunk;
2728
bool isMulti;
2829
std::vector<ClassInfo*> classes;

src/writer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Offsets prepareOffsets(std::list<ClassInfo>& classes)
4141
continue;
4242
}
4343

44-
vtables[function.nameSpace].emplace(function.shortName, FunctionOffsets{function.linuxIndex.value(), function.windowsIndex.value()});
44+
vtables[function.nameSpace].emplace(function.name, FunctionOffsets{function.linuxIndex.value(), function.windowsIndex.value()});
4545
}
4646

4747
offsets.emplace(class_.name, vtables);
@@ -97,7 +97,7 @@ std::optional<int> getOffset(Offsets offsets, const std::string& symbol)
9797
auto functionIterator = classNamespace.find(functionName);
9898
if (functionIterator == classNamespace.end())
9999
{
100-
std::cerr << std::format("Error: failed to find function by its name \'{}\')", functionName) << std::endl;
100+
std::cerr << std::format("Error: failed to find function by its name \'{}\'", functionName) << std::endl;
101101
return std::nullopt;
102102
}
103103
const auto& function = functionIterator->second;

0 commit comments

Comments
 (0)