コード例 #1
0
ファイル: ConfInitBridge.cs プロジェクト: hnllc1/ModBahuang
        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}");
            }
        }
コード例 #2
0
ファイル: ConfInitBridge.cs プロジェクト: hnllc1/ModBahuang
        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);
            }
        }