Merge pull request #1298 from Unnoen/try-catch-physical-disk

Wrap disk scope in try/catch, default to unspecified if error.
This commit is contained in:
Timothy Baldridge 2021-02-04 05:50:53 -07:00 committed by GitHub
commit 73e6624864
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 29 deletions

View File

@ -12,37 +12,43 @@ namespace Wabbajack.Common
if (driveLetter.Length == 3 && (driveLetter[1] == ':' && driveLetter[2] == '\\')) driveLetter = driveLetter.Remove(driveLetter.Length - 2);
if (driveLetter.Length > 3) Utils.Error("Incorrect drive name! Must be X, X: or X:\\");
Utils.Log($"Phsyical Disk: {driveLetter}");
// Connect to storage scope
var scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
scope.Connect();
// Search partitions that use requested the drive letter
var partitionSearcher = new ManagementObjectSearcher($"SELECT DiskNumber FROM MSFT_Partition WHERE DriveLetter='{driveLetter}'");
partitionSearcher.Scope = scope;
// Get first partition that matches
var partition = partitionSearcher.Get().OfType<ManagementObject>().First();
// Search for a disk where the device ID matches the one we got from the partition
var physicalSearcher = new ManagementObjectSearcher($"SELECT * FROM MSFT_PhysicalDisk WHERE DeviceId='{partition["DiskNumber"]}'");
physicalSearcher.Scope = scope;
// Get disk information
var physical = physicalSearcher.Get().Cast<ManagementBaseObject>().Single();
DriveLetter = driveLetter;
DeviceId = (string)physical["DeviceId"];
MediaType = (MediaTypes)Convert.ToInt32(physical["MediaType"]);
BusType = (BusTypes)Convert.ToInt32(physical["BusType"]);
try {
// Connect to storage scope
var scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
scope.Connect();
// Search partitions that use requested the drive letter
var partitionSearcher = new ManagementObjectSearcher($"SELECT DiskNumber FROM MSFT_Partition WHERE DriveLetter='{driveLetter}'");
partitionSearcher.Scope = scope;
// Get first partition that matches
var partition = partitionSearcher.Get().OfType<ManagementObject>().First();
// Search for a disk where the device ID matches the one we got from the partition
var physicalSearcher = new ManagementObjectSearcher($"SELECT * FROM MSFT_PhysicalDisk WHERE DeviceId='{partition["DiskNumber"]}'");
physicalSearcher.Scope = scope;
// Get disk information
var physical = physicalSearcher.Get().Cast<ManagementBaseObject>().Single();
DeviceId = (string)physical["DeviceId"];
MediaType = (MediaTypes)Convert.ToInt32(physical["MediaType"]);
BusType = (BusTypes)Convert.ToInt32(physical["BusType"]);
}
catch (Exception ex)
{
Utils.Log($"Caught error getting disk info: {ex.Message}. Treating disk as Unspecified.");
}
}
public string DriveLetter { get; }
public string DeviceId { get; }
public string DeviceId { get; } = "-1";
public MediaTypes MediaType { get; }
public MediaTypes MediaType { get; } = MediaTypes.Unspecified;
public BusTypes BusType { get; }
public BusTypes BusType { get; } = BusTypes.Unknown;
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/stormgmt/msft-physicaldisk#properties
public enum MediaTypes

View File

@ -56,8 +56,6 @@ namespace Wabbajack.Lib
await Metrics.Send(Metrics.BeginInstall, ModList.Name);
Utils.Log("Configuring Processor");
if (new PhysicalDisk(OutputFolder.DriveInfo().Name).MediaType == PhysicalDisk.MediaTypes.HDD && ReduceHDDThreads) DesiredThreads.OnNext(1); else DesiredThreads.OnNext(DiskThreads);
FileExtractor2.FavorPerfOverRAM = FavorPerfOverRam;
if (GameFolder == null)
@ -120,13 +118,13 @@ namespace Wabbajack.Lib
}
}
// Reduce to one thread if downloads on HDD, else use specified. Hashing on HDD has no benefit with more threads.
if (new PhysicalDisk(DownloadFolder.DriveInfo().Name).MediaType == PhysicalDisk.MediaTypes.HDD && ReduceHDDThreads) DesiredThreads.OnNext(1); else DesiredThreads.OnNext(DiskThreads);
if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Optimizing ModList");
await OptimizeModlist();
// Reduce to one thread if downloads on HDD, else use specified. Hashing on HDD has no benefit with more threads.
if (new PhysicalDisk(DownloadFolder.DriveInfo().Name).MediaType == PhysicalDisk.MediaTypes.HDD && ReduceHDDThreads) DesiredThreads.OnNext(1); else DesiredThreads.OnNext(DiskThreads);
if (cancel.IsCancellationRequested) return false;
UpdateTracker.NextStep("Hashing Archives");
await HashArchives();