mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-13 12:14:16 +01:00
chore: make SigScanner public, have separate service TargetSigScanner that resolves via ISigScanner (closes #1426)
This commit is contained in:
parent
1d0b61e32b
commit
ebabb7bd04
26 changed files with 55 additions and 41 deletions
|
|
@ -167,7 +167,7 @@ internal sealed class Dalamud : IServiceType
|
|||
internal void ReplaceExceptionHandler()
|
||||
{
|
||||
var releaseSig = "40 55 53 56 48 8D AC 24 ?? ?? ?? ?? B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 2B E0 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 ?? ?? ?? ?? 48 83 3D ?? ?? ?? ?? ??";
|
||||
var releaseFilter = Service<SigScanner>.Get().ScanText(releaseSig);
|
||||
var releaseFilter = Service<TargetSigScanner>.Get().ScanText(releaseSig);
|
||||
Log.Debug($"SE debug filter at {releaseFilter.ToInt64():X}");
|
||||
|
||||
var oldFilter = NativeFunctions.SetUnhandledExceptionFilter(releaseFilter);
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ internal unsafe class AddonEventManager : IDisposable, IServiceType
|
|||
private AddonCursorType? cursorOverride;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private AddonEventManager(SigScanner sigScanner)
|
||||
private AddonEventManager(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new AddonEventManagerAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType
|
|||
private readonly List<AddonLifecycleEventListener> eventListeners = new();
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private AddonLifecycle(SigScanner sigScanner)
|
||||
private AddonLifecycle(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new AddonLifecycleAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -22,15 +22,6 @@ internal abstract class BaseAddressResolver
|
|||
/// </summary>
|
||||
protected bool IsResolved { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Setup the resolver, calling the appropriate method based on the process architecture,
|
||||
/// using the default SigScanner.
|
||||
///
|
||||
/// For plugins. Not intended to be called from Dalamud Service{T} constructors.
|
||||
/// </summary>
|
||||
[UsedImplicitly]
|
||||
public void Setup() => this.Setup(Service<SigScanner>.Get());
|
||||
|
||||
/// <summary>
|
||||
/// Setup the resolver, calling the appropriate method based on the process architecture.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ internal sealed class ClientState : IDisposable, IServiceType, IClientState
|
|||
private bool lastFramePvP;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private ClientState(SigScanner sigScanner, DalamudStartInfo startInfo, GameLifecycle lifecycle)
|
||||
private ClientState(TargetSigScanner sigScanner, DalamudStartInfo startInfo, GameLifecycle lifecycle)
|
||||
{
|
||||
this.lifecycle = lifecycle;
|
||||
this.address = new ClientStateAddressResolver();
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ internal class KeyState : IServiceType, IKeyState
|
|||
private VirtualKey[]? validVirtualKeyCache;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private KeyState(SigScanner sigScanner, ClientState clientState)
|
||||
private KeyState(TargetSigScanner sigScanner, ClientState clientState)
|
||||
{
|
||||
var moduleBaseAddress = sigScanner.Module.BaseAddress;
|
||||
var addressResolver = clientState.AddressResolver;
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ internal sealed class GameConfig : IServiceType, IGameConfig, IDisposable
|
|||
private Hook<ConfigChangeDelegate>? configChangeHook;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private unsafe GameConfig(Framework framework, SigScanner sigScanner)
|
||||
private unsafe GameConfig(Framework framework, TargetSigScanner sigScanner)
|
||||
{
|
||||
framework.RunOnTick(() =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ internal unsafe class DutyState : IDisposable, IServiceType, IDutyState
|
|||
private readonly ClientState.ClientState clientState = Service<ClientState.ClientState>.Get();
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private DutyState(SigScanner sigScanner)
|
||||
private DutyState(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new DutyStateAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ internal sealed class Framework : IDisposable, IServiceType, IFramework
|
|||
private Thread? frameworkUpdateThread;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private Framework(SigScanner sigScanner, GameLifecycle lifecycle)
|
||||
private Framework(TargetSigScanner sigScanner, GameLifecycle lifecycle)
|
||||
{
|
||||
this.lifecycle = lifecycle;
|
||||
this.hitchDetector = new HitchDetector("FrameworkUpdate", this.configuration.FrameworkUpdateHitch);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ internal sealed class ChatGui : IDisposable, IServiceType, IChatGui
|
|||
private IntPtr baseAddress = IntPtr.Zero;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private ChatGui(SigScanner sigScanner)
|
||||
private ChatGui(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new ChatGuiAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ internal sealed class FlyTextGui : IDisposable, IServiceType, IFlyTextGui
|
|||
private readonly Hook<CreateFlyTextDelegate> createFlyTextHook;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private FlyTextGui(SigScanner sigScanner)
|
||||
private FlyTextGui(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.Address = new FlyTextGuiAddressResolver();
|
||||
this.Address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ internal sealed unsafe class GameGui : IDisposable, IServiceType, IGameGui
|
|||
private OpenMapWithFlagDelegate? openMapWithFlag;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private GameGui(SigScanner sigScanner)
|
||||
private GameGui(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new GameGuiAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ internal sealed class PartyFinderGui : IDisposable, IServiceType, IPartyFinderGu
|
|||
/// </summary>
|
||||
/// <param name="sigScanner">Sig scanner to use.</param>
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private PartyFinderGui(SigScanner sigScanner)
|
||||
private PartyFinderGui(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new PartyFinderAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ internal sealed partial class ToastGui : IDisposable, IServiceType, IToastGui
|
|||
/// </summary>
|
||||
/// <param name="sigScanner">Sig scanner to use.</param>
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private ToastGui(SigScanner sigScanner)
|
||||
private ToastGui(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new ToastGuiAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ internal sealed partial class AntiDebug : IServiceType
|
|||
private IntPtr debugCheckAddress;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private AntiDebug(SigScanner sigScanner)
|
||||
private AntiDebug(TargetSigScanner sigScanner)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ internal sealed unsafe partial class DalamudAtkTweaks : IServiceType
|
|||
private readonly string locDalamudSettings;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private DalamudAtkTweaks(SigScanner sigScanner)
|
||||
private DalamudAtkTweaks(TargetSigScanner sigScanner)
|
||||
{
|
||||
var openSystemMenuAddress = sigScanner.ScanText("E8 ?? ?? ?? ?? 32 C0 4C 8B AC 24 ?? ?? ?? ?? 48 8B 8D ?? ?? ?? ??");
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ internal sealed class LibcFunction : IServiceType, ILibcFunction
|
|||
private readonly StdStringDeallocateDelegate stdStringDeallocate;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private LibcFunction(SigScanner sigScanner)
|
||||
private LibcFunction(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.address = new LibcFunctionAddressResolver();
|
||||
this.address.Setup(sigScanner);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ internal sealed class GameNetwork : IDisposable, IServiceType, IGameNetwork
|
|||
private IntPtr baseAddress;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private GameNetwork(SigScanner sigScanner)
|
||||
private GameNetwork(TargetSigScanner sigScanner)
|
||||
{
|
||||
this.hitchDetectorUp = new HitchDetector("GameNetworkUp", this.configuration.GameNetworkUpHitch);
|
||||
this.hitchDetectorDown = new HitchDetector("GameNetworkDown", this.configuration.GameNetworkDownHitch);
|
||||
|
|
|
|||
|
|
@ -20,12 +20,7 @@ namespace Dalamud.Game;
|
|||
/// <summary>
|
||||
/// A SigScanner facilitates searching for memory signatures in a given ProcessModule.
|
||||
/// </summary>
|
||||
[PluginInterface]
|
||||
[InterfaceVersion("1.0")]
|
||||
#pragma warning disable SA1015
|
||||
[ResolveVia<ISigScanner>]
|
||||
#pragma warning restore SA1015
|
||||
internal class SigScanner : IDisposable, IServiceType, ISigScanner
|
||||
public class SigScanner : IDisposable, ISigScanner
|
||||
{
|
||||
private readonly FileInfo? cacheFile;
|
||||
|
||||
|
|
|
|||
28
Dalamud/Game/TargetSigScanner.cs
Normal file
28
Dalamud/Game/TargetSigScanner.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
using Dalamud.IoC;
|
||||
using Dalamud.IoC.Internal;
|
||||
|
||||
namespace Dalamud.Game;
|
||||
|
||||
/// <summary>
|
||||
/// A SigScanner facilitates searching for memory signatures in a given ProcessModule.
|
||||
/// </summary>
|
||||
[PluginInterface]
|
||||
[InterfaceVersion("1.0")]
|
||||
#pragma warning disable SA1015
|
||||
[ResolveVia<ISigScanner>]
|
||||
#pragma warning restore SA1015
|
||||
internal class TargetSigScanner : SigScanner, IServiceType
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="TargetSigScanner"/> class.
|
||||
/// </summary>
|
||||
/// <param name="doCopy">Whether or not to copy the module upon initialization for search operations to use, as to not get disturbed by possible hooks.</param>
|
||||
/// <param name="cacheFile">File used to cached signatures.</param>
|
||||
public TargetSigScanner(bool doCopy = false, FileInfo? cacheFile = null)
|
||||
: base(Process.GetCurrentProcess().MainModule!, doCopy, cacheFile)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -33,7 +33,7 @@ internal class GameInteropProviderPluginScoped : IGameInteropProvider, IServiceT
|
|||
/// </summary>
|
||||
/// <param name="plugin">Plugin this instance belongs to.</param>
|
||||
/// <param name="scanner">SigScanner instance for target module.</param>
|
||||
public GameInteropProviderPluginScoped(LocalPlugin plugin, SigScanner scanner)
|
||||
public GameInteropProviderPluginScoped(LocalPlugin plugin, TargetSigScanner scanner)
|
||||
{
|
||||
this.plugin = plugin;
|
||||
this.scanner = scanner;
|
||||
|
|
|
|||
|
|
@ -1055,7 +1055,7 @@ internal class InterfaceManager : IDisposable, IServiceType
|
|||
}
|
||||
|
||||
[ServiceManager.CallWhenServicesReady]
|
||||
private void ContinueConstruction(SigScanner sigScanner, Framework framework)
|
||||
private void ContinueConstruction(TargetSigScanner sigScanner, Framework framework)
|
||||
{
|
||||
this.address.Setup(sigScanner);
|
||||
framework.RunOnFrameworkThread(() =>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ internal class AddressesWidget : IDataWindowWidget
|
|||
{
|
||||
try
|
||||
{
|
||||
var sigScanner = Service<SigScanner>.Get();
|
||||
var sigScanner = Service<TargetSigScanner>.Get();
|
||||
this.sigResult = sigScanner.ScanText(this.inputSig);
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
|
|
|
|||
|
|
@ -623,7 +623,7 @@ internal partial class PluginManager : IDisposable, IServiceType
|
|||
Log.Error(e, "Failed to load at least one plugin");
|
||||
}
|
||||
|
||||
var sigScanner = await Service<SigScanner>.GetAsync().ConfigureAwait(false);
|
||||
var sigScanner = await Service<TargetSigScanner>.GetAsync().ConfigureAwait(false);
|
||||
this.PluginsReady = true;
|
||||
this.NotifyinstalledPluginsListChanged();
|
||||
sigScanner.Save();
|
||||
|
|
|
|||
|
|
@ -105,15 +105,15 @@ internal static class ServiceManager
|
|||
Service<ServiceContainer>.Provide(new ServiceContainer());
|
||||
LoadedServices.Add(typeof(ServiceContainer));
|
||||
|
||||
Service<SigScanner>.Provide(
|
||||
new SigScanner(
|
||||
Service<TargetSigScanner>.Provide(
|
||||
new TargetSigScanner(
|
||||
true, new FileInfo(Path.Combine(cacheDir.FullName, $"{startInfo.GameVersion}.json"))));
|
||||
LoadedServices.Add(typeof(SigScanner));
|
||||
LoadedServices.Add(typeof(TargetSigScanner));
|
||||
}
|
||||
|
||||
using (Timings.Start("CS Resolver Init"))
|
||||
{
|
||||
FFXIVClientStructs.Interop.Resolver.GetInstance.SetupSearchSpace(Service<SigScanner>.Get().SearchBase, new FileInfo(Path.Combine(cacheDir.FullName, $"{startInfo.GameVersion}_cs.json")));
|
||||
FFXIVClientStructs.Interop.Resolver.GetInstance.SetupSearchSpace(Service<TargetSigScanner>.Get().SearchBase, new FileInfo(Path.Combine(cacheDir.FullName, $"{startInfo.GameVersion}_cs.json")));
|
||||
FFXIVClientStructs.Interop.Resolver.GetInstance.Resolve();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ internal static class SignatureHelper
|
|||
/// <returns>Collection of created IDalamudHooks.</returns>
|
||||
internal static IEnumerable<IDalamudHook> Initialize(object self, bool log = true)
|
||||
{
|
||||
var scanner = Service<SigScanner>.Get();
|
||||
var scanner = Service<TargetSigScanner>.Get();
|
||||
var selfType = self.GetType();
|
||||
var fields = selfType.GetFields(Flags).Select(field => (IFieldOrPropertyInfo)new FieldInfoWrapper(field))
|
||||
.Concat(selfType.GetProperties(Flags).Select(prop => new PropertyInfoWrapper(prop)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue