winmr-api/Services/Scanners/ScanProvider.cs

79 lines
2.5 KiB
C#
Raw Normal View History

2025-07-04 00:04:51 +03:00
/* This software is licensed by the MIT License, see LICENSE file */
/* Copyright © 2024-2025 Gregory Lirent */
2025-07-03 15:22:40 +03:00
using WebmrAPI.Models;
namespace WebmrAPI.Services.Scanners
{
public class ScanProvider : IScanProvider
{
private ProcessMonitor _monitor;
public bool ProcessReadAccess { get => _monitor.Config.AllowProcessReadAccess; }
public ILogger Logger { get => _monitor.Logger; }
public int GetTimeout(ScanTarget target)
{
switch (target)
{
2025-07-03 20:01:19 +03:00
case ScanTarget.MemoryRegions: return _monitor.Config.MemoryRegionScanTimeout;
case ScanTarget.Modules: return _monitor.Config.ModuleScanTimeout;
case ScanTarget.Threads: return _monitor.Config.ThreadScanTimeout;
2025-07-03 15:22:40 +03:00
default: return _monitor.Config.ProcessScanInterval;
}
}
public IScannable CreateScanTask()
{
return new ProcessScanner(this, _monitor.Processes);
}
2025-07-03 20:01:19 +03:00
async public Task<IScannable> CreateFullScanTaskAsync(ScanTarget target = ScanTarget.ProcessDetails)
2025-07-03 15:22:40 +03:00
{
2025-07-03 20:01:19 +03:00
if (target.HasFlag(ScanTarget.Processes))
{
await CreateScanTask().ScanAsync();
target &= ~ScanTarget.Processes;
}
2025-07-03 15:22:40 +03:00
2025-07-03 20:01:19 +03:00
var scanner = new ScanQueue();
var data = _monitor.Processes.Values;
2025-07-03 15:22:40 +03:00
if (data != null)
{
foreach (var process in data)
{
scanner.Add(CreateScanTask(process, target));
}
}
return scanner;
}
2025-07-03 20:01:19 +03:00
public IScannable CreateScanTask(ProcessInfo process, ScanTarget target = ScanTarget.ProcessDetails)
2025-07-03 15:22:40 +03:00
{
var scanner = new ScanQueue();
2025-07-03 20:01:19 +03:00
if (target.HasFlag(ScanTarget.MemoryRegions))
2025-07-03 15:22:40 +03:00
{
scanner.Add(new MemoryRegionScanner(this, process.MemoryRegionsContainer, process.PID));
}
2025-07-03 20:01:19 +03:00
if (target.HasFlag(ScanTarget.Modules))
2025-07-03 15:22:40 +03:00
{
scanner.Add(new ModuleScanner(this, process.ModulesContainer, process.PID));
}
2025-07-03 20:01:19 +03:00
if (target.HasFlag(ScanTarget.Threads))
2025-07-03 15:22:40 +03:00
{
scanner.Add(new ThreadScanner(this, process.ThreadsContainer, process.PID));
}
return scanner;
}
public ScanProvider(ProcessMonitor monitoringService)
{
_monitor = monitoringService;
}
}
}