ホーム › Storage.Nvme › NVME_DISCOVERY_ENTRY
NVME_DISCOVERY_ENTRY
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| TRTYPE | BYTE | 1 | +0 | +0 | トランスポート種別(Transport Type)を表す8ビット値である。 |
| ADRFAM | BYTE | 1 | +1 | +1 | アドレスファミリ(Address Family)を表す8ビット値である。 |
| SUBTYPE | BYTE | 1 | +2 | +2 | サブシステムの種別(Subsystem Type)を表す8ビット値である。 |
| TREQ | _TREQ_e__Union | 8/4 | +8 | +4 | トランスポート要件(Transport Requirements)を示す共用体である。 |
| PORTID | WORD | 2 | +16 | +8 | ポート識別子(Port Identifier)を表す16ビット値である。 |
| CNTLID | WORD | 2 | +18 | +10 | コントローラ識別子(Controller ID)を表す16ビット値である。 |
| ASQSZ | WORD | 2 | +20 | +12 | 管理送信キューの最大サイズ(Admin SQ Size)を表す16ビット値である。 |
| EFLAGS | _EFLAGS_e__Union | 8/4 | +24 | +16 | エントリのフラグ(Entry Flags)を示す共用体である。 |
| Reserved0 | BYTE | 20 | +32 | +20 | 将来の拡張用に予約された未使用バイト列である。 |
| TRSVCID | BYTE | 32 | +52 | +40 | トランスポートサービス識別子(Transport Service ID)を表す文字列バイト列である。 |
| Reserved1 | BYTE | 192 | +84 | +72 | 将来の拡張用に予約された未使用バイト列である。 |
| NQN | BYTE | 256 | +276 | +264 | サブシステムのNVMe修飾名(NVMe Qualified Name)を表す文字列バイト列である。 |
| TRADDR | BYTE | 256 | +532 | +520 | トランスポートアドレス(Transport Address)を表す文字列バイト列である。 |
| TSAS | BYTE | 256 | +788 | +776 | トランスポート固有のアドレスサブタイプ(Transport Specific Address Subtype)を表すバイト列である。 |
共用体: _TREQ_e__Union x64 8B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 |
|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 |
| AsUchar | BYTE | 1 | +0 | +0 |
共用体: _EFLAGS_e__Union x64 8B / x86 4B
| フィールド | 型 | サイズ | x64 | x86 |
|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 |
| AsUshort | WORD | 2 | +0 | +0 |
各言語での定義
#include <windows.h>
// NVME_DISCOVERY_ENTRY (x64 1048 / x86 1032 バイト)
typedef struct NVME_DISCOVERY_ENTRY {
BYTE TRTYPE;
BYTE ADRFAM;
BYTE SUBTYPE;
_TREQ_e__Union TREQ;
WORD PORTID;
WORD CNTLID;
WORD ASQSZ;
_EFLAGS_e__Union EFLAGS;
BYTE Reserved0[20];
BYTE TRSVCID[32];
BYTE Reserved1[192];
BYTE NQN[256];
BYTE TRADDR[256];
BYTE TSAS[256];
} NVME_DISCOVERY_ENTRY;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_DISCOVERY_ENTRY
{
public byte TRTYPE;
public byte ADRFAM;
public byte SUBTYPE;
public _TREQ_e__Union TREQ;
public ushort PORTID;
public ushort CNTLID;
public ushort ASQSZ;
public _EFLAGS_e__Union EFLAGS;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] Reserved0;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] TRSVCID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 192)] public byte[] Reserved1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] NQN;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] TRADDR;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] TSAS;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_DISCOVERY_ENTRY
Public TRTYPE As Byte
Public ADRFAM As Byte
Public SUBTYPE As Byte
Public TREQ As _TREQ_e__Union
Public PORTID As UShort
Public CNTLID As UShort
Public ASQSZ As UShort
Public EFLAGS As _EFLAGS_e__Union
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public Reserved0() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public TRSVCID() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=192)> Public Reserved1() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public NQN() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public TRADDR() As Byte
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public TSAS() As Byte
End Structureimport ctypes
from ctypes import wintypes
class NVME_DISCOVERY_ENTRY(ctypes.Structure):
_fields_ = [
("TRTYPE", ctypes.c_ubyte),
("ADRFAM", ctypes.c_ubyte),
("SUBTYPE", ctypes.c_ubyte),
("TREQ", _TREQ_e__Union),
("PORTID", ctypes.c_ushort),
("CNTLID", ctypes.c_ushort),
("ASQSZ", ctypes.c_ushort),
("EFLAGS", _EFLAGS_e__Union),
("Reserved0", ctypes.c_ubyte * 20),
("TRSVCID", ctypes.c_ubyte * 32),
("Reserved1", ctypes.c_ubyte * 192),
("NQN", ctypes.c_ubyte * 256),
("TRADDR", ctypes.c_ubyte * 256),
("TSAS", ctypes.c_ubyte * 256),
]#[repr(C)]
pub struct NVME_DISCOVERY_ENTRY {
pub TRTYPE: u8,
pub ADRFAM: u8,
pub SUBTYPE: u8,
pub TREQ: _TREQ_e__Union,
pub PORTID: u16,
pub CNTLID: u16,
pub ASQSZ: u16,
pub EFLAGS: _EFLAGS_e__Union,
pub Reserved0: [u8; 20],
pub TRSVCID: [u8; 32],
pub Reserved1: [u8; 192],
pub NQN: [u8; 256],
pub TRADDR: [u8; 256],
pub TSAS: [u8; 256],
}import "golang.org/x/sys/windows"
type NVME_DISCOVERY_ENTRY struct {
TRTYPE byte
ADRFAM byte
SUBTYPE byte
TREQ _TREQ_e__Union
PORTID uint16
CNTLID uint16
ASQSZ uint16
EFLAGS _EFLAGS_e__Union
Reserved0 [20]byte
TRSVCID [32]byte
Reserved1 [192]byte
NQN [256]byte
TRADDR [256]byte
TSAS [256]byte
}type
NVME_DISCOVERY_ENTRY = record
TRTYPE: Byte;
ADRFAM: Byte;
SUBTYPE: Byte;
TREQ: _TREQ_e__Union;
PORTID: Word;
CNTLID: Word;
ASQSZ: Word;
EFLAGS: _EFLAGS_e__Union;
Reserved0: array[0..19] of Byte;
TRSVCID: array[0..31] of Byte;
Reserved1: array[0..191] of Byte;
NQN: array[0..255] of Byte;
TRADDR: array[0..255] of Byte;
TSAS: array[0..255] of Byte;
end;const NVME_DISCOVERY_ENTRY = extern struct {
TRTYPE: u8,
ADRFAM: u8,
SUBTYPE: u8,
TREQ: _TREQ_e__Union,
PORTID: u16,
CNTLID: u16,
ASQSZ: u16,
EFLAGS: _EFLAGS_e__Union,
Reserved0: [20]u8,
TRSVCID: [32]u8,
Reserved1: [192]u8,
NQN: [256]u8,
TRADDR: [256]u8,
TSAS: [256]u8,
};type
NVME_DISCOVERY_ENTRY {.bycopy.} = object
TRTYPE: uint8
ADRFAM: uint8
SUBTYPE: uint8
TREQ: _TREQ_e__Union
PORTID: uint16
CNTLID: uint16
ASQSZ: uint16
EFLAGS: _EFLAGS_e__Union
Reserved0: array[20, uint8]
TRSVCID: array[32, uint8]
Reserved1: array[192, uint8]
NQN: array[256, uint8]
TRADDR: array[256, uint8]
TSAS: array[256, uint8]struct NVME_DISCOVERY_ENTRY
{
ubyte TRTYPE;
ubyte ADRFAM;
ubyte SUBTYPE;
_TREQ_e__Union TREQ;
ushort PORTID;
ushort CNTLID;
ushort ASQSZ;
_EFLAGS_e__Union EFLAGS;
ubyte[20] Reserved0;
ubyte[32] TRSVCID;
ubyte[192] Reserved1;
ubyte[256] NQN;
ubyte[256] TRADDR;
ubyte[256] TSAS;
}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_ENTRY サイズ: 1032 バイト(x86)
dim st, 258 ; 4byte整数×258(構造体サイズ 1032 / 4 切り上げ)
; TRTYPE : BYTE (+0, 1byte) poke st,0,値 / 値 = peek(st,0)
; ADRFAM : BYTE (+1, 1byte) poke st,1,値 / 値 = peek(st,1)
; SUBTYPE : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; TREQ : _TREQ_e__Union (+4, 4byte) varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; PORTID : WORD (+8, 2byte) wpoke st,8,値 / 値 = wpeek(st,8)
; CNTLID : WORD (+10, 2byte) wpoke st,10,値 / 値 = wpeek(st,10)
; ASQSZ : WORD (+12, 2byte) wpoke st,12,値 / 値 = wpeek(st,12)
; EFLAGS : _EFLAGS_e__Union (+16, 4byte) varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; Reserved0 : BYTE (+20, 20byte) varptr(st)+20 を基点に操作(20byte:入れ子/配列)
; TRSVCID : BYTE (+40, 32byte) varptr(st)+40 を基点に操作(32byte:入れ子/配列)
; Reserved1 : BYTE (+72, 192byte) varptr(st)+72 を基点に操作(192byte:入れ子/配列)
; NQN : BYTE (+264, 256byte) varptr(st)+264 を基点に操作(256byte:入れ子/配列)
; TRADDR : BYTE (+520, 256byte) varptr(st)+520 を基点に操作(256byte:入れ子/配列)
; TSAS : BYTE (+776, 256byte) varptr(st)+776 を基点に操作(256byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_DISCOVERY_ENTRY サイズ: 1048 バイト(x64)
dim st, 262 ; 4byte整数×262(構造体サイズ 1048 / 4 切り上げ)
; TRTYPE : BYTE (+0, 1byte) poke st,0,値 / 値 = peek(st,0)
; ADRFAM : BYTE (+1, 1byte) poke st,1,値 / 値 = peek(st,1)
; SUBTYPE : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; TREQ : _TREQ_e__Union (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; PORTID : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; CNTLID : WORD (+18, 2byte) wpoke st,18,値 / 値 = wpeek(st,18)
; ASQSZ : WORD (+20, 2byte) wpoke st,20,値 / 値 = wpeek(st,20)
; EFLAGS : _EFLAGS_e__Union (+24, 8byte) varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; Reserved0 : BYTE (+32, 20byte) varptr(st)+32 を基点に操作(20byte:入れ子/配列)
; TRSVCID : BYTE (+52, 32byte) varptr(st)+52 を基点に操作(32byte:入れ子/配列)
; Reserved1 : BYTE (+84, 192byte) varptr(st)+84 を基点に操作(192byte:入れ子/配列)
; NQN : BYTE (+276, 256byte) varptr(st)+276 を基点に操作(256byte:入れ子/配列)
; TRADDR : BYTE (+532, 256byte) varptr(st)+532 を基点に操作(256byte:入れ子/配列)
; TSAS : BYTE (+788, 256byte) varptr(st)+788 を基点に操作(256byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_DISCOVERY_ENTRY
#field byte TRTYPE
#field byte ADRFAM
#field byte SUBTYPE
#field byte TREQ 8
#field short PORTID
#field short CNTLID
#field short ASQSZ
#field byte EFLAGS 8
#field byte Reserved0 20
#field byte TRSVCID 32
#field byte Reserved1 192
#field byte NQN 256
#field byte TRADDR 256
#field byte TSAS 256
#endstruct
stdim st, NVME_DISCOVERY_ENTRY ; NSTRUCT 変数を確保
st->TRTYPE = 100
mes "TRTYPE=" + st->TRTYPE
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。