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
|
// Only for <=v24.1
|
||||||
public ulong[] GlobalMethodPointers { get; set; }
|
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:
|
// NOTE: In versions <21 and earlier releases of v21, use FieldOffsets:
|
||||||
// global field index => field offset
|
// global field index => field offset
|
||||||
// In versions >=22 and later releases of v21, use FieldOffsetPointers:
|
// In versions >=22 and later releases of v21, use FieldOffsetPointers:
|
||||||
@@ -153,6 +156,9 @@ namespace Il2CppInspector
|
|||||||
foreach (var module in modules) {
|
foreach (var module in modules) {
|
||||||
var name = image.ReadMappedNullTerminatedString(module.moduleName);
|
var name = image.ReadMappedNullTerminatedString(module.moduleName);
|
||||||
Modules.Add(name, module);
|
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
|
// 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
|
// This probably means it has been optimized away by the compiler, or is an unused generic method
|
||||||
try {
|
try {
|
||||||
BinaryImage.Position = BinaryImage.MapVATR(module.methodPointers + (ulong)((method - 1) * (BinaryImage.Bits / 8)));
|
|
||||||
|
|
||||||
// Remove ARM Thumb marker LSB if necessary
|
// 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user