// 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.Processes: return _monitor.Config.MemoryRegionScanTimeout; case ScanTarget.Modules: return _monitor.Config.MemoryRegionScanTimeout; case ScanTarget.Threads: return _monitor.Config.MemoryRegionScanTimeout; default: return _monitor.Config.ProcessScanInterval; } } public IScannable CreateScanTask() { return new ProcessScanner(this, _monitor.Processes); } private IScannable CreateScanTask(ScanTarget target) { var scanner = new ScanQueue(); CreateScanTask().Scan(); 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.Processes)) { return CreateScanTask(target^ScanTarget.Processes); } if (target.HasFlag(ScanTarget.MemoryRegions) && process != null) { scanner.Add(new MemoryRegionScanner(this, process.MemoryRegionsContainer, process.PID)); } if (target.HasFlag(ScanTarget.Modules) && process != null) { scanner.Add(new ModuleScanner(this, process.ModulesContainer, process.PID)); } if (target.HasFlag(ScanTarget.Threads) && process != null) { scanner.Add(new ThreadScanner(this, process.ThreadsContainer, process.PID)); } return scanner; } public ScanProvider(ProcessMonitor monitoringService) { _monitor = monitoringService; } } }