NVME_HEALTH_INFO_LOG
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| CriticalWarning | _CriticalWarning_e__Union | 8/4 | +0 | +0 | コントローラーの状態に関する重大な警告を示すフィールドを格納する Critical Warning (CriticalWarning) 構造体です。 CriticalWarning 構造体の各フィールドは、重大な警告の種類に対応するビットです。複数のビットが設定される場合があります。ビットが 重大な警告は、ホストへの非同期イベント通知を発生させる場合があります。 |
| Temperature | BYTE | 2 | +8 | +4 | コントローラーと NVM サブシステムを含むデバイス全体の複合温度を、ケルビン単位で示します。 このフィールドの温度が温度しきい値を超えた場合、非同期イベント完了が発生することがあります。詳細については、NVME_CDW11_FEATURE_TEMPERATURE_THRESHOLD を参照してください。 警告および重大な過熱を示す複合温度しきい値は、Identify Controller データ構造の WCTEMP フィールドおよび CCTEMP フィールドによって報告されます。 |
| AvailableSpare | BYTE | 1 | +10 | +6 | 残りの利用可能な予備容量を、正規化された割合 (0 から 100) で示します。 |
| AvailableSpareThreshold | BYTE | 1 | +11 | +7 | 利用可能な予備容量のしきい値を示します。 AvailableSpare の値がこのフィールドで示されるしきい値を下回った場合、非同期イベント完了が発生することがあります。値は正規化された割合 (0 から 100) で示されます。 |
| PercentageUsed | BYTE | 1 | +12 | +8 | 実際の使用状況と製造元による NVM 寿命の予測に基づく、使用済みの NVM サブシステム寿命の割合のベンダー固有の推定値を示します。 値が 100 の場合は、NVM サブシステム内の NVM の推定耐久性が消費されたことを示しますが、NVM サブシステムの障害を示すとは限りません。この値は 100 を超えることが許容されます。254 を超える割合は 255 として表されます。この値は、電源投入時間 1 時間ごとに 1 回更新されます (コントローラーがスリープ状態でない場合)。 |
| Reserved0 | BYTE | 26 | +13 | +9 | 予約済みのフィールドです。 |
| DataUnitRead | BYTE | 16 | +39 | +35 | ホストがコントローラーから読み取った 512 バイトのデータ単位の数を示します (メタデータは含みません)。 このフィールドの値は 1000 単位で報告され、切り上げられます。たとえば、値 1 は 512 バイト読み取りの 1000 単位に相当します。論理ブロックアクセス (LBA) のサイズが 512 バイト以外の場合、コントローラーは読み取ったデータ量を 512 バイト単位に換算します。 NVM コマンドセットでは、Compare 操作および Read 操作の一部として読み取られた論理ブロックがこの値に含まれます。 |
| DataUnitWritten | BYTE | 16 | +55 | +51 | ホストがコントローラーに書き込んだ 512 バイトのデータ単位の数を示します (メタデータは含みません)。 このフィールドの値は 1000 単位で報告され、切り上げられます。たとえば、値 1 は 512 バイトの 1000 単位に相当します。論理ブロックアクセス (LBA) のサイズが 512 バイト以外の場合、コントローラーは書き込んだデータ量を 512 バイト単位に換算します。 NVM コマンドセットでは、Write 操作の一部として書き込まれた論理ブロックがこの値に含まれます。Write Uncorrectable コマンドはこの値に影響しません。 |
| HostReadCommands | BYTE | 16 | +71 | +67 | コントローラーが完了した Read コマンドの数を示します。 NVM コマンドセットでは、これは Compare コマンドおよび Read コマンドの数です。 |
| HostWrittenCommands | BYTE | 16 | +87 | +83 | コントローラーが完了した Write コマンドの数を示します。 NVM コマンドセットでは、これは Write コマンドの数です。 |
| ControllerBusyTime | BYTE | 16 | +103 | +99 | コントローラーが I/O コマンドでビジー状態である時間を、分単位で示します。 コントローラーは、I/O キューに対して未処理のコマンドがある場合にビジー状態となります。具体的には、I/O Submission Queue Tail doorbell への書き込みによってコマンドが発行され、対応する完了キューエントリがまだ関連付けられた I/O 完了キューにポストされていない場合です。 |
| PowerCycle | BYTE | 16 | +119 | +115 | 電源サイクルの回数を示します。 |
| PowerOnHours | BYTE | 16 | +135 | +131 | 電源投入時間 (時間単位) を示します。これには、コントローラーに電源が供給された状態で低電力状態にあった時間は含まれません。 |
| UnsafeShutdowns | BYTE | 16 | +151 | +147 | 安全でないシャットダウンの回数を示します。このカウントは、Controller Configuration の SHN フィールドで示されるシャットダウン通知が、電源喪失より前に受信されなかった場合に加算されます。 |
| MediaErrors | BYTE | 16 | +167 | +163 | コントローラーが回復不能なデータ整合性エラーを検出した回数を示します。 訂正不能な ECC、CRC チェックサムの失敗、LBA タグの不一致などの Media Errors が、このフィールドに含まれます。 |
| ErrorInfoLogEntryCount | BYTE | 16 | +183 | +179 | コントローラーの寿命全体にわたる Error Information ログエントリの数を示します。 |
| WarningCompositeTemperatureTime | DWORD | 4 | +200 | +196 | コントローラーが動作中であり、かつ Composite Temperature (Temperature) が Identify Controller データ構造の Warning Composite Temperature Threshold (WCTEMP) フィールド以上、かつ Critical Composite Temperature Threshold (CCTEMP) フィールド未満である時間を、分単位で示します。 WCTEMP フィールドまたは CCTEMP フィールドの値が |
| CriticalCompositeTemperatureTime | DWORD | 4 | +204 | +200 | コントローラーが動作中であり、かつ Composite Temperature (Temperature) が Identify Controller データ構造の Critical Composite Temperature Threshold (CCTEMP) フィールドを超えている時間を、分単位で示します。 CCTEMP フィールドの値が |
| TemperatureSensor1 | WORD | 2 | +208 | +204 | 温度センサー 1 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor2 | WORD | 2 | +210 | +206 | 温度センサー 2 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor3 | WORD | 2 | +212 | +208 | 温度センサー 3 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor4 | WORD | 2 | +214 | +210 | 温度センサー 4 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor5 | WORD | 2 | +216 | +212 | 温度センサー 5 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor6 | WORD | 2 | +218 | +214 | 温度センサー 6 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor7 | WORD | 2 | +220 | +216 | 温度センサー 7 が報告する現在の温度を、ケルビン単位で示します。 |
| TemperatureSensor8 | WORD | 2 | +222 | +218 | 温度センサー 8 が報告する現在の温度を、ケルビン単位で示します。 |
| Reserved1 | BYTE | 296 | +224 | +220 | 予約済みのフィールドです。 |
共用体: _CriticalWarning_e__Union x64 8B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 |
|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 |
| AsUchar | BYTE | 1 | +0 | +0 |
公式ドキュメント
SMART / ヘルス情報ログページに含まれる情報を指定するフィールドを格納します。
SMART / ヘルス情報ログページは、コントローラーの寿命全体にわたる SMART および一般的な健全性情報を提供し、これらの情報は電源サイクルをまたいで保持されます。このログページはグローバル単位でサポートされます。グローバルなログページを要求するには、名前空間として FFFFFFFFh を指定します。
SMART / ヘルス情報ログページは、Identify Controller データ構造で示されるとおり、名前空間ごとにサポートされる場合もあります。ログページが名前空間ごとにサポートされていない場合、FFFFFFFFh 以外の名前空間を指定すると、コマンドは NVME_STATUS_INVALID_FIELD_IN_COMMAND のステータスで中止されます。NVMe バージョン 1.3 では、SMART / ヘルスログページに名前空間固有の情報は定義されていないため、グローバルなログページと名前空間固有のログページは同一の情報を格納します。
NVM サブシステムの健全性に関する重大な警告は、ホストへの非同期イベント通知によって示されます。ホストへの非同期イベント通知を発生させる警告は、Set Features command を使用して構成します。
パフォーマンスは、SMART / ヘルス情報ログの一部として返されるパラメーターを使用して計算できます。具体的には、Read コマンドまたは Write コマンドの数、読み取りまたは書き込みされたデータ量、およびコントローラーのビジー時間により、1 秒あたりの I/O 数と帯域幅の両方を計算できます。
NVME_HEALTH_INFO_LOG 構造体は Get Log Page コマンドによって返されます。詳細については、NVME_CDW10_GET_LOG_PAGE を参照してください。
解説(Remarks)
温度センサーが報告する温度は、非同期イベントのトリガーとして使用される場合があります。詳細については、NVME_CDW11_FEATURE_TEMPERATURE_THRESHOLD を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// NVME_HEALTH_INFO_LOG (x64 520 / x86 516 バイト)
typedef struct NVME_HEALTH_INFO_LOG {
_CriticalWarning_e__Union CriticalWarning;
BYTE Temperature[2];
BYTE AvailableSpare;
BYTE AvailableSpareThreshold;
BYTE PercentageUsed;
BYTE Reserved0[26];
BYTE DataUnitRead[16];
BYTE DataUnitWritten[16];
BYTE HostReadCommands[16];
BYTE HostWrittenCommands[16];
BYTE ControllerBusyTime[16];
BYTE PowerCycle[16];
BYTE PowerOnHours[16];
BYTE UnsafeShutdowns[16];
BYTE MediaErrors[16];
BYTE ErrorInfoLogEntryCount[16];
DWORD WarningCompositeTemperatureTime;
DWORD CriticalCompositeTemperatureTime;
WORD TemperatureSensor1;
WORD TemperatureSensor2;
WORD TemperatureSensor3;
WORD TemperatureSensor4;
WORD TemperatureSensor5;
WORD TemperatureSensor6;
WORD TemperatureSensor7;
WORD TemperatureSensor8;
BYTE Reserved1[296];
} NVME_HEALTH_INFO_LOG;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_HEALTH_INFO_LOG
{
public _CriticalWarning_e__Union CriticalWarning;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Temperature;
public byte AvailableSpare;
public byte AvailableSpareThreshold;
public byte PercentageUsed;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] public byte[] Reserved0;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] DataUnitRead;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] DataUnitWritten;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] HostReadCommands;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] HostWrittenCommands;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] ControllerBusyTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] PowerCycle;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] PowerOnHours;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] UnsafeShutdowns;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] MediaErrors;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] ErrorInfoLogEntryCount;
public uint WarningCompositeTemperatureTime;
public uint CriticalCompositeTemperatureTime;
public ushort TemperatureSensor1;
public ushort TemperatureSensor2;
public ushort TemperatureSensor3;
public ushort TemperatureSensor4;
public ushort TemperatureSensor5;
public ushort TemperatureSensor6;
public ushort TemperatureSensor7;
public ushort TemperatureSensor8;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 296)] public byte[] Reserved1;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_HEALTH_INFO_LOG
Public CriticalWarning As _CriticalWarning_e__Union
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Temperature() As Byte
Public AvailableSpare As Byte
Public AvailableSpareThreshold As Byte
Public PercentageUsed As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=26)> Public Reserved0() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public DataUnitRead() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public DataUnitWritten() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public HostReadCommands() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public HostWrittenCommands() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public ControllerBusyTime() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public PowerCycle() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public PowerOnHours() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public UnsafeShutdowns() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public MediaErrors() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public ErrorInfoLogEntryCount() As Byte
Public WarningCompositeTemperatureTime As UInteger
Public CriticalCompositeTemperatureTime As UInteger
Public TemperatureSensor1 As UShort
Public TemperatureSensor2 As UShort
Public TemperatureSensor3 As UShort
Public TemperatureSensor4 As UShort
Public TemperatureSensor5 As UShort
Public TemperatureSensor6 As UShort
Public TemperatureSensor7 As UShort
Public TemperatureSensor8 As UShort
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=296)> Public Reserved1() As Byte
End Structureimport ctypes
from ctypes import wintypes
class NVME_HEALTH_INFO_LOG(ctypes.Structure):
_fields_ = [
("CriticalWarning", _CriticalWarning_e__Union),
("Temperature", ctypes.c_ubyte * 2),
("AvailableSpare", ctypes.c_ubyte),
("AvailableSpareThreshold", ctypes.c_ubyte),
("PercentageUsed", ctypes.c_ubyte),
("Reserved0", ctypes.c_ubyte * 26),
("DataUnitRead", ctypes.c_ubyte * 16),
("DataUnitWritten", ctypes.c_ubyte * 16),
("HostReadCommands", ctypes.c_ubyte * 16),
("HostWrittenCommands", ctypes.c_ubyte * 16),
("ControllerBusyTime", ctypes.c_ubyte * 16),
("PowerCycle", ctypes.c_ubyte * 16),
("PowerOnHours", ctypes.c_ubyte * 16),
("UnsafeShutdowns", ctypes.c_ubyte * 16),
("MediaErrors", ctypes.c_ubyte * 16),
("ErrorInfoLogEntryCount", ctypes.c_ubyte * 16),
("WarningCompositeTemperatureTime", wintypes.DWORD),
("CriticalCompositeTemperatureTime", wintypes.DWORD),
("TemperatureSensor1", ctypes.c_ushort),
("TemperatureSensor2", ctypes.c_ushort),
("TemperatureSensor3", ctypes.c_ushort),
("TemperatureSensor4", ctypes.c_ushort),
("TemperatureSensor5", ctypes.c_ushort),
("TemperatureSensor6", ctypes.c_ushort),
("TemperatureSensor7", ctypes.c_ushort),
("TemperatureSensor8", ctypes.c_ushort),
("Reserved1", ctypes.c_ubyte * 296),
]#[repr(C)]
pub struct NVME_HEALTH_INFO_LOG {
pub CriticalWarning: _CriticalWarning_e__Union,
pub Temperature: [u8; 2],
pub AvailableSpare: u8,
pub AvailableSpareThreshold: u8,
pub PercentageUsed: u8,
pub Reserved0: [u8; 26],
pub DataUnitRead: [u8; 16],
pub DataUnitWritten: [u8; 16],
pub HostReadCommands: [u8; 16],
pub HostWrittenCommands: [u8; 16],
pub ControllerBusyTime: [u8; 16],
pub PowerCycle: [u8; 16],
pub PowerOnHours: [u8; 16],
pub UnsafeShutdowns: [u8; 16],
pub MediaErrors: [u8; 16],
pub ErrorInfoLogEntryCount: [u8; 16],
pub WarningCompositeTemperatureTime: u32,
pub CriticalCompositeTemperatureTime: u32,
pub TemperatureSensor1: u16,
pub TemperatureSensor2: u16,
pub TemperatureSensor3: u16,
pub TemperatureSensor4: u16,
pub TemperatureSensor5: u16,
pub TemperatureSensor6: u16,
pub TemperatureSensor7: u16,
pub TemperatureSensor8: u16,
pub Reserved1: [u8; 296],
}import "golang.org/x/sys/windows"
type NVME_HEALTH_INFO_LOG struct {
CriticalWarning _CriticalWarning_e__Union
Temperature [2]byte
AvailableSpare byte
AvailableSpareThreshold byte
PercentageUsed byte
Reserved0 [26]byte
DataUnitRead [16]byte
DataUnitWritten [16]byte
HostReadCommands [16]byte
HostWrittenCommands [16]byte
ControllerBusyTime [16]byte
PowerCycle [16]byte
PowerOnHours [16]byte
UnsafeShutdowns [16]byte
MediaErrors [16]byte
ErrorInfoLogEntryCount [16]byte
WarningCompositeTemperatureTime uint32
CriticalCompositeTemperatureTime uint32
TemperatureSensor1 uint16
TemperatureSensor2 uint16
TemperatureSensor3 uint16
TemperatureSensor4 uint16
TemperatureSensor5 uint16
TemperatureSensor6 uint16
TemperatureSensor7 uint16
TemperatureSensor8 uint16
Reserved1 [296]byte
}type
NVME_HEALTH_INFO_LOG = record
CriticalWarning: _CriticalWarning_e__Union;
Temperature: array[0..1] of Byte;
AvailableSpare: Byte;
AvailableSpareThreshold: Byte;
PercentageUsed: Byte;
Reserved0: array[0..25] of Byte;
DataUnitRead: array[0..15] of Byte;
DataUnitWritten: array[0..15] of Byte;
HostReadCommands: array[0..15] of Byte;
HostWrittenCommands: array[0..15] of Byte;
ControllerBusyTime: array[0..15] of Byte;
PowerCycle: array[0..15] of Byte;
PowerOnHours: array[0..15] of Byte;
UnsafeShutdowns: array[0..15] of Byte;
MediaErrors: array[0..15] of Byte;
ErrorInfoLogEntryCount: array[0..15] of Byte;
WarningCompositeTemperatureTime: DWORD;
CriticalCompositeTemperatureTime: DWORD;
TemperatureSensor1: Word;
TemperatureSensor2: Word;
TemperatureSensor3: Word;
TemperatureSensor4: Word;
TemperatureSensor5: Word;
TemperatureSensor6: Word;
TemperatureSensor7: Word;
TemperatureSensor8: Word;
Reserved1: array[0..295] of Byte;
end;const NVME_HEALTH_INFO_LOG = extern struct {
CriticalWarning: _CriticalWarning_e__Union,
Temperature: [2]u8,
AvailableSpare: u8,
AvailableSpareThreshold: u8,
PercentageUsed: u8,
Reserved0: [26]u8,
DataUnitRead: [16]u8,
DataUnitWritten: [16]u8,
HostReadCommands: [16]u8,
HostWrittenCommands: [16]u8,
ControllerBusyTime: [16]u8,
PowerCycle: [16]u8,
PowerOnHours: [16]u8,
UnsafeShutdowns: [16]u8,
MediaErrors: [16]u8,
ErrorInfoLogEntryCount: [16]u8,
WarningCompositeTemperatureTime: u32,
CriticalCompositeTemperatureTime: u32,
TemperatureSensor1: u16,
TemperatureSensor2: u16,
TemperatureSensor3: u16,
TemperatureSensor4: u16,
TemperatureSensor5: u16,
TemperatureSensor6: u16,
TemperatureSensor7: u16,
TemperatureSensor8: u16,
Reserved1: [296]u8,
};type
NVME_HEALTH_INFO_LOG {.bycopy.} = object
CriticalWarning: _CriticalWarning_e__Union
Temperature: array[2, uint8]
AvailableSpare: uint8
AvailableSpareThreshold: uint8
PercentageUsed: uint8
Reserved0: array[26, uint8]
DataUnitRead: array[16, uint8]
DataUnitWritten: array[16, uint8]
HostReadCommands: array[16, uint8]
HostWrittenCommands: array[16, uint8]
ControllerBusyTime: array[16, uint8]
PowerCycle: array[16, uint8]
PowerOnHours: array[16, uint8]
UnsafeShutdowns: array[16, uint8]
MediaErrors: array[16, uint8]
ErrorInfoLogEntryCount: array[16, uint8]
WarningCompositeTemperatureTime: uint32
CriticalCompositeTemperatureTime: uint32
TemperatureSensor1: uint16
TemperatureSensor2: uint16
TemperatureSensor3: uint16
TemperatureSensor4: uint16
TemperatureSensor5: uint16
TemperatureSensor6: uint16
TemperatureSensor7: uint16
TemperatureSensor8: uint16
Reserved1: array[296, uint8]struct NVME_HEALTH_INFO_LOG
{
_CriticalWarning_e__Union CriticalWarning;
ubyte[2] Temperature;
ubyte AvailableSpare;
ubyte AvailableSpareThreshold;
ubyte PercentageUsed;
ubyte[26] Reserved0;
ubyte[16] DataUnitRead;
ubyte[16] DataUnitWritten;
ubyte[16] HostReadCommands;
ubyte[16] HostWrittenCommands;
ubyte[16] ControllerBusyTime;
ubyte[16] PowerCycle;
ubyte[16] PowerOnHours;
ubyte[16] UnsafeShutdowns;
ubyte[16] MediaErrors;
ubyte[16] ErrorInfoLogEntryCount;
uint WarningCompositeTemperatureTime;
uint CriticalCompositeTemperatureTime;
ushort TemperatureSensor1;
ushort TemperatureSensor2;
ushort TemperatureSensor3;
ushort TemperatureSensor4;
ushort TemperatureSensor5;
ushort TemperatureSensor6;
ushort TemperatureSensor7;
ushort TemperatureSensor8;
ubyte[296] Reserved1;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; NVME_HEALTH_INFO_LOG サイズ: 516 バイト(x86)
dim st, 129 ; 4byte整数×129(構造体サイズ 516 / 4 切り上げ)
; CriticalWarning : _CriticalWarning_e__Union (+0, 4byte) varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; Temperature : BYTE (+4, 2byte) varptr(st)+4 を基点に操作(2byte:入れ子/配列)
; AvailableSpare : BYTE (+6, 1byte) poke st,6,値 / 値 = peek(st,6)
; AvailableSpareThreshold : BYTE (+7, 1byte) poke st,7,値 / 値 = peek(st,7)
; PercentageUsed : BYTE (+8, 1byte) poke st,8,値 / 値 = peek(st,8)
; Reserved0 : BYTE (+9, 26byte) varptr(st)+9 を基点に操作(26byte:入れ子/配列)
; DataUnitRead : BYTE (+35, 16byte) varptr(st)+35 を基点に操作(16byte:入れ子/配列)
; DataUnitWritten : BYTE (+51, 16byte) varptr(st)+51 を基点に操作(16byte:入れ子/配列)
; HostReadCommands : BYTE (+67, 16byte) varptr(st)+67 を基点に操作(16byte:入れ子/配列)
; HostWrittenCommands : BYTE (+83, 16byte) varptr(st)+83 を基点に操作(16byte:入れ子/配列)
; ControllerBusyTime : BYTE (+99, 16byte) varptr(st)+99 を基点に操作(16byte:入れ子/配列)
; PowerCycle : BYTE (+115, 16byte) varptr(st)+115 を基点に操作(16byte:入れ子/配列)
; PowerOnHours : BYTE (+131, 16byte) varptr(st)+131 を基点に操作(16byte:入れ子/配列)
; UnsafeShutdowns : BYTE (+147, 16byte) varptr(st)+147 を基点に操作(16byte:入れ子/配列)
; MediaErrors : BYTE (+163, 16byte) varptr(st)+163 を基点に操作(16byte:入れ子/配列)
; ErrorInfoLogEntryCount : BYTE (+179, 16byte) varptr(st)+179 を基点に操作(16byte:入れ子/配列)
; WarningCompositeTemperatureTime : DWORD (+196, 4byte) st.49 = 値 / 値 = st.49 (lpoke/lpeek も可)
; CriticalCompositeTemperatureTime : DWORD (+200, 4byte) st.50 = 値 / 値 = st.50 (lpoke/lpeek も可)
; TemperatureSensor1 : WORD (+204, 2byte) wpoke st,204,値 / 値 = wpeek(st,204)
; TemperatureSensor2 : WORD (+206, 2byte) wpoke st,206,値 / 値 = wpeek(st,206)
; TemperatureSensor3 : WORD (+208, 2byte) wpoke st,208,値 / 値 = wpeek(st,208)
; TemperatureSensor4 : WORD (+210, 2byte) wpoke st,210,値 / 値 = wpeek(st,210)
; TemperatureSensor5 : WORD (+212, 2byte) wpoke st,212,値 / 値 = wpeek(st,212)
; TemperatureSensor6 : WORD (+214, 2byte) wpoke st,214,値 / 値 = wpeek(st,214)
; TemperatureSensor7 : WORD (+216, 2byte) wpoke st,216,値 / 値 = wpeek(st,216)
; TemperatureSensor8 : WORD (+218, 2byte) wpoke st,218,値 / 値 = wpeek(st,218)
; Reserved1 : BYTE (+220, 296byte) varptr(st)+220 を基点に操作(296byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_HEALTH_INFO_LOG サイズ: 520 バイト(x64)
dim st, 130 ; 4byte整数×130(構造体サイズ 520 / 4 切り上げ)
; CriticalWarning : _CriticalWarning_e__Union (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Temperature : BYTE (+8, 2byte) varptr(st)+8 を基点に操作(2byte:入れ子/配列)
; AvailableSpare : BYTE (+10, 1byte) poke st,10,値 / 値 = peek(st,10)
; AvailableSpareThreshold : BYTE (+11, 1byte) poke st,11,値 / 値 = peek(st,11)
; PercentageUsed : BYTE (+12, 1byte) poke st,12,値 / 値 = peek(st,12)
; Reserved0 : BYTE (+13, 26byte) varptr(st)+13 を基点に操作(26byte:入れ子/配列)
; DataUnitRead : BYTE (+39, 16byte) varptr(st)+39 を基点に操作(16byte:入れ子/配列)
; DataUnitWritten : BYTE (+55, 16byte) varptr(st)+55 を基点に操作(16byte:入れ子/配列)
; HostReadCommands : BYTE (+71, 16byte) varptr(st)+71 を基点に操作(16byte:入れ子/配列)
; HostWrittenCommands : BYTE (+87, 16byte) varptr(st)+87 を基点に操作(16byte:入れ子/配列)
; ControllerBusyTime : BYTE (+103, 16byte) varptr(st)+103 を基点に操作(16byte:入れ子/配列)
; PowerCycle : BYTE (+119, 16byte) varptr(st)+119 を基点に操作(16byte:入れ子/配列)
; PowerOnHours : BYTE (+135, 16byte) varptr(st)+135 を基点に操作(16byte:入れ子/配列)
; UnsafeShutdowns : BYTE (+151, 16byte) varptr(st)+151 を基点に操作(16byte:入れ子/配列)
; MediaErrors : BYTE (+167, 16byte) varptr(st)+167 を基点に操作(16byte:入れ子/配列)
; ErrorInfoLogEntryCount : BYTE (+183, 16byte) varptr(st)+183 を基点に操作(16byte:入れ子/配列)
; WarningCompositeTemperatureTime : DWORD (+200, 4byte) st.50 = 値 / 値 = st.50 (lpoke/lpeek も可)
; CriticalCompositeTemperatureTime : DWORD (+204, 4byte) st.51 = 値 / 値 = st.51 (lpoke/lpeek も可)
; TemperatureSensor1 : WORD (+208, 2byte) wpoke st,208,値 / 値 = wpeek(st,208)
; TemperatureSensor2 : WORD (+210, 2byte) wpoke st,210,値 / 値 = wpeek(st,210)
; TemperatureSensor3 : WORD (+212, 2byte) wpoke st,212,値 / 値 = wpeek(st,212)
; TemperatureSensor4 : WORD (+214, 2byte) wpoke st,214,値 / 値 = wpeek(st,214)
; TemperatureSensor5 : WORD (+216, 2byte) wpoke st,216,値 / 値 = wpeek(st,216)
; TemperatureSensor6 : WORD (+218, 2byte) wpoke st,218,値 / 値 = wpeek(st,218)
; TemperatureSensor7 : WORD (+220, 2byte) wpoke st,220,値 / 値 = wpeek(st,220)
; TemperatureSensor8 : WORD (+222, 2byte) wpoke st,222,値 / 値 = wpeek(st,222)
; Reserved1 : BYTE (+224, 296byte) varptr(st)+224 を基点に操作(296byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_HEALTH_INFO_LOG
#field byte CriticalWarning 8
#field byte Temperature 2
#field byte AvailableSpare
#field byte AvailableSpareThreshold
#field byte PercentageUsed
#field byte Reserved0 26
#field byte DataUnitRead 16
#field byte DataUnitWritten 16
#field byte HostReadCommands 16
#field byte HostWrittenCommands 16
#field byte ControllerBusyTime 16
#field byte PowerCycle 16
#field byte PowerOnHours 16
#field byte UnsafeShutdowns 16
#field byte MediaErrors 16
#field byte ErrorInfoLogEntryCount 16
#field int WarningCompositeTemperatureTime
#field int CriticalCompositeTemperatureTime
#field short TemperatureSensor1
#field short TemperatureSensor2
#field short TemperatureSensor3
#field short TemperatureSensor4
#field short TemperatureSensor5
#field short TemperatureSensor6
#field short TemperatureSensor7
#field short TemperatureSensor8
#field byte Reserved1 296
#endstruct
stdim st, NVME_HEALTH_INFO_LOG ; NSTRUCT 変数を確保
st->AvailableSpare = 100
mes "AvailableSpare=" + st->AvailableSpare
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。