Fix buffer over-read causing AccessViolationException in NVMeSamsung (#160)
This commit is contained in:
@@ -34,7 +34,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
@@ -62,7 +62,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
@@ -111,7 +111,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
@@ -143,7 +143,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf<Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS>(nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
@@ -192,7 +192,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
@@ -220,7 +220,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
|
||||
buffers.Spt.TargetId = 0;
|
||||
buffers.Spt.Lun = 0;
|
||||
buffers.Spt.SenseInfoLength = 24;
|
||||
buffers.Spt.DataTransferLength = Kernel32.SCSI_PASS_THROUGH_BUFFER_SIZE;
|
||||
buffers.Spt.DataTransferLength = (uint)buffers.DataBuf.Length;
|
||||
buffers.Spt.TimeOutValue = 2;
|
||||
buffers.Spt.DataBufferOffset = Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.DataBuf));
|
||||
buffers.Spt.SenseInfoOffset = (uint)Marshal.OffsetOf(typeof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS), nameof(Kernel32.SCSI_PASS_THROUGH_WITH_BUFFERS.SenseBuf));
|
||||
|
||||
@@ -22,7 +22,6 @@ namespace LibreHardwareMonitor.Interop
|
||||
|
||||
internal const int MAX_DRIVE_ATTRIBUTES = 512;
|
||||
internal const uint NVME_PASS_THROUGH_SRB_IO_CODE = 0xe0002000;
|
||||
internal const int SCSI_PASS_THROUGH_BUFFER_SIZE = 512;
|
||||
internal const byte SMART_LBA_HI = 0xC2;
|
||||
internal const byte SMART_LBA_MID = 0x4F;
|
||||
private const string DllName = "kernel32.dll";
|
||||
@@ -728,7 +727,7 @@ namespace LibreHardwareMonitor.Interop
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] SenseBuf;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = SCSI_PASS_THROUGH_BUFFER_SIZE)]
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)]
|
||||
public byte[] DataBuf;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user