Skip to content

Commit

Permalink
Added: AddArbitraryScan API
Browse files Browse the repository at this point in the history
  • Loading branch information
Sewer56 committed Jun 19, 2022
1 parent b46f253 commit df8c54c
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using Reloaded.Memory.Sigscan.Definitions;
using Reloaded.Memory.Sigscan.Definitions.Structs;

namespace Reloaded.Memory.SigScan.ReloadedII.Interfaces;
Expand All @@ -22,4 +23,13 @@ public interface IStartupScanner
/// <param name="pattern">The pattern to signature scan for.</param>
/// <param name="action">The function to execute with the result of the function.</param>
public void AddMainModuleScan(string pattern, Action<PatternScanResult> action);

/// <summary>
/// Adds a pattern to be scanned in parallel with other arbitrary patterns.
/// Note: This pattern is not scanned in parallel in a separate queue from main module scans.
/// </summary>
/// <param name="scanner">Scanner preconfigured to scan a specific memory region.</param>
/// <param name="pattern">The pattern to scan using the scanner.</param>
/// <param name="action">The function to execute with the result of the function.</param>
public void AddArbitraryScan(IScanner scanner, string pattern, Action<PatternScanResult> action);
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
Reloaded.Memory.SigScan.ReloadedII.Interfaces.IStartupScanner
Reloaded.Memory.SigScan.ReloadedII.Interfaces.IStartupScanner.AddArbitraryScan(Reloaded.Memory.Sigscan.Definitions.IScanner scanner, string pattern, System.Action<Reloaded.Memory.Sigscan.Definitions.Structs.PatternScanResult> action) -> void
Reloaded.Memory.SigScan.ReloadedII.Interfaces.IStartupScanner.AddMainModuleScan(string pattern, System.Action<Reloaded.Memory.Sigscan.Definitions.Structs.PatternScanResult> action) -> void
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>

<PackageId>Reloaded.Memory.SigScan.ReloadedII.Interfaces</PackageId>
<Version>1.0.0</Version>
<Version>1.1.0</Version>
<Authors>Sewer56</Authors>
<Description>Interface definitions for Reloaded.Memory.Sigscan Shared Library.</Description>
<Copyright>LGPL V3</Copyright>
Expand All @@ -17,6 +17,7 @@
<PackageIconUrl>https://avatars1.githubusercontent.com/u/45473408</PackageIconUrl>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageLicenseExpression>LGPL-3.0-or-later</PackageLicenseExpression>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

<ItemGroup>
Expand Down
4 changes: 4 additions & 0 deletions External/Reloaded.Memory.SigScan.ReloadedII.Test/Program.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Reloaded.Mod.Interfaces;
using Reloaded.Mod.Interfaces.Internal;
using System;
using System.Diagnostics;
using Reloaded.Memory.Sigscan.Definitions;
using Reloaded.Memory.Sigscan.Definitions.Structs;
using Reloaded.Memory.SigScan.ReloadedII.Interfaces;

Expand Down Expand Up @@ -31,7 +33,9 @@ public void StartEx(IModLoaderV1 loaderApi, IModConfigV1 modConfig)

// Get Controller
_modLoader.GetController<IStartupScanner>().TryGetTarget(out var startupScanner);
_modLoader.GetController<IScannerFactory>().TryGetTarget(out var scannerFactory);
startupScanner.AddMainModuleScan("C3", OnMainModuleScan);
startupScanner.AddArbitraryScan(scannerFactory.CreateScanner(Process.GetCurrentProcess()), "C3", OnMainModuleScan);
}

private void OnMainModuleScan(PatternScanResult obj)
Expand Down
2 changes: 1 addition & 1 deletion External/Reloaded.Memory.SigScan.ReloadedII/ModConfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"ModId": "Reloaded.Memory.SigScan.ReloadedII",
"ModName": "Library: Reloaded.Memory.Sigscan for Reloaded II",
"ModAuthor": "Sewer56",
"ModVersion": "1.0.0",
"ModVersion": "1.1.0",
"ModDescription": "Shared implementation of Reloaded.Memory.Sigscan",
"ModDll": "Reloaded.Memory.SigScan.ReloadedII.dll",
"ModIcon": "Preview.png",
Expand Down
57 changes: 49 additions & 8 deletions External/Reloaded.Memory.SigScan.ReloadedII/StartupScanner.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Reloaded.Memory.Sigscan;
using Reloaded.Memory.Sigscan.Definitions;
using Reloaded.Memory.Sigscan.Definitions.Structs;
using Reloaded.Memory.SigScan.ReloadedII.Interfaces;
using Reloaded.Mod.Interfaces;
Expand All @@ -14,8 +17,9 @@ namespace Reloaded.Memory.SigScan.ReloadedII;
public class StartupScanner : IStartupScanner
{
private ILogger _logger;
private List<string> _startupPatterns = new();
private List<Action<PatternScanResult>> _patternActions = new();
private List<string> _mainModulePatterns = new();
private List<Action<PatternScanResult>> _mainModuleActions = new();
private List<ArbitraryScanActionTuple> _arbitraryScanActions = new();

public StartupScanner(IModLoader modLoader, ILogger logger)
{
Expand All @@ -25,24 +29,61 @@ public StartupScanner(IModLoader modLoader, ILogger logger)

/// <summary/>
private void OnLoaderInitialized()
{
RunMainModuleScans();
RunArbitraryScans();
}

private void RunArbitraryScans()
{
if (_arbitraryScanActions.Count <= 0)
return;

var results = new PatternScanResult[_arbitraryScanActions.Count];
Parallel.ForEach(Partitioner.Create(_arbitraryScanActions, true), (item, _, index) =>
{
results[index] = item.scanForResult();
});

for (int x = 0; x < results.Length; x++)
_arbitraryScanActions[x].callback(results[x]);
}

private void RunMainModuleScans()
{
// Scan registered patterns.
var curProcScanner = new Scanner(Process.GetCurrentProcess());

// Find all the patterns, and run the results.
var results = curProcScanner.FindPatternsCached(_startupPatterns);
var results = curProcScanner.FindPatternsCached(_mainModulePatterns);
for (int x = 0; x < results.Length; x++)
_patternActions[x](results[x]);
_mainModuleActions[x](results[x]);

// Cleanup
_startupPatterns.Clear();
_patternActions.Clear();
_mainModulePatterns.Clear();
_mainModuleActions.Clear();
}

/// <inheritdoc />
public void AddMainModuleScan(string pattern, Action<PatternScanResult> action)
{
_startupPatterns.Add(pattern);
_patternActions.Add(action);
_mainModulePatterns.Add(pattern);
_mainModuleActions.Add(action);
}

/// <inheritdoc />
public void AddArbitraryScan(IScanner scanner, string pattern, Action<PatternScanResult> action)
{
_arbitraryScanActions.Add(new ArbitraryScanActionTuple()
{
scanForResult = () => scanner.FindPattern(pattern),
callback = action
});
}

struct ArbitraryScanActionTuple
{
internal Func<PatternScanResult> scanForResult;
internal Action<PatternScanResult> callback;
}
}

0 comments on commit df8c54c

Please sign in to comment.