internal static Assembly Scan(string requested_name) { LemonEnumerator <SearchDirectoryInfo> enumerator = new LemonEnumerator <SearchDirectoryInfo>(SearchDirectoryList); while (enumerator.MoveNext()) { string folderpath = enumerator.Current.Path; string filepath = Directory.GetFiles(folderpath).Where(x => !string.IsNullOrEmpty(x) && Path.GetExtension(x).ToLowerInvariant().Equals(".dll") && Path.GetFileName(x).Equals($"{requested_name}.dll") ).FirstOrDefault(); if (string.IsNullOrEmpty(filepath)) { continue; } IntPtr assemblyptr = MonoLibrary.Instance.mono_assembly_open_full(Marshal.StringToHGlobalAnsi(filepath), IntPtr.Zero, false); if (assemblyptr == IntPtr.Zero) { continue; } IntPtr assemblyReflectionPtr = MonoLibrary.Instance.mono_assembly_get_object(MonoLibrary.GetRootDomainPtr(), assemblyptr); return(MonoLibrary.CastManagedAssemblyPtr(assemblyReflectionPtr)); } return(null); }
private static int Initialize() { AppDomain curDomain = AppDomain.CurrentDomain; Fixes.UnhandledException.Install(curDomain); MelonUtils.Setup(curDomain); Assertions.LemonAssertMapping.Setup(); if (!MonoLibrary.Setup() || !MonoResolveManager.Setup()) { return(1); } HarmonyInstance = new HarmonyLib.Harmony(BuildInfo.Name); Fixes.ForcedCultureInfo.Install(); Fixes.InstancePatchFix.Install(); Fixes.ProcessFix.Install(); PatchShield.Install(); MelonPreferences.Load(); MelonLaunchOptions.Load(); bHaptics.Load(); MelonCompatibilityLayer.Setup(); MelonCompatibilityLayer.SetupModules(MelonCompatibilityLayer.SetupType.OnPreInitialization); MelonHandler.LoadPlugins(); MelonHandler.OnPreInitialization(); return(0); }
private unsafe static bool PatchMonoExport() { IntPtr monolib = MonoLibrary.GetLibPtr(); if (monolib == IntPtr.Zero) { return(false); } NativeLibrary monoLibrary = new NativeLibrary(monolib); IntPtr export = monoLibrary.GetExport("mono_unity_get_unitytls_interface"); if (export == IntPtr.Zero) { Logger.Error("Failed to find mono_unity_get_unitytls_interface! This should never happen..."); return(false); } Logger.Msg("Patching mono_unity_get_unitytls_interface..."); MethodInfo patch = typeof(Il2CppUnityTls_Module).GetMethod("GetUnityTlsInterface", BindingFlags.NonPublic | BindingFlags.Static); IntPtr patchptr = patch.MethodHandle.GetFunctionPointer(); MelonUtils.NativeHookAttach((IntPtr)(&export), patchptr); return(true); }
private unsafe static bool PatchExports() { IntPtr monolib = MonoLibrary.GetLibPtr(); if (monolib == IntPtr.Zero) { Logger.Warning("Unable to find Mono Library Pointer!"); return(false); } NativeLibrary monoLibrary = new NativeLibrary(monolib); IntPtr mono_export = monoLibrary.GetExport("mono_unity_get_unitytls_interface"); if (mono_export == IntPtr.Zero) { Logger.Warning("Unable to find Mono's mono_unity_get_unitytls_interface Export!"); return(false); } NativeLibrary il2cppLibrary = NativeLibrary.Load(Path.Combine(MelonUtils.GameDirectory, "GameAssembly.dll")); IntPtr il2cpp_export = il2cppLibrary.GetExport("il2cpp_unity_install_unitytls_interface"); if (il2cpp_export == IntPtr.Zero) { Logger.Warning("Unable to find Il2Cpp's il2cpp_unity_install_unitytls_interface Export!"); return(false); } Logger.Msg("Patching mono_unity_get_unitytls_interface..."); MelonUtils.NativeHookAttach((IntPtr)(&mono_export), typeof(Il2CppUnityTls_Module).GetMethod("GetUnityTlsInterface", BindingFlags.NonPublic | BindingFlags.Static).MethodHandle.GetFunctionPointer()); Logger.Msg("Patching il2cpp_unity_install_unitytls_interface..."); MelonUtils.NativeHookAttach((IntPtr)(&il2cpp_export), typeof(Il2CppUnityTls_Module).GetMethod("SetUnityTlsInterface", BindingFlags.NonPublic | BindingFlags.Static).MethodHandle.GetFunctionPointer()); OriginalSetUnityTlsInterface = (dSetUnityTlsInterface)Marshal.GetDelegateForFunctionPointer(il2cpp_export, typeof(dSetUnityTlsInterface)); return(true); }