From 2493f9f1605c3d97997c0ab1c9f32bc86a00ed38 Mon Sep 17 00:00:00 2001 From: Warpten Date: Tue, 24 Nov 2020 13:59:35 +0100 Subject: [PATCH] C++: Add MethodInfo to scaffolding output (#84) --- Il2CppInspector.Common/Outputs/CppScaffolding.cs | 15 +++++++++++---- Il2CppInspector.Common/Properties/Resources.resx | 6 ++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Il2CppInspector.Common/Outputs/CppScaffolding.cs b/Il2CppInspector.Common/Outputs/CppScaffolding.cs index 5270977..d2e0e3c 100644 --- a/Il2CppInspector.Common/Outputs/CppScaffolding.cs +++ b/Il2CppInspector.Common/Outputs/CppScaffolding.cs @@ -173,10 +173,17 @@ typedef size_t uintptr_t; writeCode("using namespace app;"); writeLine(""); - 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}));"); + foreach (var method in model.Methods.Values) { + if (method.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}));"); + } + + if (method.HasMethodInfo) { + writeCode($"DO_APP_FUNC_METHODINFO(0x{method.MethodInfoPtrAddress - model.Package.BinaryImage.ImageBase:X8}, {method.CppFnPtrType.Name}__MethodInfo);"); + } } writer.Close(); diff --git a/Il2CppInspector.Common/Properties/Resources.resx b/Il2CppInspector.Common/Properties/Resources.resx index 590f06b..e41e37c 100644 --- a/Il2CppInspector.Common/Properties/Resources.resx +++ b/Il2CppInspector.Common/Properties/Resources.resx @@ -1187,10 +1187,12 @@ EndGlobal // Application-specific functions #define DO_APP_FUNC(a, r, n, p) extern r (*n) p +#define DO_APP_FUNC_METHODINFO(a, n) extern struct MethodInfo * n namespace app { #include "il2cpp-functions.h" } #undef DO_APP_FUNC +#undef DO_APP_FUNC_METHODINFO // TypeInfo pointers #define DO_TYPEDEF(a, n) extern n ## __Class** n ## __TypeInfo @@ -1216,10 +1218,12 @@ namespace app { // Application-specific functions #define DO_APP_FUNC(a, r, n, p) r (*n) p +#define DO_APP_FUNC_METHODINFO(a, n) struct MethodInfo * n namespace app { #include "il2cpp-functions.h" } #undef DO_APP_FUNC +#undef DO_APP_FUNC_METHODINFO // TypeInfo pointers #define DO_TYPEDEF(a, n) n ## __Class** n ## __TypeInfo @@ -1243,8 +1247,10 @@ void init_il2cpp() // Define function addresses #define DO_APP_FUNC(a, r, n, p) n = (r (*) p)(baseAddress + a) + #define DO_APP_FUNC_METHODINFO(a, n) n = (struct MethodInfo *)(baseAddress + a) #include "il2cpp-functions.h" #undef DO_APP_FUNC + #undef DO_APP_FUNC_METHODINFO // Define TypeInfo variables #define DO_TYPEDEF(a, n) n ## __TypeInfo = (n ## __Class**) (baseAddress + a);