Files
ReLibreHardwareMonitor/LibreHardwareMonitorLib/Interop/AtaSmart.cs
T
2025-10-01 10:42:01 +02:00

102 lines
3.4 KiB
C#

// 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.
// All Rights Reserved.
using System.Runtime.InteropServices;
using Windows.Win32.Storage.IscsiDisc;
// ReSharper disable InconsistentNaming
namespace LibreHardwareMonitor.Interop;
public unsafe class AtaSmart
{
internal const int IOCTL_BUFFER_SIZE = 4096;
internal const int SCSI_IOCTL_SENSE_SIZE = 24;
internal const int NVME_IOCTL_CMD_DW_SIZE = 16;
internal const int NVME_IOCTL_COMPLETE_DW_SIZE = 4;
internal const int NVME_IOCTL_VENDOR_SPECIFIC_DW_SIZE = 6;
internal const int NVME_DATA_OUT = 1;
internal const int NVME_DATA_IN = 2;
internal const uint NVME_PASS_THROUGH_SRB_IO_CODE = 0xe0002000;
internal const byte SMART_LBA_HI = 0xC2;
internal const byte SMART_LBA_MID = 0x4F;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SMART_ATTRIBUTE
{
internal byte Id;
internal ushort Flags;
internal byte CurrentValue;
internal byte WorstValue;
internal fixed byte RawValue[6];
internal byte Reserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SMART_THRESHOLD
{
public byte Id;
public byte Threshold;
public fixed byte Reserved[10];
}
internal struct IDENTIFY_DEVICE_DATA
{
public ushort GeneralConfiguration;
public ushort NumberOfCylinders;
public ushort Reserved1;
public ushort NumberOfHeads;
public ushort UnformattedBytesPerTrack;
public ushort UnformattedBytesPerSector;
public ushort SectorsPerTrack;
public fixed ushort VendorUnique[3];
public fixed byte SerialNumber[20];
public ushort BufferType;
public ushort BufferSectorSize;
public ushort NumberOfEccBytes;
public fixed byte FirmwareRevision[8];
public fixed byte ModelNumber[40];
public byte MaximumBlockTransfer;
public byte VendorUnique2;
public ushort DoubleWordIo;
public ushort Capabilities;
public ushort Reserved2;
public byte VendorUnique3;
public byte PioCycleTimingMode;
public byte VendorUnique4;
public byte DmaCycleTimingMode;
public ushort TranslationFieldsValid;
public ushort NumberOfCurrentCylinders;
public ushort NumberOfCurrentHeads;
public ushort CurrentSectorsPerTrack;
public uint CurrentSectorCapacity;
public fixed ushort Reserved3[197];
}
internal struct NVME_PASS_THROUGH_IOCTL
{
public SRB_IO_CONTROL SrbIoCtrl;
public fixed uint VendorSpecific[NVME_IOCTL_VENDOR_SPECIFIC_DW_SIZE];
public fixed uint NVMeCmd[NVME_IOCTL_CMD_DW_SIZE];
public fixed uint CplEntry[NVME_IOCTL_COMPLETE_DW_SIZE];
public uint Direction;
public uint QueueId;
public uint DataBufferLen;
public uint MetaDataLen;
public uint ReturnBufferLen;
public fixed byte DataBuffer[IOCTL_BUFFER_SIZE];
}
internal struct SCSI_PASS_THROUGH
{
public Windows.Win32.Storage.IscsiDisc.SCSI_PASS_THROUGH Spt;
public fixed byte SenseBuf[SCSI_IOCTL_SENSE_SIZE];
public fixed byte DataBuf[IOCTL_BUFFER_SIZE];
}
}