From 1bc167f133d974d81b27301e55efabde9efbde04 Mon Sep 17 00:00:00 2001 From: Raymond Date: Sun, 10 Oct 2021 21:28:12 -0400 Subject: [PATCH] Explicitly use the monomod assembly name Not needed, but helps differentiate between a Reloaded hook a little. Also: utilize Dispose. --- Dalamud/Dalamud.cs | 23 ++++++++++++----------- Dalamud/Plugin/Internal/PluginManager.cs | 12 ++++++++---- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Dalamud/Dalamud.cs b/Dalamud/Dalamud.cs index c27c04626..b2d4c1108 100644 --- a/Dalamud/Dalamud.cs +++ b/Dalamud/Dalamud.cs @@ -1,6 +1,5 @@ using System; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; @@ -24,7 +23,6 @@ using Dalamud.Logging.Internal; using Dalamud.Plugin.Internal; using Dalamud.Plugin.Ipc.Internal; using Dalamud.Support; -using MonoMod.RuntimeDetour; using Serilog; using Serilog.Core; using Serilog.Events; @@ -46,6 +44,7 @@ namespace Dalamud private readonly ManualResetEvent unloadSignal; private readonly ManualResetEvent finishUnloadSignal; + private MonoMod.RuntimeDetour.Hook processMonoHook; private bool hasDisposedPlugins = false; #endregion @@ -358,6 +357,8 @@ namespace Dalamud SerilogEventSink.Instance.LogLine -= SerilogOnLogLine; + this.processMonoHook?.Dispose(); + Log.Debug("Dalamud::Dispose() OK!"); } catch (Exception ex) @@ -379,6 +380,14 @@ namespace Dalamud Log.Debug("Reset ExceptionFilter, old: {0}", oldFilter); } + private static void SerilogOnLogLine(object? sender, (string Line, LogEventLevel Level, DateTimeOffset TimeStamp, Exception? Exception) e) + { + if (e.Exception == null) + return; + + Troubleshooting.LogException(e.Exception, e.Line); + } + /// /// Patch method for the class Process.Handle. This patch facilitates fixing Reloaded so that it /// uses pseudo-handles to access memory, to prevent permission errors. @@ -400,21 +409,13 @@ namespace Dalamud return result; } - private static void SerilogOnLogLine(object? sender, (string Line, LogEventLevel Level, DateTimeOffset TimeStamp, Exception? Exception) e) - { - if (e.Exception == null) - return; - - Troubleshooting.LogException(e.Exception, e.Line); - } - private void ApplyProcessPatch() { var targetType = typeof(Process); var handleTarget = targetType.GetProperty(nameof(Process.Handle)).GetGetMethod(); var handlePatch = typeof(Dalamud).GetMethod(nameof(Dalamud.ProcessHandlePatch), BindingFlags.NonPublic | BindingFlags.Static); - _ = new Hook(handleTarget, handlePatch); + this.processMonoHook = new MonoMod.RuntimeDetour.Hook(handleTarget, handlePatch); } } } diff --git a/Dalamud/Plugin/Internal/PluginManager.cs b/Dalamud/Plugin/Internal/PluginManager.cs index 579e5a2fd..c9ede6123 100644 --- a/Dalamud/Plugin/Internal/PluginManager.cs +++ b/Dalamud/Plugin/Internal/PluginManager.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.IO; using System.IO.Compression; using System.Linq; @@ -20,7 +19,6 @@ using Dalamud.Logging.Internal; using Dalamud.Plugin.Internal.Exceptions; using Dalamud.Plugin.Internal.Types; using Dalamud.Utility; -using MonoMod.RuntimeDetour; using Newtonsoft.Json; namespace Dalamud.Plugin.Internal @@ -137,6 +135,9 @@ namespace Dalamud.Plugin.Internal Log.Error(ex, $"Error disposing {plugin.Name}"); } } + + this.assemblyLocationMonoHook?.Dispose(); + this.assemblyCodeBaseMonoHook?.Dispose(); } /// @@ -1063,6 +1064,9 @@ namespace Dalamud.Plugin.Internal /// internal partial class PluginManager { + private MonoMod.RuntimeDetour.Hook assemblyLocationMonoHook; + private MonoMod.RuntimeDetour.Hook assemblyCodeBaseMonoHook; + /// /// A mapping of plugin assembly name to patch data. Used to fill in missing data due to loading /// plugins via byte[]. @@ -1150,12 +1154,12 @@ namespace Dalamud.Plugin.Internal var locationTarget = targetType.GetProperty(nameof(Assembly.Location)).GetGetMethod(); var locationPatch = typeof(PluginManager).GetMethod(nameof(PluginManager.AssemblyLocationPatch), BindingFlags.NonPublic | BindingFlags.Static); - _ = new Hook(locationTarget, locationPatch); + this.assemblyLocationMonoHook = new MonoMod.RuntimeDetour.Hook(locationTarget, locationPatch); #pragma warning disable SYSLIB0012 // Type or member is obsolete var codebaseTarget = targetType.GetProperty(nameof(Assembly.CodeBase)).GetGetMethod(); var codebasePatch = typeof(PluginManager).GetMethod(nameof(PluginManager.AssemblyCodeBasePatch), BindingFlags.NonPublic | BindingFlags.Static); - _ = new Hook(codebaseTarget, codebasePatch); + this.assemblyCodeBaseMonoHook = new MonoMod.RuntimeDetour.Hook(codebaseTarget, codebasePatch); #pragma warning restore SYSLIB0012 // Type or member is obsolete }