private static void Bridge(IntPtr @this, IntPtr handle) { var record = BRIDGE_INDEX[handle]; Logger.Debug(() => $"{record}"); try { var conf = UnhollowerSupport.Il2CppObjectPtrToIl2CppObject <ConfBase>(@this) ?? throw new Exception("Unable to convert ptr to object"); if (Env.IsGameUpdated) { BridgeHelper.DumpConf(conf, record); } else { BridgeHelper.UpdateConf(conf, record); } } catch (Exception e) { var info = Trampoline.GetInfo(handle); MelonLogger.Warning($"Exception occurs in bridge\n{e}\n" + $"this: 0x{@this.ToInt64():X}\n" + $"trampoline info: {info}\n" + $"record: {record}"); } }
public static void Erect(Record record) { var trampoline = Trampoline.Generate(record.FinalInitVa); unsafe { var p = (IntPtr *)Marshal.AllocHGlobal(IntPtr.Size); * p = record.FinalInitVa; MelonUtils.NativeHookAttach((IntPtr)p, trampoline.Address); var handle = trampoline.Finish(*p, Bridge); BRIDGE_INDEX.Add(handle, record); Marshal.FreeHGlobal((IntPtr)p); } }