From eb55e5b5277a6cdc41e9744ef2d2719d301b3002 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Tue, 4 Aug 2020 05:14:19 +0200 Subject: [PATCH] AppModel/C++/JSON/Script: Don't output generic method definitions (no compiled code) --- Il2CppInspector.Common/Model/AppMethod.cs | 10 ++++++++-- Il2CppInspector.Common/Outputs/CppScaffolding.cs | 2 +- Il2CppInspector.Common/Outputs/JSONMetadata.cs | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Il2CppInspector.Common/Model/AppMethod.cs b/Il2CppInspector.Common/Model/AppMethod.cs index 7dc5e6a..5570236 100644 --- a/Il2CppInspector.Common/Model/AppMethod.cs +++ b/Il2CppInspector.Common/Model/AppMethod.cs @@ -23,10 +23,16 @@ namespace Il2CppInspector.Model public MethodBase Method { get; internal set; } // The VA of the MethodInfo* (VA of the pointer to the MethodInfo) object which defines this method + // Methods not referenced by the binary will be 0xffffffff_ffffffff public ulong MethodInfoPtrAddress { get; internal set; } - // The VA of the method code itself, or 0 if unknown/not compiled - public ulong MethodCodeAddress => Method.VirtualAddress?.Start ?? 0; + // The VA of the method code itself + // Generic method definitions do not have a code address but may have a reference above + public ulong MethodCodeAddress => Method.VirtualAddress?.Start ?? 0xffffffff_ffffffff; + + // Helpers + public bool HasMethodInfo => MethodInfoPtrAddress != 0xffffffff_ffffffff; + public bool HasCompiledCode => Method.VirtualAddress.HasValue && Method.VirtualAddress.Value.Start != 0; public AppMethod(MethodBase method, CppFnPtrType cppMethod, ulong methodInfoPtr = 0xffffffff_ffffffff) { Method = method; diff --git a/Il2CppInspector.Common/Outputs/CppScaffolding.cs b/Il2CppInspector.Common/Outputs/CppScaffolding.cs index 837d6c9..b02eb66 100644 --- a/Il2CppInspector.Common/Outputs/CppScaffolding.cs +++ b/Il2CppInspector.Common/Outputs/CppScaffolding.cs @@ -163,7 +163,7 @@ typedef size_t uintptr_t; writeCode("using namespace app;"); writeLine(""); - foreach (var method in model.Methods.Values) { + foreach (var method in model.Methods.Values.Where(m => m.HasCompiledCode)) { var arguments = string.Join(", ", method.CppFnPtrType.Arguments.Select(a => a.Type.Name + " " + (a.Name == "this" ? "__this" : a.Name))); writeCode($"DO_APP_FUNC(0x{method.MethodCodeAddress - model.Package.BinaryImage.ImageBase:X8}, {method.CppFnPtrType.ReturnType.Name}, " + $"{method.CppFnPtrType.Name}, ({arguments}));"); diff --git a/Il2CppInspector.Common/Outputs/JSONMetadata.cs b/Il2CppInspector.Common/Outputs/JSONMetadata.cs index ddd9344..eb4a959 100644 --- a/Il2CppInspector.Common/Outputs/JSONMetadata.cs +++ b/Il2CppInspector.Common/Outputs/JSONMetadata.cs @@ -64,7 +64,7 @@ namespace Il2CppInspector.Outputs } private void writeMethods(IEnumerable methods) { - foreach (var method in methods) { + foreach (var method in methods.Where(m => m.HasCompiledCode)) { writeObject(() => { writeTypedFunctionName(method.MethodCodeAddress, method.CppFnPtrType.ToSignatureString(), method.CppFnPtrType.Name); writeDotNetSignature(method.Method); @@ -123,7 +123,7 @@ namespace Il2CppInspector.Outputs // Metedata usage methods writeArray("methodInfoPointers", () => { - foreach (var method in model.Methods.Values.Where(m => m.MethodInfoPtrAddress != 0xffffffff_ffffffff)) { + foreach (var method in model.Methods.Values.Where(m => m.HasMethodInfo)) { writeObject(() => { writeName(method.MethodInfoPtrAddress, $"{method.CppFnPtrType.Name}__MethodInfo"); writeDotNetSignature(method.Method);