// 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 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; } } }