From c94cb69ed06a8ca91f47430f821942ae940d0c2b Mon Sep 17 00:00:00 2001 From: Bjarni Ivarsson Date: Thu, 24 Feb 2022 13:36:42 +0100 Subject: [PATCH] More robust detection of samsung nvme drives (#674) Thanks to @bjarniivarsson --- .../Hardware/Storage/NVMeSamsung.cs | 13 ++++++++++--- .../Hardware/Storage/NVMeSmart.cs | 14 ++------------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Storage/NVMeSamsung.cs b/LibreHardwareMonitorLib/Hardware/Storage/NVMeSamsung.cs index 0f17340..235c4d4 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/NVMeSamsung.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/NVMeSamsung.cs @@ -4,6 +4,7 @@ // All Rights Reserved. using System; +using System.Linq; using System.Runtime.InteropServices; using LibreHardwareMonitor.Interop; @@ -237,15 +238,21 @@ namespace LibreHardwareMonitor.Hardware.Storage validTransfer = Kernel32.DeviceIoControl(handle, Kernel32.IOCTL.IOCTL_SCSI_PASS_THROUGH, buffer, length, buffer, length, out _, IntPtr.Zero); if (validTransfer) { - Marshal.PtrToStructure(buffer); - Marshal.FreeHGlobal(buffer); + var result = Marshal.PtrToStructure(buffer); + + if (result.DataBuf.Sum(x => (long)x) == 0) + { + handle.Close(); + handle = null; + } } else { - Marshal.FreeHGlobal(buffer); handle.Close(); handle = null; } + + Marshal.FreeHGlobal(buffer); } return handle; diff --git a/LibreHardwareMonitorLib/Hardware/Storage/NVMeSmart.cs b/LibreHardwareMonitorLib/Hardware/Storage/NVMeSmart.cs index 3f4274d..6acca9f 100644 --- a/LibreHardwareMonitorLib/Hardware/Storage/NVMeSmart.cs +++ b/LibreHardwareMonitorLib/Hardware/Storage/NVMeSmart.cs @@ -19,20 +19,10 @@ namespace LibreHardwareMonitor.Hardware.Storage { _driveNumber = storageInfo.Index; NVMeDrive = null; - - // Test samsung protocol. - - // Exclude Samsung 980 Pro and PM9A1, these use the NVMeWindows generic protocol. - // Samsung 980 Pro can accessed via IdentifyDevice and IdentifyController but not by HealthInfoLog. string name = storageInfo.Name; - if (NVMeDrive == null && - name.IndexOf("Samsung", StringComparison.OrdinalIgnoreCase) > -1 && - name.IndexOf("980 Pro", StringComparison.OrdinalIgnoreCase) == -1 && - name.IndexOf("MZVL2256HCHQ", StringComparison.OrdinalIgnoreCase) == -1 && - name.IndexOf("MZVL2512HCJQ", StringComparison.OrdinalIgnoreCase) == -1 && - name.IndexOf("MZVL21T0HCLR", StringComparison.OrdinalIgnoreCase) == -1 && - name.IndexOf("MZVL22T0HBLB", StringComparison.OrdinalIgnoreCase) == -1) + // Test Samsung protocol. + if (NVMeDrive == null && name.IndexOf("Samsung", StringComparison.OrdinalIgnoreCase) > -1) { _handle = NVMeSamsung.IdentifyDevice(storageInfo); if (_handle != null)