internal void CollectLogicalDiscs(bool useCache = false) { if (useCache && _islogicalDiscsCollected) return; CollectDiscPartitions(true); try { var partitions = Devices.SelectMany(x => x.Partitions).ToArray(); Func<ManagementObject, string, string> getDeviceId = ((mo, selector) => { var input = mo.TryGet<string>(selector).ToString(); var match = Regex.Match(input, "DeviceID=\"(.*?)\""); return match.Groups[1].Value; }); var mapping = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition").Get().OfType<ManagementObject>().ToDictionary(mo => getDeviceId(mo, "Dependent"), mo => partitions.FirstOrDefault(part => part.DeviceId == getDeviceId(mo, "Antecedent"))); var groupedLogicalDisks = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk").Get().OfType<ManagementObject>().GroupBy(x => x.TryGet<string>("DeviceID")); foreach (var group in groupedLogicalDisks) { try { CsgDiskPartition targetPartition; if (!mapping.TryGetValue(group.Key, out targetPartition)) continue; new ListAssimilator<ManagementObject, CsgLogicalDisk>(group, targetPartition._logicalDisks) { CreateFunc = o => CsgLogicalDisk.FromManagementObject(o), EqualFunc = (o, disk) => disk.DeviceId == o.TryGet<string>("DeviceID"), OnPairFound = (o, disk) => disk.Load(o), }.Execute(); } catch (Exception) { } } } catch (Exception) { } _islogicalDiscsCollected = true; }