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

NVME_TELEMETRY_HOST_INITIATED_LOG

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

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

フィールド

フィールドサイズx64x86説明
LogIdentifierBYTE1+0+0テレメトリログの識別子。ホスト起動では7。
Reserved0BYTE4+1+1予約領域。将来拡張用で0とする。
OrganizationIDBYTE3+5+5ログを生成した組織のIEEE OUI識別子。
Area1LastBlockWORD2+8+8データ領域1の最終ブロック番号。
Area2LastBlockWORD2+10+10データ領域2の最終ブロック番号。
Area3LastBlockWORD2+12+12データ領域3の最終ブロック番号。
Reserved1BYTE2+14+14予約領域。将来拡張用で0とする。
Area4LastBlockDWORD4+16+16データ領域4の最終ブロック番号。
Reserved2BYTE361+20+20予約領域。将来拡張用で0とする。
HostInitiatedDataGenerationNumberBYTE1+381+381ホスト起動データの世代番号。
ControllerInitiatedDataAvailableBYTE1+382+382コントローラ起動データの有無を示すフラグ。
ControllerInitiatedDataGenerationNumberBYTE1+383+383コントローラ起動データの世代番号。
ReasonIdentifierBYTE128+384+384テレメトリ生成の理由を示す128バイトの識別子。

各言語での定義

#include <windows.h>

// NVME_TELEMETRY_HOST_INITIATED_LOG  (x64 512 / x86 512 バイト)
typedef struct NVME_TELEMETRY_HOST_INITIATED_LOG {
    BYTE LogIdentifier;
    BYTE Reserved0[4];
    BYTE OrganizationID[3];
    WORD Area1LastBlock;
    WORD Area2LastBlock;
    WORD Area3LastBlock;
    BYTE Reserved1[2];
    DWORD Area4LastBlock;
    BYTE Reserved2[361];
    BYTE HostInitiatedDataGenerationNumber;
    BYTE ControllerInitiatedDataAvailable;
    BYTE ControllerInitiatedDataGenerationNumber;
    BYTE ReasonIdentifier[128];
} NVME_TELEMETRY_HOST_INITIATED_LOG;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_TELEMETRY_HOST_INITIATED_LOG
{
    public byte LogIdentifier;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Reserved0;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] OrganizationID;
    public ushort Area1LastBlock;
    public ushort Area2LastBlock;
    public ushort Area3LastBlock;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Reserved1;
    public uint Area4LastBlock;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 361)] public byte[] Reserved2;
    public byte HostInitiatedDataGenerationNumber;
    public byte ControllerInitiatedDataAvailable;
    public byte ControllerInitiatedDataGenerationNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] ReasonIdentifier;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_TELEMETRY_HOST_INITIATED_LOG
    Public LogIdentifier As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Reserved0() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Public OrganizationID() As Byte
    Public Area1LastBlock As UShort
    Public Area2LastBlock As UShort
    Public Area3LastBlock As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Reserved1() As Byte
    Public Area4LastBlock As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=361)> Public Reserved2() As Byte
    Public HostInitiatedDataGenerationNumber As Byte
    Public ControllerInitiatedDataAvailable As Byte
    Public ControllerInitiatedDataGenerationNumber As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> Public ReasonIdentifier() As Byte
End Structure
import ctypes
from ctypes import wintypes

class NVME_TELEMETRY_HOST_INITIATED_LOG(ctypes.Structure):
    _fields_ = [
        ("LogIdentifier", ctypes.c_ubyte),
        ("Reserved0", ctypes.c_ubyte * 4),
        ("OrganizationID", ctypes.c_ubyte * 3),
        ("Area1LastBlock", ctypes.c_ushort),
        ("Area2LastBlock", ctypes.c_ushort),
        ("Area3LastBlock", ctypes.c_ushort),
        ("Reserved1", ctypes.c_ubyte * 2),
        ("Area4LastBlock", wintypes.DWORD),
        ("Reserved2", ctypes.c_ubyte * 361),
        ("HostInitiatedDataGenerationNumber", ctypes.c_ubyte),
        ("ControllerInitiatedDataAvailable", ctypes.c_ubyte),
        ("ControllerInitiatedDataGenerationNumber", ctypes.c_ubyte),
        ("ReasonIdentifier", ctypes.c_ubyte * 128),
    ]
#[repr(C)]
pub struct NVME_TELEMETRY_HOST_INITIATED_LOG {
    pub LogIdentifier: u8,
    pub Reserved0: [u8; 4],
    pub OrganizationID: [u8; 3],
    pub Area1LastBlock: u16,
    pub Area2LastBlock: u16,
    pub Area3LastBlock: u16,
    pub Reserved1: [u8; 2],
    pub Area4LastBlock: u32,
    pub Reserved2: [u8; 361],
    pub HostInitiatedDataGenerationNumber: u8,
    pub ControllerInitiatedDataAvailable: u8,
    pub ControllerInitiatedDataGenerationNumber: u8,
    pub ReasonIdentifier: [u8; 128],
}
import "golang.org/x/sys/windows"

type NVME_TELEMETRY_HOST_INITIATED_LOG struct {
	LogIdentifier byte
	Reserved0 [4]byte
	OrganizationID [3]byte
	Area1LastBlock uint16
	Area2LastBlock uint16
	Area3LastBlock uint16
	Reserved1 [2]byte
	Area4LastBlock uint32
	Reserved2 [361]byte
	HostInitiatedDataGenerationNumber byte
	ControllerInitiatedDataAvailable byte
	ControllerInitiatedDataGenerationNumber byte
	ReasonIdentifier [128]byte
}
type
  NVME_TELEMETRY_HOST_INITIATED_LOG = record
    LogIdentifier: Byte;
    Reserved0: array[0..3] of Byte;
    OrganizationID: array[0..2] of Byte;
    Area1LastBlock: Word;
    Area2LastBlock: Word;
    Area3LastBlock: Word;
    Reserved1: array[0..1] of Byte;
    Area4LastBlock: DWORD;
    Reserved2: array[0..360] of Byte;
    HostInitiatedDataGenerationNumber: Byte;
    ControllerInitiatedDataAvailable: Byte;
    ControllerInitiatedDataGenerationNumber: Byte;
    ReasonIdentifier: array[0..127] of Byte;
  end;
const NVME_TELEMETRY_HOST_INITIATED_LOG = extern struct {
    LogIdentifier: u8,
    Reserved0: [4]u8,
    OrganizationID: [3]u8,
    Area1LastBlock: u16,
    Area2LastBlock: u16,
    Area3LastBlock: u16,
    Reserved1: [2]u8,
    Area4LastBlock: u32,
    Reserved2: [361]u8,
    HostInitiatedDataGenerationNumber: u8,
    ControllerInitiatedDataAvailable: u8,
    ControllerInitiatedDataGenerationNumber: u8,
    ReasonIdentifier: [128]u8,
};
type
  NVME_TELEMETRY_HOST_INITIATED_LOG {.bycopy.} = object
    LogIdentifier: uint8
    Reserved0: array[4, uint8]
    OrganizationID: array[3, uint8]
    Area1LastBlock: uint16
    Area2LastBlock: uint16
    Area3LastBlock: uint16
    Reserved1: array[2, uint8]
    Area4LastBlock: uint32
    Reserved2: array[361, uint8]
    HostInitiatedDataGenerationNumber: uint8
    ControllerInitiatedDataAvailable: uint8
    ControllerInitiatedDataGenerationNumber: uint8
    ReasonIdentifier: array[128, uint8]
struct NVME_TELEMETRY_HOST_INITIATED_LOG
{
    ubyte LogIdentifier;
    ubyte[4] Reserved0;
    ubyte[3] OrganizationID;
    ushort Area1LastBlock;
    ushort Area2LastBlock;
    ushort Area3LastBlock;
    ubyte[2] Reserved1;
    uint Area4LastBlock;
    ubyte[361] Reserved2;
    ubyte HostInitiatedDataGenerationNumber;
    ubyte ControllerInitiatedDataAvailable;
    ubyte ControllerInitiatedDataGenerationNumber;
    ubyte[128] ReasonIdentifier;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_TELEMETRY_HOST_INITIATED_LOG サイズ: 512 バイト(x64)
dim st, 128    ; 4byte整数×128(構造体サイズ 512 / 4 切り上げ)
; LogIdentifier : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Reserved0 : BYTE (+1, 4byte)  varptr(st)+1 を基点に操作(4byte:入れ子/配列)
; OrganizationID : BYTE (+5, 3byte)  varptr(st)+5 を基点に操作(3byte:入れ子/配列)
; Area1LastBlock : WORD (+8, 2byte)  wpoke st,8,値  /  値 = wpeek(st,8)
; Area2LastBlock : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; Area3LastBlock : WORD (+12, 2byte)  wpoke st,12,値  /  値 = wpeek(st,12)
; Reserved1 : BYTE (+14, 2byte)  varptr(st)+14 を基点に操作(2byte:入れ子/配列)
; Area4LastBlock : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Reserved2 : BYTE (+20, 361byte)  varptr(st)+20 を基点に操作(361byte:入れ子/配列)
; HostInitiatedDataGenerationNumber : BYTE (+381, 1byte)  poke st,381,値  /  値 = peek(st,381)
; ControllerInitiatedDataAvailable : BYTE (+382, 1byte)  poke st,382,値  /  値 = peek(st,382)
; ControllerInitiatedDataGenerationNumber : BYTE (+383, 1byte)  poke st,383,値  /  値 = peek(st,383)
; ReasonIdentifier : BYTE (+384, 128byte)  varptr(st)+384 を基点に操作(128byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_TELEMETRY_HOST_INITIATED_LOG
    #field byte LogIdentifier
    #field byte Reserved0 4
    #field byte OrganizationID 3
    #field short Area1LastBlock
    #field short Area2LastBlock
    #field short Area3LastBlock
    #field byte Reserved1 2
    #field int Area4LastBlock
    #field byte Reserved2 361
    #field byte HostInitiatedDataGenerationNumber
    #field byte ControllerInitiatedDataAvailable
    #field byte ControllerInitiatedDataGenerationNumber
    #field byte ReasonIdentifier 128
#endstruct

stdim st, NVME_TELEMETRY_HOST_INITIATED_LOG        ; NSTRUCT 変数を確保
st->LogIdentifier = 100
mes "LogIdentifier=" + st->LogIdentifier