Skip to content

Commit 9cefa1c

Browse files
authored
Samsung NVME now being detected properly. (#1762)
1 parent 25c5a6b commit 9cefa1c

2 files changed

Lines changed: 12 additions & 11 deletions

File tree

LibreHardwareMonitorLib/Hardware/Storage/NVMeSamsung.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
3636
buffers.Spt.TargetId = 0;
3737
buffers.Spt.Lun = 0;
3838
buffers.Spt.SenseInfoLength = 24;
39+
buffers.Spt.DataIn = 1;
3940
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
4041
buffers.Spt.TimeOutValue = 2;
4142
buffers.Spt.DataBufferOffset = Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
4243
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
44+
4345
buffers.Spt.CdbLength = 16;
4446
buffers.Spt.Cdb[0] = 0xB5; // SECURITY PROTOCOL IN
4547
buffers.Spt.Cdb[1] = 0xFE; // Samsung Protocol
@@ -49,7 +51,7 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
4951
buffers.Spt.DataIn = (byte)Kernel32.SCSI_IOCTL_DATA.SCSI_IOCTL_DATA_OUT;
5052
buffers.DataBuf[0] = 1;
5153

52-
int length = Marshal.SizeOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>();
54+
int length = (int)(Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf)).ToInt32() + buffers.Spt.DataTransferLength);
5355
IntPtr buffer = Marshal.AllocHGlobal(length);
5456
Marshal.StructureToPtr(buffers, buffer, false);
5557
bool validTransfer = Kernel32.DeviceIoControl(hDevice, Kernel32.IOCTL.IOCTL_SCSI_PASS_THROUGH, buffer, length, buffer, length, out _, IntPtr.Zero);
@@ -65,34 +67,35 @@ public bool IdentifyController(SafeHandle hDevice, out Kernel32.NVME_IDENTIFY_CO
6567
buffers.Spt.Lun = 0;
6668
buffers.Spt.SenseInfoLength = 24;
6769
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
70+
buffers.Spt.DataIn = 1;
6871
buffers.Spt.TimeOutValue = 2;
6972
buffers.Spt.DataBufferOffset = Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
7073
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
74+
7175
buffers.Spt.CdbLength = 16;
7276
buffers.Spt.Cdb[0] = 0xA2; // SECURITY PROTOCOL IN
7377
buffers.Spt.Cdb[1] = 0xFE; // Samsung Protocol
7478
buffers.Spt.Cdb[3] = 5; // Identify
75-
buffers.Spt.Cdb[8] = 2; // Transfer Length (high)
79+
buffers.Spt.Cdb[8] = 1; // Transfer Length (high)
7680
buffers.Spt.Cdb[9] = 0; // Transfer Length (low)
7781
buffers.Spt.DataIn = (byte)Kernel32.SCSI_IOCTL_DATA.SCSI_IOCTL_DATA_IN;
7882

79-
length = Marshal.SizeOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>();
8083
buffer = Marshal.AllocHGlobal(length);
8184
Marshal.StructureToPtr(buffers, buffer, false);
8285

8386
validTransfer = Kernel32.DeviceIoControl(hDevice, Kernel32.IOCTL.IOCTL_SCSI_PASS_THROUGH, buffer, length, buffer, length, out _, IntPtr.Zero);
87+
88+
buffers = Marshal.PtrToStructure<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(buffer);
89+
8490
if (validTransfer && buffers.DataBuf.Any(x => x != 0))
8591
{
8692
IntPtr offset = Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
8793
IntPtr newPtr = IntPtr.Add(buffer, offset.ToInt32());
8894
data = Marshal.PtrToStructure<Kernel32.NVME_IDENTIFY_CONTROLLER_DATA>(newPtr);
89-
Marshal.FreeHGlobal(buffer);
9095
result = true;
9196
}
92-
else
93-
{
94-
Marshal.FreeHGlobal(buffer);
95-
}
97+
98+
Marshal.FreeHGlobal(buffer);
9699
}
97100

98101
return result;

LibreHardwareMonitorLib/Interop/Kernel32.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,9 +1009,7 @@ internal struct SCSI_PASS_THROUGH_WITH_BUFFERS
10091009
{
10101010
public SCSI_PASS_THROUGH Spt;
10111011

1012-
public uint Filler;
1013-
1014-
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
1012+
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
10151013
public byte[] SenseBuf;
10161014

10171015
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)]

0 commit comments

Comments
 (0)