Win32 API 日本語リファレンス
ホームStorage.Nvme › NVME_HEALTH_INFO_LOG

NVME_HEALTH_INFO_LOG

構造体
サイズx64: 520 バイト / x86: 516 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
CriticalWarning_CriticalWarning_e__Union8/4+0+0重大警告ビット群(スペア低下/温度/読み取り専用等)の共用体。
TemperatureBYTE2+8+4コンポジット温度。ケルビン値の2バイトで表す。
AvailableSpareBYTE1+10+6利用可能な予備領域の割合。百分率で表す。
AvailableSpareThresholdBYTE1+11+7予備領域の警告しきい値。百分率で表す。
PercentageUsedBYTE1+12+8推定消耗率。百分率で、100超も報告されうる。
Reserved0BYTE26+13+9予約領域。将来拡張用で0とする。
DataUnitReadBYTE16+39+35読み取られたデータ単位数(1単位=1000×512バイト、128ビット)。
DataUnitWrittenBYTE16+55+51書き込まれたデータ単位数(1単位=1000×512バイト、128ビット)。
HostReadCommandsBYTE16+71+67ホストからの読み取りコマンド累積数(128ビット)。
HostWrittenCommandsBYTE16+87+83ホストからの書き込みコマンド累積数(128ビット)。
ControllerBusyTimeBYTE16+103+99コントローラのビジー時間(分単位、128ビット)。
PowerCycleBYTE16+119+115電源投入回数(128ビット)。
PowerOnHoursBYTE16+135+131通電時間(時間単位、128ビット)。
UnsafeShutdownsBYTE16+151+147安全でないシャットダウンの回数(128ビット)。
MediaErrorsBYTE16+167+163メディアおよびデータ完全性エラーの数(128ビット)。
ErrorInfoLogEntryCountBYTE16+183+179エラー情報ログのエントリ数(128ビット)。
WarningCompositeTemperatureTimeDWORD4+200+196警告温度しきい値超過の累積時間(分)。
CriticalCompositeTemperatureTimeDWORD4+204+200重大温度しきい値超過の累積時間(分)。
TemperatureSensor1WORD2+208+204温度センサ1の値(ケルビン)。0は未実装。
TemperatureSensor2WORD2+210+206温度センサ2の値(ケルビン)。0は未実装。
TemperatureSensor3WORD2+212+208温度センサ3の値(ケルビン)。0は未実装。
TemperatureSensor4WORD2+214+210温度センサ4の値(ケルビン)。0は未実装。
TemperatureSensor5WORD2+216+212温度センサ5の値(ケルビン)。0は未実装。
TemperatureSensor6WORD2+218+214温度センサ6の値(ケルビン)。0は未実装。
TemperatureSensor7WORD2+220+216温度センサ7の値(ケルビン)。0は未実装。
TemperatureSensor8WORD2+222+218温度センサ8の値(ケルビン)。0は未実装。
Reserved1BYTE296+224+220予約領域。将来拡張用で0とする。

共用体: _CriticalWarning_e__Union x64 8B / x86 4B

フィールドサイズx64x86
Anonymous_Anonymous_e__Struct8/4+0+0
AsUcharBYTE1+0+0

各言語での定義

#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 Structure
import 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 非対応)。必要に応じ手動でアクセス。