From 9e831e07b282f6a234725777528af3dde7ab6f62 Mon Sep 17 00:00:00 2001 From: Blacktempel <6657796+Blacktempel@users.noreply.github.com> Date: Mon, 6 Apr 2026 19:26:02 +0200 Subject: [PATCH] Update for DiskInfoToolkit Version 2.0.0. (#2298) * Update for DiskInfoToolkit Version 2.0.0. * PR comments * PR comments. * Apply suggestion from @PhyxionNL --------- Co-authored-by: PhyxionNL <7643972+PhyxionNL@users.noreply.github.com> --- .../Hardware/Storage/SmartAttribute.cs | 14 +- .../Storage/SmartAttributeTranslator.cs | 1760 ----------------- .../Hardware/Storage/StorageDevice.cs | 189 +- .../Hardware/Storage/StorageDeviceSensor.cs | 6 +- .../Hardware/Storage/StorageGroup.cs | 78 +- .../LibreHardwareMonitorLib.csproj | 2 +- 6 files changed, 180 insertions(+), 1869 deletions(-) delete mode 100644 LibreHardwareMonitorLib/Hardware/Storage/SmartAttributeTranslator.cs diff --git a/LibreHardwareMonitorLib/Hardware/Storage/SmartAttribute.cs b/LibreHardwareMonitorLib/Hardware/Storage/SmartAttribute.cs index 06d0c7f..5a0fe23 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/SmartAttribute.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/SmartAttribute.cs @@ -4,6 +4,8 @@ // Partial Copyright (C) Michael Möller and Contributors. // All Rights Reserved. +using DiskInfoToolkit; + namespace LibreHardwareMonitor.Hardware.Storage; public sealed class SmartAttribute @@ -26,7 +28,7 @@ public sealed class SmartAttribute /// no sensor is created. /// /// True to hide the sensor initially. - public SmartAttribute(DiskInfoToolkit.SmartAttribute smartAttribute, SensorType? sensorType, int sensorChannel, string sensorName, bool defaultHiddenSensor = false) + public SmartAttribute(SmartAttributeEntry smartAttribute, SensorType? sensorType, int sensorChannel, string sensorName, bool defaultHiddenSensor = false) { Attribute = smartAttribute; SensorType = sensorType; @@ -35,16 +37,16 @@ public sealed class SmartAttribute IsHiddenByDefault = defaultHiddenSensor; } - public DiskInfoToolkit.SmartAttribute Attribute { get; internal set; } + public SmartAttributeEntry Attribute { get; internal set; } - public byte Id => Attribute.Info.ID; - public string Name => Attribute.Info.Name; + public byte Id => Attribute.ID; + public string Name => Attribute.Name; public SensorType? SensorType { get; } public int SensorChannel { get; } public string SensorName { get; } public bool IsHiddenByDefault { get; } - public float Value => Attribute.Attribute.RawValueULong; - public byte Threshold => Attribute.Attribute.Threshold; + public float Value => Attribute.RawValue; + public byte Threshold => Attribute.ThresholdValue; } diff --git a/LibreHardwareMonitorLib/Hardware/Storage/SmartAttributeTranslator.cs b/LibreHardwareMonitorLib/Hardware/Storage/SmartAttributeTranslator.cs deleted file mode 100644 index 27d6c95..0000000 --- a/LibreHardwareMonitorLib/Hardware/Storage/SmartAttributeTranslator.cs +++ /dev/null @@ -1,1760 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. -// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// Copyright (C) LibreHardwareMonitor and Contributors. -// Partial Copyright (C) Michael Möller and Contributors. -// All Rights Reserved. - -using System.Collections.Generic; -using DiskInfoToolkit.Interop.Enums; - -namespace LibreHardwareMonitor.Hardware.Storage; - -internal static class SmartAttributeTranslator -{ - const int SensorChannelStartIndex = 100; - - public static List GetAttributesFor(DiskInfoToolkit.Storage storage) - { - switch (storage.SmartKey) - { - case SmartKey.Smart: - return GetSmart(storage); - case SmartKey.SSD: - return GetSSD(storage); - case SmartKey.Mtron: - return GetMtron(storage); - case SmartKey.Indilinx: - return GetIndilinx(storage); - case SmartKey.JMicron60x: - return GetJMicron60X(storage); - case SmartKey.Intel: - return GetIntel(storage); - case SmartKey.Samsung: - return GetSamsung(storage); - case SmartKey.SandForce: - return GetSandforce(storage); - case SmartKey.JMicron61x: - return GetJMicron61X(storage); - case SmartKey.Micron: - return GetMicron(storage); - case SmartKey.MicronMU02: - return GetMicronMU03(storage); - case SmartKey.Ocz: - return GetOcz(storage); - case SmartKey.Plextor: - return GetPlextor(storage); - case SmartKey.SanDisk: - return GetSandisk(storage); - case SmartKey.OczVector: - return GetOczVector(storage); - case SmartKey.Corsair: - return GetCorsair(storage); - case SmartKey.Toshiba: - return GetToshiba(storage); - case SmartKey.SanDiskGb: - return GetSandiskGB(storage); - case SmartKey.Kingston: - return GetKingston(storage); - case SmartKey.NVMe: - return GetNVME(storage); - case SmartKey.Realtek: - return GetRealtek(storage); - case SmartKey.SKhynix: - return GetSkhynix(storage); - case SmartKey.Kioxia: - return GetKioxia(storage); - case SmartKey.WDC: - return GetWdc(storage); - case SmartKey.KingstonSuv: - return GetKingstonSUV(storage); - case SmartKey.KingstonKC600: - return GetKingstonKC600(storage); - case SmartKey.KingstonDC500: - return GetKingstonDC500(storage); - case SmartKey.KingstonSA400: - return GetKingstonSA400(storage); - case SmartKey.Ssstc: - return GetSSSTC(storage); - case SmartKey.IntelDc: - return GetIntelDC(storage); - case SmartKey.Apacer: - return GetAPACER(storage); - case SmartKey.SiliconMotion: - return GetSiliconMotion(storage); - case SmartKey.JMicron66x: - return GetJMicron66X(storage); - case SmartKey.Phison: - return GetPhison(storage); - case SmartKey.Seagate: - return GetSeagate(storage); - case SmartKey.SeagateIronWolf: - return GetSeagateIronWolf(storage); - case SmartKey.Marvell: - return GetMarvell(storage); - case SmartKey.Maxiotek: - return GetMaxiotek(storage); - case SmartKey.SeagateBarraCuda: - return GetSeagateBarraCuda(storage); - case SmartKey.Ymtc: - return GetYMTC(storage); - case SmartKey.Scy: - return GetSCY(storage); - case SmartKey.Recadata: - return GetRecadata(storage); - case SmartKey.SanDiskHP: - return GetSandiskHP(storage); - case SmartKey.SanDiskHPVenus: - return GetSandiskHPVenus(storage); - case SmartKey.SanDiskDell: - return GetSandiskDell(storage); - case SmartKey.SanDiskLenovo: - return GetSandiskLenovo(storage); - case SmartKey.SanDiskLenovoHelenVenus: - return GetSandiskLenovoHelenVenus(storage); - case SmartKey.MicronMU03: - return GetMicronMU03(storage); - case SmartKey.SanDiskCloud: - return GetSandiskCloud(storage); - case SmartKey.SiliconMotionCVC: - return GetSiliconMotionCVC(storage); - case SmartKey.AdataIndustrial: - return GetAdataIndustrial(storage); - default: - return new(); - } - } - - private static List GetSmart(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.StartStopCount), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.ReadChannelMargin), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.RecalibrationRetries), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SoftReadErrorRateStab), - Get(storage, SmartAttributeType.CurrentHeliumLevel), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.HighFlyWrites), - Get(storage, SmartAttributeType.AirflowTemperature), - Get(storage, SmartAttributeType.GSenseErrorRate), - Get(storage, SmartAttributeType.PowerOffRetractCount), - Get(storage, SmartAttributeType.LoadUnloadCycleCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HardwareECCRecovered), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.WriteErrorRate), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.DataAddressMarkError), - Get(storage, SmartAttributeType.RunOutCancel), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.ThermalAsperityRate), - Get(storage, SmartAttributeType.FlyingHeight), - Get(storage, SmartAttributeType.SpinHighCurrent), - Get(storage, SmartAttributeType.SpinBuzz), - Get(storage, SmartAttributeType.OfflineSeekPerformance), - Get(storage, SmartAttributeType.VibrationDuringWrite), - Get(storage, SmartAttributeType.ShockDuringWrite), - Get(storage, SmartAttributeType.DiskShift), - Get(storage, SmartAttributeType.GSenseErrorRate), - Get(storage, SmartAttributeType.LoadedHours), - Get(storage, SmartAttributeType.LoadUnloadCycleCount), - Get(storage, SmartAttributeType.LoadFriction), - Get(storage, SmartAttributeType.LoadUnloadCycleCount), - Get(storage, SmartAttributeType.LoadInTime), - Get(storage, SmartAttributeType.TorqueAmplificationCount), - Get(storage, SmartAttributeType.PowerOffRetractCount), - Get(storage, SmartAttributeType.GMRHeadAmplitude), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HeadFlyingHours), - Get(storage, SmartAttributeType.ReadErrorRetryRate), - Get(storage, SmartAttributeType.FreeFallProtection), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.HeliumConditionLower), - Get(storage, SmartAttributeType.HeliumConditionUpper), - Get(storage, SmartAttributeType.MAMRHealthMonitor), - ]; - } - - private static List GetSSD(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.StartStopCount), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.ReadChannelMargin), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.RecalibrationRetries), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SoftReadErrorRateStab), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetMtron(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.TotalEraseCount), - ]; - } - - private static List GetIndilinx(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ProgramFailureBlockCount), - Get(storage, SmartAttributeType.EraseFailureBlockCount), - Get(storage, SmartAttributeType.ReadFailureBlockCount), - Get(storage, SmartAttributeType.TotalCountReadSectors), - Get(storage, SmartAttributeType.TotalCountWriteSectors), - Get(storage, SmartAttributeType.TotalCountReadCommands), - Get(storage, SmartAttributeType.TotalCountWriteCommands), - Get(storage, SmartAttributeType.TotalCountErrorBitsFromFlash), - Get(storage, SmartAttributeType.TotalCountReadSectorsWithCorrectableBitErrors), - Get(storage, SmartAttributeType.BadBlockFullFlag), - Get(storage, SmartAttributeType.MaximumPECountSpecification), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.RemainingLife), - ]; - } - - private static List GetIntel(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.StartStopCount), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.PowerLossProtectionFailure), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.TimedWorkloadMediaWear), - Get(storage, SmartAttributeType.TimedWorkloadHostReadWriteRatio), - Get(storage, SmartAttributeType.TimedWorkloadTimer), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSamsung(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.RuntimeBadBlock), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.AirflowTemperature), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.SuperCapStatus), - Get(storage, SmartAttributeType.SSDModeStatus), - Get(storage, SmartAttributeType.PORRecoveryCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ErrorDetection), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - ]; - } - - private static List GetSandforce(DiskInfoToolkit.Storage storage) - { - int sensorStart = SensorChannelStartIndex; - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.RetiredBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.GigabytesErased), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.WearRangeDelta), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.IOErrorDetectionCodeErrors), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.SATARErrors), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.DriveLifeProtectionStatus), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten, SensorType.Data, sensorStart++), - Get(storage, SmartAttributeType.PowerFailBackupHealth), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetMicron(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.DeviceCapacity), - Get(storage, SmartAttributeType.UserCapacity), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.UnalignedAccessCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.ErrorCorrectionCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCBitCorrectionCount), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.LifetimeUsed), - Get(storage, SmartAttributeType.WriteErrorRate), - Get(storage, SmartAttributeType.SuccessfulRAINRecoveryCount), - Get(storage, SmartAttributeType.TotalBytesRead), - Get(storage, SmartAttributeType.WriteProtectProgress), - Get(storage, SmartAttributeType.ECCBitsCorrected), - Get(storage, SmartAttributeType.ECCCumulativeThresholdEvents), - Get(storage, SmartAttributeType.CumulativeProgramNANDPages), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostProgramPageCount), - Get(storage, SmartAttributeType.BackgroundProgramPageCount), - Get(storage, SmartAttributeType.TotalRefreshISPCount), - Get(storage, SmartAttributeType.TotalDoRefCalCount), - Get(storage, SmartAttributeType.TotalNANDReadPlaneCountLow), - Get(storage, SmartAttributeType.TotalNANDReadPlaneCountHigh), - Get(storage, SmartAttributeType.TotalBlockReMapPassCount), - Get(storage, SmartAttributeType.TotalBackgroundScanOverLimitCount), - Get(storage, SmartAttributeType.TotalBackgroundScan), - ]; - } - - private static List GetOcz(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.StartStopCount), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.TotalCountWriteSectors), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.TotalBlocksErased), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.TotalNumberCorrectedBits), - Get(storage, SmartAttributeType.MaxRatedPECounts), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.NandReadRetryCount), - Get(storage, SmartAttributeType.SimpleReadRetryAttempts), - Get(storage, SmartAttributeType.AdaptiveReadRetryAttempts), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.RAIDRecoveryCount), - Get(storage, SmartAttributeType.PowerLossProtectionFailure), - Get(storage, SmartAttributeType.NandDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSeagate(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.RetiredBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.WearRangeDelta), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.ReadFailureBlockCount), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataRead), - ]; - } - - private static List GetWdc(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.TotalNANDEraseCount), - Get(storage, SmartAttributeType.MinimumPECycles), - Get(storage, SmartAttributeType.MaximumBadBlocksPerDie), - Get(storage, SmartAttributeType.MaximumPECycles), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AveragePECycles), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.EndToEndErrorsCorrected), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetPlextor(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCountWorstCase), - Get(storage, SmartAttributeType.EraseFailCountWorstCase), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCountWorstCase), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndErrorsCorrected), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetSandisk(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.PercentOfTotalEraseCount), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.PercentOfTotalEraseCountBCBlocks), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetOczVector(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.RuntimeBadBlock), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.TotalUncorrectableNANDReads), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalReadFailures), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.TotalBlocksErased), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalNumberCorrectedBits), - Get(storage, SmartAttributeType.MaxRatedPECounts), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.NandReadRetryCount), - Get(storage, SmartAttributeType.SimpleReadRetryAttempts), - Get(storage, SmartAttributeType.AdaptiveReadRetryAttempts), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.RAIDRecoveryCount), - Get(storage, SmartAttributeType.InWarranty), - Get(storage, SmartAttributeType.DASPolarity), - Get(storage, SmartAttributeType.PartialPfail), - Get(storage, SmartAttributeType.WriteThrottlingActivationFlag), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataRead), - ]; - } - - private static List GetToshiba(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.StartStopCount), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.RecalibrationRetries), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetCorsair(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.RetiredBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetKingston(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.WriteHead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.TotalEraseCount), - ]; - } - - private static List GetMicronMU03(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.UnusedSpareNANDBlocks), - Get(storage, SmartAttributeType.Non4KAlignedAccess), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.ErrorCorrectionCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.ErrorCorrectionCount), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.WriteErrorRate), - Get(storage, SmartAttributeType.SuccessfulRAINRecoveryCount), - Get(storage, SmartAttributeType.HostProgramPageCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.HostProgramPageCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.CumulativeProgramNANDPages), - Get(storage, SmartAttributeType.CumulativeProgramNANDPages), - ]; - } - - private static List GetNVME(DiskInfoToolkit.Storage storage) - { - int sensorStart = SensorChannelStartIndex; - return - [ - Get(storage, SmartAttributeType.CriticalWarning), - Get(storage, SmartAttributeType.CompositeTemperature), - Get(storage, SmartAttributeType.AvailableSpare, SensorType.Level, sensorStart++), - Get(storage, SmartAttributeType.AvailableSpareThreshold, SensorType.Level, sensorStart++), - Get(storage, SmartAttributeType.PercentageUsed, SensorType.Level, sensorStart++), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostReadCommands), - Get(storage, SmartAttributeType.HostWriteCommands), - Get(storage, SmartAttributeType.ControllerBusyTime), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.MediaAndDataIntegrityErrors), - Get(storage, SmartAttributeType.NumberOfErrorInformationLogEntries), - Get(storage, SmartAttributeType.WarningCompositeTemperatureTime), - Get(storage, SmartAttributeType.CriticalCompositeTemperatureTime), - Get(storage, SmartAttributeType.TemperatureSensor1), - Get(storage, SmartAttributeType.TemperatureSensor2), - Get(storage, SmartAttributeType.TemperatureSensor3), - Get(storage, SmartAttributeType.TemperatureSensor4), - Get(storage, SmartAttributeType.TemperatureSensor5), - Get(storage, SmartAttributeType.TemperatureSensor6), - Get(storage, SmartAttributeType.TemperatureSensor7), - Get(storage, SmartAttributeType.TemperatureSensor8), - Get(storage, SmartAttributeType.ThermalManagementTemperature1TransitionCount), - Get(storage, SmartAttributeType.ThermalManagementTemperature2TransitionCount), - Get(storage, SmartAttributeType.TotalTimeThermalManagementTemperature1), - Get(storage, SmartAttributeType.TotalTimeThermalManagementTemperature2), - ]; - } - - private static List GetRealtek(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.RawDataErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.GDN), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.MaximumPECycles), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ECCFailRecord), - Get(storage, SmartAttributeType.UnalignedAccessCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCBitCorrectionCount), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSkhynix(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCountWorstCase), - Get(storage, SmartAttributeType.EraseFailCountWorstCase), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCountWorstCase), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.ShockEventCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.UncorrectableSoftReadErrorRate), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataRead), - ]; - } - - private static List GetKioxia(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HostDataWritten), - ]; - } - - private static List GetSSSTC(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCountWorstCase), - Get(storage, SmartAttributeType.EraseFailCountWorstCase), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCountWorstCase), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.PowerLossProtectionFailure), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetIntelDC(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.DeviceCapacity), - Get(storage, SmartAttributeType.UserCapacity), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.TotalBlockEraseFailure), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.PowerLossProtectionFailure), - Get(storage, SmartAttributeType.ProgramFailureBlockCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.LifetimeUsed), - Get(storage, SmartAttributeType.TimedWorkloadMediaWear), - Get(storage, SmartAttributeType.TimedWorkloadHostReadWriteRatio), - Get(storage, SmartAttributeType.TimedWorkloadTimer), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetAPACER(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - ]; - } - - private static List GetSiliconMotion(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SLCTotalEraseCount), - Get(storage, SmartAttributeType.SLCMaximumEraseCount), - Get(storage, SmartAttributeType.SLCMinimumEraseCount), - Get(storage, SmartAttributeType.SLCAverageEraseCount), - Get(storage, SmartAttributeType.DRAM1BitErrorCount), - Get(storage, SmartAttributeType.UncorrectableSectorCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.NumberOfCacheDataBlock), - Get(storage, SmartAttributeType.NumberOfInvalidBlocks), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.MaxEraseCountOfSpec), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.ProgramFailCountInWorstDie), - Get(storage, SmartAttributeType.EraseFailCountInWorstDie), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.RuntimeBadBlock), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.PowerOffRetractCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HardwareECCRecovered), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.TotalCountWriteSectors), - ]; - } - - private static List GetPhison(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - ]; - } - - private static List GetMarvell(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.PowerOffRetractCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetMaxiotek(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.ReadErrorRetryRate), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.SLCMinimumEraseCount), - Get(storage, SmartAttributeType.SLCMaximumEraseCount), - Get(storage, SmartAttributeType.SLCAverageEraseCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.BitErrorCount), - ]; - } - - private static List GetYMTC(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.MaximumBadBlocksPerDie), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndErrorsCorrected), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.SLCMinimumEraseCount), - Get(storage, SmartAttributeType.SLCMaximumEraseCount), - Get(storage, SmartAttributeType.SLCAverageEraseCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NANDTemperature), - Get(storage, SmartAttributeType.BitErrorCount), - ]; - } - - private static List GetSCY(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.ReadErrorRetryRate), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RuntimeBadBlock), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCBitCorrectionCount), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetJMicron60X(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HaltSystemIDFlashID), - Get(storage, SmartAttributeType.FirmwareVersion), - Get(storage, SmartAttributeType.ECCFailRecord), - Get(storage, SmartAttributeType.AverageEraseCountMaxEraseCount), - Get(storage, SmartAttributeType.GoodBlockCountSystemBlockCount), - ]; - } - - private static List GetJMicron61X(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.ECCFailRecord), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - ]; - } - - private static List GetJMicron66X(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ThroughputPerformance), - Get(storage, SmartAttributeType.SpinUpTime), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.SeekTimePerformance), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.SpinRetryCount), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.WriteHead), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetSeagateIronWolf(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.GigabytesErased), - Get(storage, SmartAttributeType.LifetimePS4EntryCount), - Get(storage, SmartAttributeType.LifetimePS3EntryCount), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.WearRangeDelta), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.RAISEECCCorrectableCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.DriveLifeProtectionStatus), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.FreeSpace), - ]; - } - - private static List GetSeagateBarraCuda(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.RetiredBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.WearRangeDelta), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.SoftReadErrorRate), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.ReadFailureBlockCount), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataRead), - ]; - } - - private static List GetSandiskGB(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.TotalBlocksErased), - Get(storage, SmartAttributeType.MinimumPECycles), - Get(storage, SmartAttributeType.MaximumBadBlocksPerDie), - Get(storage, SmartAttributeType.MaximumPECycles), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.PECycles), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.EndToEndErrorsCorrected), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetKingstonSUV(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCountInWorstDie), - Get(storage, SmartAttributeType.EraseFailCountInWorstDie), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCountWorstDie), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.SoftECCCorrection), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataRead), - ]; - } - - private static List GetKingstonKC600(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.SLCAverageEraseCount), - Get(storage, SmartAttributeType.DRAM1BitErrorCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.Reserved), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.HardwareECCRecovered), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.UnusedReservedBlockCount), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.HostDataWritten), - ]; - } - - private static List GetKingstonDC500(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.BadBlockFullFlag), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.TotalReadFailures), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.TotalEraseCount), - ]; - } - - private static List GetKingstonSA400(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.VendorUnique), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.TotalEraseCount), - ]; - } - - private static List GetRecadata(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.SeekErrorRate), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.ReadErrorRetryRate), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.RuntimeBadBlock), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCBitCorrectionCount), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.PendingSectorCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSandiskDell(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UsedReservedBlockCountWorstCase), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ECCErrorRate), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - ]; - } - - private static List GetSandiskHP(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.AirflowTemperature), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.ThrottleStatistics), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSandiskHPVenus(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.WearLevelingCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.AirflowTemperature), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocationEventCount), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSandiskLenovo(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.MinimumPECycles), - Get(storage, SmartAttributeType.MaximumBadBlocksPerDie), - Get(storage, SmartAttributeType.MaximumPECycles), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AveragePECycles), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.RemainingSpareBlocks), - Get(storage, SmartAttributeType.EndToEndErrorsCorrected), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.ThrottleStatistics), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - ]; - } - - private static List GetSandiskLenovoHelenVenus(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.MinimumPECycles), - Get(storage, SmartAttributeType.MaximumBadBlocksPerDie), - Get(storage, SmartAttributeType.MaximumPECycles), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AveragePECycles), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.UsedReservedBlockCount), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.CommandTimeout), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.AvailableReservedSpace), - Get(storage, SmartAttributeType.MediaWearoutIndicator), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.ThrottleStatistics), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetSandiskCloud(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.RetiredBlockCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.WriteAmplificationMultipliedBy100), - Get(storage, SmartAttributeType.WriteAmplificationFactor), - Get(storage, SmartAttributeType.ReserveBlockCount), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.CleanShutdownCount), - Get(storage, SmartAttributeType.UnsafeShutdownCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.ReallocatedNANDBlocks), - Get(storage, SmartAttributeType.PercentOfTotalEraseCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.CapacitorHealth), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.ThermalThrottleStatus), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.SPITestsRemaining), - ]; - } - - private static List GetSiliconMotionCVC(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.ReallocatedSectorsCount), - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SLCCache), - Get(storage, SmartAttributeType.GrownBadBlocks), - Get(storage, SmartAttributeType.ProgramFailCount), - Get(storage, SmartAttributeType.EraseFailCount), - Get(storage, SmartAttributeType.AverageEraseCount), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.ProgramFailCountWorstCase), - Get(storage, SmartAttributeType.SATADownshiftCount), - Get(storage, SmartAttributeType.EndToEndError), - Get(storage, SmartAttributeType.UncorrectableErrors), - Get(storage, SmartAttributeType.MaximumEraseCount), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.MinimumEraseCount), - Get(storage, SmartAttributeType.ReadErrorRate), - Get(storage, SmartAttributeType.OfflineUncorrectableErrors), - Get(storage, SmartAttributeType.CRCErrorCount), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.NandDataWritten), - Get(storage, SmartAttributeType.HostDataWritten), - Get(storage, SmartAttributeType.HostDataRead), - Get(storage, SmartAttributeType.RAIDEventCount), - Get(storage, SmartAttributeType.RAIDUncorrectableCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.ReadErrorRetryRate), - Get(storage, SmartAttributeType.NandDataWritten), - ]; - } - - private static List GetAdataIndustrial(DiskInfoToolkit.Storage storage) - { - return - [ - Get(storage, SmartAttributeType.PowerOnHours), - Get(storage, SmartAttributeType.PowerCycleCount), - Get(storage, SmartAttributeType.SSDProtectMode), - Get(storage, SmartAttributeType.SATAPhysicalErrorCount), - Get(storage, SmartAttributeType.BadBlockCount), - Get(storage, SmartAttributeType.TotalEraseCount), - Get(storage, SmartAttributeType.BadClusterTableCount), - Get(storage, SmartAttributeType.SpareBlocksAvailable), - Get(storage, SmartAttributeType.UnexpectedPowerLoss), - Get(storage, SmartAttributeType.Temperature), - Get(storage, SmartAttributeType.RemainingLife), - Get(storage, SmartAttributeType.FlashWriteSectorCount), - Get(storage, SmartAttributeType.FlashReadSectorCount), - Get(storage, SmartAttributeType.TotalCountWriteSectors), - Get(storage, SmartAttributeType.TotalCountReadSectors), - ]; - } - - private static SmartAttribute Get(DiskInfoToolkit.Storage storage, SmartAttributeType smartAttributeType, SensorType? sensorType = null, int sensorChannel = 0, string sensorName = null) - { - var attr = storage.Smart.SmartAttributes.Find(sa => sa.Info.Type == smartAttributeType); - - if (attr == null) - { - return null; - } - else - { - return new(attr, sensorType, sensorChannel, sensorName); - } - } -} diff --git a/LibreHardwareMonitorLib/Hardware/Storage/StorageDevice.cs b/LibreHardwareMonitorLib/Hardware/Storage/StorageDevice.cs index ac42522..523b714 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/StorageDevice.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/StorageDevice.cs @@ -13,11 +13,13 @@ using System.Linq; using System.Text; using BlackSharp.Core.Converters; using BlackSharp.Core.Converters.Enums; -using DiskInfoToolkit.Interop.Enums; +using DiskInfoToolkit.Smart; using Windows.Win32; using Windows.Win32.Foundation; using Windows.Win32.Storage.FileSystem; using Windows.Win32.System.Ioctl; +using StorageDeviceDIT = DiskInfoToolkit.StorageDevice; +using StorageDIT = DiskInfoToolkit.Storage; namespace LibreHardwareMonitor.Hardware.Storage; @@ -26,7 +28,9 @@ public sealed class StorageDevice : Hardware, ISmart private readonly PerformanceValue _perfRead = new(); private readonly PerformanceValue _perfTotal = new(); private readonly PerformanceValue _perfWrite = new(); - private readonly DiskInfoToolkit.Storage _storage; + private readonly StorageDeviceDIT _storage; + + private bool _initialized; private long _lastReadCount; private long _lastTime; @@ -45,8 +49,8 @@ public sealed class StorageDevice : Hardware, ISmart private Sensor _usageSensor; private Sensor _freeSpaceSensor; - public StorageDevice(DiskInfoToolkit.Storage storage, string id, ISettings settings) - : base(storage.Model, new Identifier(id, storage.DriveNumber.ToString(CultureInfo.InvariantCulture)), settings) + public StorageDevice(StorageDeviceDIT storage, string id, ISettings settings) + : base(storage.ProductName, new Identifier(id, storage.StorageDeviceNumber.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)), settings) { _storage = storage; @@ -57,16 +61,15 @@ public sealed class StorageDevice : Hardware, ISmart public override HardwareType HardwareType => HardwareType.Storage; - public DiskInfoToolkit.Storage Storage => _storage; + public StorageDeviceDIT Storage => _storage; public IReadOnlyList Attributes => _attributes; - /// - public bool ForceWakeup - { - get { return _storage.ForceWakeup; } - set { _storage.ForceWakeup = value; } - } + /// + /// Forces disk to wake up, if disk is asleep. + /// + /// See for more information. + public bool ForceWakeup { get; set; } public static TimeSpan ThrottleInterval { get; set; } @@ -77,18 +80,37 @@ public sealed class StorageDevice : Hardware, ISmart return; } + // If storage device has no changes, skip update + if (!StorageDIT.Refresh(_storage)) + { + // If not initialized, we need to initialize sensors with initial values, even if there are no changes + if (!_initialized) + { + _initialized = true; + } + else + { + return; + } + } + + // Try waking up storage device if it is asleep and ForceWakeup is enabled + if (ForceWakeup && !_storage.IsDevicePowerOn.GetValueOrDefault(true)) + { + StorageDIT.TryWakeUp(_storage); + } + _lastUpdate = DateTime.UtcNow; ToggleSpaceSensors(); UpdatePerformanceSensors(); - _storage.Update(); UpdateSpaceSensors(); // Update attributes - foreach (var attribute in _storage.Smart.SmartAttributes) + foreach (var attribute in _storage.SmartAttributes) { // Try to find attribute - var found = _attributes.Find(sa => sa.Id == attribute.Info.ID); + var found = _attributes.Find(sa => sa.Id == attribute.ID); // Found attribute, update it if (found != null) @@ -106,15 +128,34 @@ public sealed class StorageDevice : Hardware, ISmart var r = new StringBuilder(); r.AppendLine("Storage"); r.AppendLine(); - r.AppendLine($"Drive Name: {_storage.Model}"); - r.AppendLine($"Firmware Version and Revision: {_storage.Firmware}; {_storage.FirmwareRev}"); - r.AppendLine(); - r.AppendLine("Smart Attributes:"); - r.AppendLine("ID, Description, Value, Threshold"); + r.AppendLine($"Drive Name: {_storage.ProductName}"); + + if (_storage.HealthStatus.HasValue) + { + r.AppendLine($"Health Status: {_storage.HealthStatus}"); + } + + if (_storage.HealthStatusReason != null) + { + r.AppendLine($"Health Status Reason:"); + r.AppendLine(_storage.HealthStatusReason); + } + + r.AppendLine($"Revision: {_storage.ProductRevision}"); + r.AppendLine($"Bus type: {_storage.BusType}"); + + r.AppendLine($"Controller information:"); + r.AppendLine($" Service: {_storage.Controller.Service}"); // Important + r.AppendLine($" Vendor: 0x{_storage.Controller.VendorID:X4} ('{_storage.Controller.VendorName}')"); + r.AppendLine($" Device: 0x{_storage.Controller.DeviceID:X4} ('{_storage.Controller.DeviceName}')"); + r.AppendLine($" Family: {_storage.Controller.Family}"); + + r.AppendLine($"Smart Attributes (Profile: '{_storage.SmartAttributeProfile}'):"); + r.AppendLine(" ID, Description, Value, Threshold"); foreach (var attribute in _attributes) { - r.AppendLine($"{attribute.Id,3}, {attribute.Name,60}, {attribute.Value,18}, {attribute.Threshold,3}"); + r.AppendLine($" {attribute.Id,3}, {attribute.Name,60}, {attribute.Value,18}, {attribute.Threshold,3}"); } r.AppendLine(); @@ -125,28 +166,30 @@ public sealed class StorageDevice : Hardware, ISmart foreach (var partition in _storage.Partitions) { - r.AppendLine($"Partition #{partition.PartitionNumber}"); + r.AppendLine($" Partition #{partition.PartitionNumber}"); if (partition.DriveLetter != null) { - r.AppendLine($"Drive Letter: {partition.DriveLetter}"); + r.AppendLine($" Drive Letter: {partition.DriveLetter}"); } - if (partition.AvailableFreeSpace != null) + if (partition.AvailableFreeSpaceBytes != null) { - r.AppendLine($"Available Free Space: {partition.AvailableFreeSpace}"); + r.AppendLine($" Available Free Space: {partition.AvailableFreeSpaceBytes}"); } + + r.AppendLine($" Contains other OS: {partition.IsOtherOperatingSystemPartition}"); } r.AppendLine(); - if (_storage.TotalFreeSize != null) + if (_storage.TotalPartitionFreeSpaceBytes != null) { - r.AppendLine($"Total Free Size: {_storage.TotalFreeSize}"); + r.AppendLine($"Total Free Size: {_storage.TotalPartitionFreeSpaceBytes}"); } } - r.AppendLine($"Total Size: {_storage.TotalSize}"); + r.AppendLine($"Total Size: {_storage.DiskSizeBytes}"); return r.ToString(); } @@ -161,52 +204,62 @@ public sealed class StorageDevice : Hardware, ISmart { _attributes.Clear(); - var attributes = SmartAttributeTranslator.GetAttributesFor(_storage); + var attributes = _storage.SmartAttributes.Select(a => new SmartAttribute(a, null, 0, null)); _attributes.AddRange(attributes.Where(a => a != null)); } private void CreateSensors() { - if (_storage.IsNVMe) + if (_storage.Temperature.HasValue) { - // Different name for NVMe - AddSensor("Composite Temperature", 0, false, SensorType.Temperature, s => s.Smart.Temperature.GetValueOrDefault()); - - TryAddTemperatureSensor(1, false, 1, SmartAttributeType.TemperatureSensor1); - TryAddTemperatureSensor(2, false, 2, SmartAttributeType.TemperatureSensor2); - TryAddTemperatureSensor(3, false, 3, SmartAttributeType.TemperatureSensor3); - TryAddTemperatureSensor(4, false, 4, SmartAttributeType.TemperatureSensor4); - TryAddTemperatureSensor(5, false, 5, SmartAttributeType.TemperatureSensor5); - TryAddTemperatureSensor(6, false, 6, SmartAttributeType.TemperatureSensor6); - TryAddTemperatureSensor(7, false, 7, SmartAttributeType.TemperatureSensor7); - TryAddTemperatureSensor(8, false, 8, SmartAttributeType.TemperatureSensor8); - - AddSensor("Warning Temperature", 10, false, SensorType.Temperature, s => s.Smart.TemperatureWarning.GetValueOrDefault()); - AddSensor("Critical Temperature", 11, false, SensorType.Temperature, s => s.Smart.TemperatureCritical.GetValueOrDefault()); - } - else - { - AddSensor("Temperature", 0, false, SensorType.Temperature, s => s.Smart.Temperature.GetValueOrDefault()); + AddSensor("Temperature", 0, false, SensorType.Temperature, s => s.Temperature.GetValueOrDefault()); } - if (_storage.Smart.Life.HasValue) + // NVMe specific temperature sensors, if available + TryAddTemperatureSensor(_storage, 1, false, 1, SmartTextKeys.TemperatureSensor1); + TryAddTemperatureSensor(_storage, 2, false, 2, SmartTextKeys.TemperatureSensor2); + TryAddTemperatureSensor(_storage, 3, false, 3, SmartTextKeys.TemperatureSensor3); + TryAddTemperatureSensor(_storage, 4, false, 4, SmartTextKeys.TemperatureSensor4); + TryAddTemperatureSensor(_storage, 5, false, 5, SmartTextKeys.TemperatureSensor5); + TryAddTemperatureSensor(_storage, 6, false, 6, SmartTextKeys.TemperatureSensor6); + TryAddTemperatureSensor(_storage, 7, false, 7, SmartTextKeys.TemperatureSensor7); + TryAddTemperatureSensor(_storage, 8, false, 8, SmartTextKeys.TemperatureSensor8); + + if (_storage.TemperatureWarning.HasValue) { - AddSensor("Life", 20, false, SensorType.Level, s => s.Smart.Life.GetValueOrDefault()); + AddSensor("Warning Temperature", 10, false, SensorType.Temperature, s => s.TemperatureWarning.GetValueOrDefault()); } - if (_storage.Smart.HostReads.HasValue) + if (_storage.TemperatureCritical.HasValue) { - AddSensor("Data Read", 21, false, SensorType.Data, s => s.Smart.HostReads.GetValueOrDefault()); + AddSensor("Critical Temperature", 11, false, SensorType.Temperature, s => s.TemperatureCritical.GetValueOrDefault()); } - if (_storage.Smart.HostWrites.HasValue) + if (_storage.Health.HasValue) { - AddSensor("Data Written", 22, false, SensorType.Data, s => s.Smart.HostWrites.GetValueOrDefault()); + AddSensor("Life", 20, false, SensorType.Level, s => s.Health.GetValueOrDefault()); } - AddSensor("Power On Count", 23, false, SensorType.Factor, s => s.Smart.PowerOnCount); - AddSensor("Power On Hours", 24, false, SensorType.Factor, s => Math.Max(s.Smart.MeasuredPowerOnHours, s.Smart.DetectedPowerOnHours)); + if (_storage.HostReads.HasValue) + { + AddSensor("Data Read", 21, false, SensorType.Data, s => s.HostReads.GetValueOrDefault()); + } + + if (_storage.HostWrites.HasValue) + { + AddSensor("Data Written", 22, false, SensorType.Data, s => s.HostWrites.GetValueOrDefault()); + } + + if (_storage.PowerOnCount.HasValue) + { + AddSensor("Power On Count", 23, false, SensorType.Factor, s => s.PowerOnCount.GetValueOrDefault()); + } + + if (_storage.PowerOnHours.HasValue) + { + AddSensor("Power On Hours", 24, false, SensorType.Factor, s => s.PowerOnHours.GetValueOrDefault()); + } _usageSensor = new Sensor("Used Space", 30, SensorType.Load, this, _settings); _freeSpaceSensor = new Sensor("Free Space", 31, SensorType.Data, this, _settings); @@ -214,7 +267,7 @@ public sealed class StorageDevice : Hardware, ISmart var totalSpaceSensor = new Sensor("Total Space", 32, SensorType.Data, this, _settings) { - Value = (float)DataUnitConverter.ToGigaByte(_storage.TotalSize, DataUnit.Byte) + Value = (float)DataUnitConverter.ToGigaByte(_storage.DiskSizeBytes.GetValueOrDefault(), DataUnit.Byte) }; ActivateSensor(totalSpaceSensor); @@ -236,17 +289,18 @@ public sealed class StorageDevice : Hardware, ISmart AddSmartAttributeSensors(); } - private void TryAddTemperatureSensor(int index, bool defaultHidden, int thermalSensorIndex, SmartAttributeType type) + private void TryAddTemperatureSensor(StorageDeviceDIT storage, int index, bool defaultHidden, int thermalSensorIndex, string smartTextKey) { - var attr = GetSmartAttribute(type); - if (attr != null && attr.Attribute.RawValueULong > 0) + var attr = storage.SmartAttributes.FirstOrDefault(a => a.TextKey == smartTextKey); + + if (attr != null && attr.RawValue > 0) { AddSensor($"Temperature #{thermalSensorIndex}", index, defaultHidden, SensorType.Temperature, s => { - var a = GetSmartAttribute(type); + var a = s.SmartAttributes.FirstOrDefault(a => a.TextKey == smartTextKey); if (a != null) { - return TemperatureConverter.KelvinToCelsius(a.Attribute.RawValueULong); + return TemperatureConverter.KelvinToCelsius(a.RawValue); } return 0; @@ -254,11 +308,6 @@ public sealed class StorageDevice : Hardware, ISmart } } - private DiskInfoToolkit.SmartAttribute GetSmartAttribute(SmartAttributeType type) - { - return _storage.Smart.SmartAttributes.FirstOrDefault(sa => sa.Info.Type == type); - } - private void AddSensor(string name, int index, bool defaultHidden, SensorType sensorType, GetStorageDeviceSensorValue getValue) { var sensor = new StorageDeviceSensor(name, index, defaultHidden, sensorType, this, _settings, getValue) @@ -274,7 +323,7 @@ public sealed class StorageDevice : Hardware, ISmart { DISK_PERFORMANCE diskPerformance = new(); - using var handle = PInvoke.CreateFile(_storage.PhysicalPath, + using var handle = PInvoke.CreateFile(_storage.DevicePath, (uint)FileAccess.ReadWrite, FILE_SHARE_MODE.FILE_SHARE_READ | FILE_SHARE_MODE.FILE_SHARE_WRITE, null, @@ -336,11 +385,11 @@ public sealed class StorageDevice : Hardware, ISmart private void UpdateSpaceSensors() { - if (_storage.TotalSize > 0) + if (_storage.DiskSizeBytes > 0) { // Set sensor value - _usageSensor.Value = 100.0f - (100.0f * _storage.TotalFreeSize / _storage.TotalSize); - _freeSpaceSensor.Value = (float)DataUnitConverter.ToGigaByte(_storage.TotalFreeSize.GetValueOrDefault(), DataUnit.Byte); + _usageSensor.Value = 100.0f - (100.0f * _storage.TotalPartitionFreeSpaceBytes / _storage.DiskSizeBytes); + _freeSpaceSensor.Value = (float)DataUnitConverter.ToGigaByte(_storage.TotalPartitionFreeSpaceBytes.GetValueOrDefault(), DataUnit.Byte); } else { diff --git a/LibreHardwareMonitorLib/Hardware/Storage/StorageDeviceSensor.cs b/LibreHardwareMonitorLib/Hardware/Storage/StorageDeviceSensor.cs index b1f8dfe..b04809b 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/StorageDeviceSensor.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/StorageDeviceSensor.cs @@ -4,9 +4,11 @@ // Partial Copyright (C) Michael Möller and Contributors. // All Rights Reserved. +using StorageDeviceDIT = DiskInfoToolkit.StorageDevice; + namespace LibreHardwareMonitor.Hardware.Storage; -internal delegate float GetStorageDeviceSensorValue(DiskInfoToolkit.Storage storage); +internal delegate float GetStorageDeviceSensorValue(StorageDeviceDIT storage); internal class StorageDeviceSensor : Sensor { @@ -18,7 +20,7 @@ internal class StorageDeviceSensor : Sensor _getValue = getValue; } - public void Update(DiskInfoToolkit.Storage storage) + public void Update(StorageDeviceDIT storage) { var value = _getValue(storage); diff --git a/LibreHardwareMonitorLib/Hardware/Storage/StorageGroup.cs b/LibreHardwareMonitorLib/Hardware/Storage/StorageGroup.cs index 64da879..edce57e 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/StorageGroup.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/StorageGroup.cs @@ -7,7 +7,8 @@ using System.Collections.Generic; using System.Linq; using DiskInfoToolkit; -using DiskInfoToolkit.Events; +using StorageDeviceDIT = DiskInfoToolkit.StorageDevice; +using StorageDIT = DiskInfoToolkit.Storage; namespace LibreHardwareMonitor.Hardware.Storage; @@ -34,49 +35,66 @@ internal class StorageGroup : IGroup, IHardwareChanged private void AddHardware(ISettings settings) { - StorageManager.StoragesChanged -= OnStoragesChanged; + StorageDIT.DevicesChanged -= OnStoragesChanged; - //Reload storage devices - StorageManager.ReloadStorages(); + //Get all disks + var disks = StorageDIT.GetDisks(); //Transform storage device to hardware - _hardware.AddRange(StorageManager.Storages.Select(s => new StorageDevice(s, GetID(s), settings))); + _hardware.AddRange(disks.Select(s => new StorageDevice(s, GetID(s), settings))); - StorageManager.StoragesChanged += OnStoragesChanged; + StorageDIT.DevicesChanged += OnStoragesChanged; } - private void OnStoragesChanged(StoragesChangedEventArgs e) + private void OnStoragesChanged(object sender, StorageDevicesChangedEventArgs e) { - StorageDevice storageDevice = null; - - switch (e.StorageChangeIdentifier) + foreach (var added in e.Added) { - case StorageChangeIdentifier.Added: - storageDevice = new StorageDevice(e.Storage, GetID(e.Storage), _settings); + var storageDevice = new StorageDevice(added, GetID(added), _settings); - _hardware.Add(storageDevice); - HardwareAdded?.Invoke(storageDevice); - break; - case StorageChangeIdentifier.Removed: - storageDevice = _hardware.Find(sd => sd.Storage == e.Storage); + _hardware.Add(storageDevice); + HardwareAdded?.Invoke(storageDevice); + } - if (storageDevice != null) - { - _hardware.Remove(storageDevice); - HardwareRemoved?.Invoke(storageDevice); - } - break; + foreach (var removed in e.Removed) + { + var storageDevice = _hardware.Find(sd => sd.Storage == removed); + if (storageDevice != null) + { + _hardware.Remove(storageDevice); + HardwareRemoved?.Invoke(storageDevice); + } } } - private string GetID(DiskInfoToolkit.Storage storage) + private string GetID(StorageDeviceDIT disk) { - if (storage.IsNVMe) - return "nvme"; - else if (storage.IsSSD) - return "ssd"; - else - return "hdd"; + switch (disk.TransportKind) + { + case StorageTransportKind.Ata: + return "ata"; + case StorageTransportKind.Scsi: + return "scsi"; + case StorageTransportKind.Nvme: + return "nvme"; + case StorageTransportKind.Usb: + return "usb"; + case StorageTransportKind.Sd: + return "sd"; + case StorageTransportKind.Mmc: + return "mmc"; + case StorageTransportKind.Raid: + return "raid"; + case StorageTransportKind.Sas: + return "sas"; + case StorageTransportKind.Ahci: + return "ahci"; + case StorageTransportKind.Virtual: + return "virtual"; + case StorageTransportKind.Unknown: + default: + return "disk"; + } } public void Close() { } diff --git a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj index 10de774..d84260e 100644 --- a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj +++ b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj @@ -70,7 +70,7 @@ - + all