winmr-api/Services/Scanners/ScanProvider.cs
2025-07-03 20:01:19 +03:00

78 lines
2.4 KiB
C#

// File: Services/Scanners/ScanProvider.cs
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)
{
case ScanTarget.MemoryRegions: return _monitor.Config.MemoryRegionScanTimeout;
case ScanTarget.Modules: return _monitor.Config.ModuleScanTimeout;
case ScanTarget.Threads: return _monitor.Config.ThreadScanTimeout;
default: return _monitor.Config.ProcessScanInterval;
}
}
public IScannable CreateScanTask()
{
return new ProcessScanner(this, _monitor.Processes);
}
async public Task<IScannable> CreateFullScanTaskAsync(ScanTarget target = ScanTarget.ProcessDetails)
{
if (target.HasFlag(ScanTarget.Processes))
{
await CreateScanTask().ScanAsync();
target &= ~ScanTarget.Processes;
}
var scanner = new ScanQueue();
var data = _monitor.Processes.Values;
if (data != null)
{
foreach (var process in data)
{
scanner.Add(CreateScanTask(process, target));
}
}
return scanner;
}
public IScannable CreateScanTask(ProcessInfo process, ScanTarget target = ScanTarget.ProcessDetails)
{
var scanner = new ScanQueue();
if (target.HasFlag(ScanTarget.MemoryRegions))
{
scanner.Add(new MemoryRegionScanner(this, process.MemoryRegionsContainer, process.PID));
}
if (target.HasFlag(ScanTarget.Modules))
{
scanner.Add(new ModuleScanner(this, process.ModulesContainer, process.PID));
}
if (target.HasFlag(ScanTarget.Threads))
{
scanner.Add(new ThreadScanner(this, process.ThreadsContainer, process.PID));
}
return scanner;
}
public ScanProvider(ProcessMonitor monitoringService)
{
_monitor = monitoringService;
}
}
}