using System.Management; using Microsoft.Extensions.Logging; using PatchProbe.Shared.Contracts; using PatchProbe.Shared.Models; namespace PatchProbe.Cli.Collectors; public sealed class DriverCollector(ILogger logger) : ICollector> { public Task> CollectAsync(CancellationToken cancellationToken = default) { logger.LogInformation("Collecting driver information via Win32_PnPSignedDriver"); var drivers = new List(); try { using var searcher = new ManagementObjectSearcher( new ManagementScope(@"root\CIMv2"), new ObjectQuery("SELECT * FROM Win32_PnPSignedDriver WHERE DeviceName IS NOT NULL")); using var results = searcher.Get(); foreach (ManagementBaseObject obj in results) { DateTimeOffset? driverDate = null; var dateRaw = obj["DriverDate"]?.ToString(); if (!string.IsNullOrEmpty(dateRaw)) { try { // WMI datetime format: yyyymmddHHmmss.ffffff+UTC — convert via UTC to avoid local-offset mismatch var dt = ManagementDateTimeConverter.ToDateTime(dateRaw); driverDate = new DateTimeOffset(dt.ToUniversalTime(), TimeSpan.Zero); } catch { /* best-effort */ } } drivers.Add(new DriverInfo { DeviceName = obj["DeviceName"]?.ToString()?.Trim(), DriverVersion = obj["DriverVersion"]?.ToString()?.Trim(), Manufacturer = obj["Manufacturer"]?.ToString()?.Trim(), InfName = obj["InfName"]?.ToString()?.Trim(), HardwareId = obj["HardWareID"]?.ToString()?.Trim(), DeviceClass = obj["DeviceClass"]?.ToString()?.Trim(), DriverDate = driverDate, IsSigned = string.Equals(obj["IsSigned"]?.ToString(), "True", StringComparison.OrdinalIgnoreCase), }); } logger.LogInformation("Collected {Count} drivers", drivers.Count); } catch (Exception ex) { logger.LogWarning(ex, "Driver collection failed"); } return Task.FromResult(drivers); } }