ホーム › Storage.Nvme › NVME_TELEMETRY_HOST_INITIATED_LOG
NVME_TELEMETRY_HOST_INITIATED_LOG
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| LogIdentifier | BYTE | 1 | +0 | +0 | テレメトリログの識別子。ホスト起動では7。 |
| Reserved0 | BYTE | 4 | +1 | +1 | 予約領域。将来拡張用で0とする。 |
| OrganizationID | BYTE | 3 | +5 | +5 | ログを生成した組織のIEEE OUI識別子。 |
| Area1LastBlock | WORD | 2 | +8 | +8 | データ領域1の最終ブロック番号。 |
| Area2LastBlock | WORD | 2 | +10 | +10 | データ領域2の最終ブロック番号。 |
| Area3LastBlock | WORD | 2 | +12 | +12 | データ領域3の最終ブロック番号。 |
| Reserved1 | BYTE | 2 | +14 | +14 | 予約領域。将来拡張用で0とする。 |
| Area4LastBlock | DWORD | 4 | +16 | +16 | データ領域4の最終ブロック番号。 |
| Reserved2 | BYTE | 361 | +20 | +20 | 予約領域。将来拡張用で0とする。 |
| HostInitiatedDataGenerationNumber | BYTE | 1 | +381 | +381 | ホスト起動データの世代番号。 |
| ControllerInitiatedDataAvailable | BYTE | 1 | +382 | +382 | コントローラ起動データの有無を示すフラグ。 |
| ControllerInitiatedDataGenerationNumber | BYTE | 1 | +383 | +383 | コントローラ起動データの世代番号。 |
| ReasonIdentifier | BYTE | 128 | +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 Structureimport 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