ホーム › Storage.Nvme › NVME_DISCOVERY_HEADER
NVME_DISCOVERY_HEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| GENCTR | ULONGLONG | 8 | +0 | +0 | Discoveryログの世代カウンタ(Generation Counter)を表す64ビット値である。 |
| NUMREC | ULONGLONG | 8 | +8 | +8 | ログに含まれるレコード数(Number of Records)を表す64ビット値である。 |
| RECFMT | WORD | 2 | +16 | +16 | レコードフォーマット(Record Format)を表す16ビット値である。 |
| DLPF | _DLPF_e__Union | 8/4 | +24 | +20 | Discoveryログページのフラグ(Discovery Log Page Flags)を示す共用体である。 |
| Reserved0 | BYTE | 1 | +32 | +24 | 将来の拡張用に予約された未使用バイト列である。 |
| TDLPL | DWORD | 4 | +36 | +28 | Discoveryログページ全体の長さ(Total Discovery Log Page Length)を表す32ビット値である。 |
| Reserved1 | BYTE | 1000 | +40 | +32 | 将来の拡張用に予約された未使用バイト列である。 |
共用体: _DLPF_e__Union x64 8B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 |
|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 |
| AsUchar | BYTE | 1 | +0 | +0 |
各言語での定義
#include <windows.h>
// NVME_DISCOVERY_HEADER (x64 1040 / x86 1032 バイト)
typedef struct NVME_DISCOVERY_HEADER {
ULONGLONG GENCTR;
ULONGLONG NUMREC;
WORD RECFMT;
_DLPF_e__Union DLPF;
BYTE Reserved0;
DWORD TDLPL;
BYTE Reserved1[1000];
} NVME_DISCOVERY_HEADER;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_DISCOVERY_HEADER
{
public ulong GENCTR;
public ulong NUMREC;
public ushort RECFMT;
public _DLPF_e__Union DLPF;
public byte Reserved0;
public uint TDLPL;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1000)] public byte[] Reserved1;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_DISCOVERY_HEADER
Public GENCTR As ULong
Public NUMREC As ULong
Public RECFMT As UShort
Public DLPF As _DLPF_e__Union
Public Reserved0 As Byte
Public TDLPL As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=1000)> Public Reserved1() As Byte
End Structureimport ctypes
from ctypes import wintypes
class NVME_DISCOVERY_HEADER(ctypes.Structure):
_fields_ = [
("GENCTR", ctypes.c_ulonglong),
("NUMREC", ctypes.c_ulonglong),
("RECFMT", ctypes.c_ushort),
("DLPF", _DLPF_e__Union),
("Reserved0", ctypes.c_ubyte),
("TDLPL", wintypes.DWORD),
("Reserved1", ctypes.c_ubyte * 1000),
]#[repr(C)]
pub struct NVME_DISCOVERY_HEADER {
pub GENCTR: u64,
pub NUMREC: u64,
pub RECFMT: u16,
pub DLPF: _DLPF_e__Union,
pub Reserved0: u8,
pub TDLPL: u32,
pub Reserved1: [u8; 1000],
}import "golang.org/x/sys/windows"
type NVME_DISCOVERY_HEADER struct {
GENCTR uint64
NUMREC uint64
RECFMT uint16
DLPF _DLPF_e__Union
Reserved0 byte
TDLPL uint32
Reserved1 [1000]byte
}type
NVME_DISCOVERY_HEADER = record
GENCTR: UInt64;
NUMREC: UInt64;
RECFMT: Word;
DLPF: _DLPF_e__Union;
Reserved0: Byte;
TDLPL: DWORD;
Reserved1: array[0..999] of Byte;
end;const NVME_DISCOVERY_HEADER = extern struct {
GENCTR: u64,
NUMREC: u64,
RECFMT: u16,
DLPF: _DLPF_e__Union,
Reserved0: u8,
TDLPL: u32,
Reserved1: [1000]u8,
};type
NVME_DISCOVERY_HEADER {.bycopy.} = object
GENCTR: uint64
NUMREC: uint64
RECFMT: uint16
DLPF: _DLPF_e__Union
Reserved0: uint8
TDLPL: uint32
Reserved1: array[1000, uint8]struct NVME_DISCOVERY_HEADER
{
ulong GENCTR;
ulong NUMREC;
ushort RECFMT;
_DLPF_e__Union DLPF;
ubyte Reserved0;
uint TDLPL;
ubyte[1000] 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_DISCOVERY_HEADER サイズ: 1032 バイト(x86)
dim st, 258 ; 4byte整数×258(構造体サイズ 1032 / 4 切り上げ)
; GENCTR : ULONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; NUMREC : ULONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; RECFMT : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; DLPF : _DLPF_e__Union (+20, 4byte) varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; Reserved0 : BYTE (+24, 1byte) poke st,24,値 / 値 = peek(st,24)
; TDLPL : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; Reserved1 : BYTE (+32, 1000byte) varptr(st)+32 を基点に操作(1000byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_DISCOVERY_HEADER サイズ: 1040 バイト(x64)
dim st, 260 ; 4byte整数×260(構造体サイズ 1040 / 4 切り上げ)
; GENCTR : ULONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; NUMREC : ULONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; RECFMT : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; DLPF : _DLPF_e__Union (+24, 8byte) varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; Reserved0 : BYTE (+32, 1byte) poke st,32,値 / 値 = peek(st,32)
; TDLPL : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; Reserved1 : BYTE (+40, 1000byte) varptr(st)+40 を基点に操作(1000byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_DISCOVERY_HEADER
#field int64 GENCTR
#field int64 NUMREC
#field short RECFMT
#field byte DLPF 8
#field byte Reserved0
#field int TDLPL
#field byte Reserved1 1000
#endstruct
stdim st, NVME_DISCOVERY_HEADER ; NSTRUCT 変数を確保
st->GENCTR = 100
mes "GENCTR=" + st->GENCTR
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。