IL2CPP: Load all Il2CppCodeGenModule method pointers into memory at init time
This commit is contained in:
@@ -23,6 +23,9 @@ namespace Il2CppInspector
|
||||
// Only for <=v24.1
|
||||
public ulong[] GlobalMethodPointers { get; set; }
|
||||
|
||||
// Only for >=v24.2
|
||||
public Dictionary<Il2CppCodeGenModule, ulong[]> ModuleMethodPointers { get; set; } = new Dictionary<Il2CppCodeGenModule, ulong[]>();
|
||||
|
||||
// NOTE: In versions <21 and earlier releases of v21, use FieldOffsets:
|
||||
// global field index => field offset
|
||||
// In versions >=22 and later releases of v21, use FieldOffsetPointers:
|
||||
@@ -153,6 +156,9 @@ namespace Il2CppInspector
|
||||
foreach (var module in modules) {
|
||||
var name = image.ReadMappedNullTerminatedString(module.moduleName);
|
||||
Modules.Add(name, module);
|
||||
|
||||
// Read method pointers
|
||||
ModuleMethodPointers.Add(module, image.ReadMappedArray<ulong>(module.methodPointers, (int) module.methodPointerCount));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -170,12 +170,10 @@ namespace Il2CppInspector
|
||||
// In the event of an exception, the method pointer is not set in the file
|
||||
// This probably means it has been optimized away by the compiler, or is an unused generic method
|
||||
try {
|
||||
BinaryImage.Position = BinaryImage.MapVATR(module.methodPointers + (ulong)((method - 1) * (BinaryImage.Bits / 8)));
|
||||
|
||||
// Remove ARM Thumb marker LSB if necessary
|
||||
return (ulong) BinaryImage.ReadWord() & 0xffff_ffff_ffff_fffe;
|
||||
return Binary.ModuleMethodPointers[module][method - 1] & 0xffff_ffff_ffff_fffe;
|
||||
}
|
||||
catch (Exception) { }
|
||||
catch (IndexOutOfRangeException) { }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user