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

NVME_IDENTIFY_NAMESPACE_DATA

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

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

フィールド

フィールドサイズx64x86説明
NSZEULONGLONG8+0+0

ネームスペースの合計サイズを論理ブロック単位で示します。

サイズ n のネームスペースは、論理ブロック アドレス (LBA) 0 から (n - 1) までで構成されます。論理ブロック数はフォーマット済みの LBA サイズに基づきます。このフィールドは、ネームスペースがフォーマットされる前は未定義です。

NCAPULONGLONG8+8+8

任意の時点でネームスペース内に割り当て可能な論理ブロックの最大数を示します。

論理ブロック数はフォーマット済みの LBA サイズに基づきます。このフィールドは、ネームスペースがフォーマットされる前は未定義です。

NCAP フィールドはシン プロビジョニングの場合に使用され、ネームスペース サイズ (NSZE) 以下の値を報告します。

スペア LBA はこのフィールドには含まれません。ネームスペース容量 (NCAP) の値が 0h の場合、そのネームスペース ID が非アクティブなネームスペース ID であることを示します。論理ブロックは、Write コマンドまたは Write Uncorrectable コマンドによって書き込まれたときに割り当てられます。論理ブロックは Dataset Management コマンドを使用して割り当て解除できます。

NUSEULONGLONG8+16+16

現在ネームスペース内に割り当てられている論理ブロック数を示します。

このフィールドの値は、ネームスペース容量 NCAP フィールドの値以下です。

論理ブロック数はフォーマット済みの LBA サイズに基づきます。NVM コマンド セットを使用する場合: 論理ブロックは、Write コマンドまたは Write Uncorrectable コマンドによって書き込まれたときに割り当てられます。論理ブロックは Dataset Management コマンドを使用して割り当て解除できます。

製品がシン プロビジョニング環境を対象としていない場合、コントローラーは常に NCAP の値と等しい NUSE の値を報告することがあります。

NSFEAT_NSFEAT_e__Struct1+24+24ネームスペースの機能を定義するフィールドを含む Namespace Features (NSFEAT) 構造体です。
NLBAFBYTE1+25+25

ネームスペースがサポートする LBA データ サイズとメタデータ サイズの組み合わせの数を定義します。

LBA フォーマットは順番に (0 から始まって) 割り当てられ、連続して配置されます。これは 0 を基点とする値です。サポートされていることを示せる LBA フォーマットの最大数は 16 です。

サポートされる LBA フォーマットは LBAF フィールド (このデータ構造体のバイト 128 – 191) に示されます。メタデータは、LBA の一部として転送されるか (アプリケーションに公開される LBA サイズが大きくなる拡張 LBA が作成されます)、または別個の連続したデータ バッファーとして転送されます。メタデータを LBA と別個のメタデータ バッファーに分割することはできません。

コントローラーでの ECC 効率のため、ソフトウェアおよびコントローラーは 4KB 以上の LBA サイズへ移行することが推奨されます。メタデータを提供する場合は、エンドツーエンドのデータ保護を利用できるように、論理ブロックあたり少なくとも 8 バイトを提供することが推奨されます。

FLBAS_FLBAS_e__Struct1+26+26ネームスペースがフォーマットされた際の LBA データ サイズとメタデータ サイズの組み合わせを示すフィールドを含む Formatted LBA Size (FLBAS) 構造体です。
MC_MC_e__Struct1+27+27メタデータに関する機能を示すフィールドを含む Metadata Capabilities (MC) 構造体です。
DPC_DPC_e__Struct1+28+28

エンドツーエンドのデータ保護機能に関する機能を示すフィールドを含む End-to-end Data Protection Capabilities (DPC) 構造体です。

このフィールドでは複数のビットが設定される場合があります。

DPS_DPS_e__Struct1+29+29

エンドツーエンドのデータ保護機能の Type 設定を示すフィールドを含む End-to-end Data Protection Type Settings (DPS) 構造体です。

NVME_PROTECTION_INFORMATION_TYPES

NMIC_NMIC_e__Struct1+30+30ネームスペースのマルチパス I/O およびネームスペース共有の機能を指定するフィールドを含む Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC) 構造体です。
RESCAPNVM_RESERVATION_CAPABILITIES1+31+31

ネームスペースのリザベーション機能を指定するフィールドを含む Reservation Capabilities (RESCAP) 構造体です。

このフィールドの値が 00h の場合、このネームスペースがリザベーションをサポートしていないことを示します。

FPI_FPI_e__Struct1+32+32フォーマット操作の進行中に、ネームスペースのうちフォーマットが残っている割合を示すフィールドを含む Format Progress Indicator (FPI) 構造体です。
DLFEAT_DLFEAT_e__Struct1+33+33デアロケート(TRIM)後の読み出し動作を示す構造体。
NAWUNWORD2+34+34

通常動作中に NVM へアトミックに書き込まれることが保証される書き込み操作の、ネームスペース固有のサイズを示します。

値が 0h の場合、このネームスペースのサイズが Identify Controller データ構造体の AWUN フィールドで報告されるサイズと同じであることを示します。それ以外の値は、AWUN フィールドと同じエンコードを使用して論理ブロック単位でサイズを指定します。

NAWUPFWORD2+36+36

電源障害またはエラー状態の発生時に NVM へアトミックに書き込まれることが保証される書き込み操作の、ネームスペース固有のサイズを示します。

値が 0h の場合、このネームスペースのサイズが Identify Controller データ構造体の AWUPF フィールドで報告されるサイズと同じであることを示します。それ以外の値は、AWUPF フィールドと同じエンコードを使用して論理ブロック単位でサイズを指定します。

NACWUWORD2+38+38

Compare and Write の fused コマンドについて NVM へアトミックに書き込まれることが保証される書き込み操作の、ネームスペース固有のサイズを示します。

値が 0h の場合、このネームスペースのサイズが Identify Controller データ構造体の ACWU フィールドで報告されるサイズと同じであることを示します。それ以外の値は、ACWU フィールドと同じエンコードを使用して論理ブロック単位でサイズを指定します。

NABSNWORD2+40+40

NAWUN の値に対応する、このネームスペースのアトミック境界サイズを示します。

このフィールドは論理ブロック単位で指定されます。アトミック境界をまたぐこのネームスペースへの書き込みは、他の読み取りコマンドや書き込みコマンドとの関係において NVM 上でアトミックであることが保証されません。

値が 0h の場合、通常の書き込み操作に対するアトミック境界が存在しないことを示します。それ以外の値は、AWUN フィールドと同じエンコードを使用して論理ブロック単位でサイズを指定します。

NABOWORD2+42+42

このネームスペース上で最初のアトミック境界が開始する論理ブロック アドレス (LBA) を示します。

NABSN および NABSPF フィールドが 0h にクリアされている場合、NABO フィールドは 0h にクリアされます。NABO の値は NABSN および NABSPF 以下である必要があります。

NABSPFWORD2+44+44

Namespace Atomic Write Unit Power Fail の値に対応する、このネームスペース固有のアトミック境界サイズを示します。

このフィールドは論理ブロック単位で指定されます。アトミック境界をまたぐこのネームスペースへの書き込みは、他の読み取りコマンドや書き込みコマンドとの関係においてアトミックであることが保証されず、対応する論理ブロックをその後読み取ったときに返されるデータについても保証はありません。

値が 0h の場合、電源障害またはエラー状態に対するアトミック境界が存在しないことを示します。それ以外の値は、AWUPF フィールドと同じエンコードを使用して論理ブロック単位でサイズを指定します。

NOIOBWORD2+46+46Namespace Optimal IO Boundary (NOIOB) を示します。
NVMCAPBYTE16+48+48

このネームスペースに割り当てられた NVM の合計サイズを示します。

このフィールドの値はバイト単位です。このフィールドは、Namespace Management コマンドおよび Namespace Attachment コマンドがサポートされている場合にサポートされます。

注: このフィールドは、論理ブロック サイズとネームスペース サイズ (NSZE) フィールドの積とは一致しない場合があります。シン プロビジョニングやその他の設定 (耐久性など) により、このフィールドは報告される NSZE より大きくなることも小さくなることもあります。

NPWGWORD2+64+64推奨書き込み粒度(論理ブロック数)。
NPWAWORD2+66+66推奨書き込みアラインメント(論理ブロック数)。
NPDGWORD2+68+68推奨デアロケート粒度(論理ブロック数)。
NPDAWORD2+70+70推奨デアロケートアラインメント(論理ブロック数)。
NOWSWORD2+72+72最適書き込みサイズ(論理ブロック数)。
MSSRLWORD2+74+74コピーコマンド1ソースあたりの最大ソース範囲長。
MCLDWORD4+76+76コピーコマンドの最大コピー長。
MSRCBYTE1+80+80コピーコマンドの最大ソース範囲数から1を引いた値。
Reserved2BYTE11+81+81予約済みのフィールドです。
ANAGRPIDDWORD4+92+92このネームスペースが属するANAグループの識別子。
Reserved3BYTE3+96+96バイト 192:383A は予約済みです。
NSATTR_NSATTR_e__Struct1+99+99ネームスペース属性(書き込み保護等)を示す構造体。
NVMSETIDWORD2+100+100関連付けられた NVM Set 識別子 (NVMSETID) を示します。
ENDGIDWORD2+102+102関連付けられた Endurance Group 識別子 (ENDGID) を示します。
NGUIDBYTE16+104+104

グローバルに一意であり、ネームスペースの作成時にそのネームスペースへ割り当てられる 128 ビットの値を格納します。

Namespace Globally Unique Identifier (NGUID) フィールドはネームスペースの存続期間を通じて固定されており、ネームスペース操作やコントローラー操作 (コントローラー リセットやネームスペースのフォーマットなど) をまたいで保持されます。

このフィールドは EUI-64 ベースの 16 バイト指定子形式を使用します。

  • バイト 114:112 には、IEEE Registration Authority によって割り当てられた 24 ビットの company_id 値が格納されます。
  • バイト 119:115 には、対応する組織によって割り当てられた拡張識別子が格納されます。
  • バイト 111:104 には、対応する組織によって割り当てられたベンダー固有の拡張識別子が格納されます。

詳細については IEEE EUI-64 のガイドラインを参照してください。コントローラーは、ネームスペースの作成時に、このフィールドまたは EUI64 フィールドにグローバルに一意なネームスペース識別子を指定してください。

EUI64BYTE8+120+120

グローバルに一意であり、ネームスペースの作成時にそのネームスペースへ割り当てられる 64 ビットの IEEE Extended Unique Identifier (EUI-64) を格納します。

EUI64 フィールドはネームスペースの存続期間を通じて固定されており、ネームスペース操作やコントローラー操作 (コントローラー リセットやネームスペースのフォーマットなど) をまたいで保持されます。

EUI-64 は、IEEE Registration Authority によって割り当てられた 24 ビットまたは 36 ビットの company_id 値と、対応する組織によって割り当てられた拡張識別子を連結したものです。詳細については IEEE EUI-64 のガイドラインを参照してください。

コントローラーは、ネームスペースの作成時に、このフィールドまたは NGUID フィールドにグローバルに一意なネームスペース識別子を指定してください。コントローラーがグローバルに一意な 64 ビット識別子を割り当てられない場合、このフィールドは 0h にクリアされます。

LBAFNVME_LBA_FORMAT256+128+128

16 個の NVME_LBA_FORMAT 構造体の配列を格納します。配列内の各構造体は LBA フォーマットを指定し、それがコントローラーによってサポートされていることを示します。

配列内での構造体の 0 から始まる位置は LBA フォーマットの名前に対応しており、LBA フォーマット 0 (LBAF0) が位置 0、LBA フォーマット 1 (LBAF1) が位置 1、以下同様に、LBA フォーマット 15 (LBAF15) が位置 15 になります。

VSBYTE3712+384+384このバイト範囲 (384:4095) はベンダー固有 (VS) の用途に割り当てられています。

構造体: _NSFEAT_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _FLBAS_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _MC_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _DPC_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _DPS_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _NMIC_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _FPI_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _DLFEAT_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

構造体: _NSATTR_e__Struct x64 1B / x86 1B

フィールドサイズx64x86
_bitfieldBYTE1+0+0

公式ドキュメント

特定のネームスペースに固有の機能と設定を示す値を格納します。

すべてのネームスペースに共通する機能と設定は、ネームスペース識別子が 0xFFFFFFFF のネームスペースに対する NVME_IDENTIFY_NAMESPACE_DATA データ構造体に格納されます。

nvme.h ヘッダー ファイルは、値が 0xFFFFFFFF の定数 NVME_NAMESPACE_ALL を定義しています。

コントローラーが Namespace Management をサポートしており、NVME_COMMAND 構造体のネームスペース識別子 (NSID) フィールドが NVME_NAMESPACE_ALL に設定されている場合、コントローラーはすべてのネームスペースに共通の機能を指定する NVME_IDENTIFY_NAMESPACE_DATA データ構造体を返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// NVM_RESERVATION_CAPABILITIES  (x64 1 / x86 1 バイト)
typedef struct NVM_RESERVATION_CAPABILITIES {
    _Anonymous_e__Struct Anonymous;
    BYTE AsUchar;
} NVM_RESERVATION_CAPABILITIES;

// NVME_LBA_FORMAT  (x64 4 / x86 4 バイト)
typedef struct NVME_LBA_FORMAT {
    _Anonymous_e__Struct Anonymous;
    DWORD AsUlong;
} NVME_LBA_FORMAT;

// NVME_IDENTIFY_NAMESPACE_DATA  (x64 4096 / x86 4096 バイト)
typedef struct NVME_IDENTIFY_NAMESPACE_DATA {
    ULONGLONG NSZE;
    ULONGLONG NCAP;
    ULONGLONG NUSE;
    _NSFEAT_e__Struct NSFEAT;
    BYTE NLBAF;
    _FLBAS_e__Struct FLBAS;
    _MC_e__Struct MC;
    _DPC_e__Struct DPC;
    _DPS_e__Struct DPS;
    _NMIC_e__Struct NMIC;
    NVM_RESERVATION_CAPABILITIES RESCAP;
    _FPI_e__Struct FPI;
    _DLFEAT_e__Struct DLFEAT;
    WORD NAWUN;
    WORD NAWUPF;
    WORD NACWU;
    WORD NABSN;
    WORD NABO;
    WORD NABSPF;
    WORD NOIOB;
    BYTE NVMCAP[16];
    WORD NPWG;
    WORD NPWA;
    WORD NPDG;
    WORD NPDA;
    WORD NOWS;
    WORD MSSRL;
    DWORD MCL;
    BYTE MSRC;
    BYTE Reserved2[11];
    DWORD ANAGRPID;
    BYTE Reserved3[3];
    _NSATTR_e__Struct NSATTR;
    WORD NVMSETID;
    WORD ENDGID;
    BYTE NGUID[16];
    BYTE EUI64[8];
    NVME_LBA_FORMAT LBAF[64];
    BYTE VS[3712];
} NVME_IDENTIFY_NAMESPACE_DATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVM_RESERVATION_CAPABILITIES
{
    public _Anonymous_e__Struct Anonymous;
    public byte AsUchar;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_LBA_FORMAT
{
    public _Anonymous_e__Struct Anonymous;
    public uint AsUlong;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_IDENTIFY_NAMESPACE_DATA
{
    public ulong NSZE;
    public ulong NCAP;
    public ulong NUSE;
    public _NSFEAT_e__Struct NSFEAT;
    public byte NLBAF;
    public _FLBAS_e__Struct FLBAS;
    public _MC_e__Struct MC;
    public _DPC_e__Struct DPC;
    public _DPS_e__Struct DPS;
    public _NMIC_e__Struct NMIC;
    public NVM_RESERVATION_CAPABILITIES RESCAP;
    public _FPI_e__Struct FPI;
    public _DLFEAT_e__Struct DLFEAT;
    public ushort NAWUN;
    public ushort NAWUPF;
    public ushort NACWU;
    public ushort NABSN;
    public ushort NABO;
    public ushort NABSPF;
    public ushort NOIOB;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] NVMCAP;
    public ushort NPWG;
    public ushort NPWA;
    public ushort NPDG;
    public ushort NPDA;
    public ushort NOWS;
    public ushort MSSRL;
    public uint MCL;
    public byte MSRC;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] Reserved2;
    public uint ANAGRPID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] Reserved3;
    public _NSATTR_e__Struct NSATTR;
    public ushort NVMSETID;
    public ushort ENDGID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] NGUID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] EUI64;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public NVME_LBA_FORMAT[] LBAF;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3712)] public byte[] VS;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVM_RESERVATION_CAPABILITIES
    Public Anonymous As _Anonymous_e__Struct
    Public AsUchar As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_LBA_FORMAT
    Public Anonymous As _Anonymous_e__Struct
    Public AsUlong As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_IDENTIFY_NAMESPACE_DATA
    Public NSZE As ULong
    Public NCAP As ULong
    Public NUSE As ULong
    Public NSFEAT As _NSFEAT_e__Struct
    Public NLBAF As Byte
    Public FLBAS As _FLBAS_e__Struct
    Public MC As _MC_e__Struct
    Public DPC As _DPC_e__Struct
    Public DPS As _DPS_e__Struct
    Public NMIC As _NMIC_e__Struct
    Public RESCAP As NVM_RESERVATION_CAPABILITIES
    Public FPI As _FPI_e__Struct
    Public DLFEAT As _DLFEAT_e__Struct
    Public NAWUN As UShort
    Public NAWUPF As UShort
    Public NACWU As UShort
    Public NABSN As UShort
    Public NABO As UShort
    Public NABSPF As UShort
    Public NOIOB As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public NVMCAP() As Byte
    Public NPWG As UShort
    Public NPWA As UShort
    Public NPDG As UShort
    Public NPDA As UShort
    Public NOWS As UShort
    Public MSSRL As UShort
    Public MCL As UInteger
    Public MSRC As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=11)> Public Reserved2() As Byte
    Public ANAGRPID As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Public Reserved3() As Byte
    Public NSATTR As _NSATTR_e__Struct
    Public NVMSETID As UShort
    Public ENDGID As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public NGUID() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public EUI64() As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> Public LBAF() As NVME_LBA_FORMAT
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3712)> Public VS() As Byte
End Structure
import ctypes
from ctypes import wintypes

class NVM_RESERVATION_CAPABILITIES(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("AsUchar", ctypes.c_ubyte),
    ]

class NVME_LBA_FORMAT(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("AsUlong", wintypes.DWORD),
    ]

class NVME_IDENTIFY_NAMESPACE_DATA(ctypes.Structure):
    _fields_ = [
        ("NSZE", ctypes.c_ulonglong),
        ("NCAP", ctypes.c_ulonglong),
        ("NUSE", ctypes.c_ulonglong),
        ("NSFEAT", _NSFEAT_e__Struct),
        ("NLBAF", ctypes.c_ubyte),
        ("FLBAS", _FLBAS_e__Struct),
        ("MC", _MC_e__Struct),
        ("DPC", _DPC_e__Struct),
        ("DPS", _DPS_e__Struct),
        ("NMIC", _NMIC_e__Struct),
        ("RESCAP", NVM_RESERVATION_CAPABILITIES),
        ("FPI", _FPI_e__Struct),
        ("DLFEAT", _DLFEAT_e__Struct),
        ("NAWUN", ctypes.c_ushort),
        ("NAWUPF", ctypes.c_ushort),
        ("NACWU", ctypes.c_ushort),
        ("NABSN", ctypes.c_ushort),
        ("NABO", ctypes.c_ushort),
        ("NABSPF", ctypes.c_ushort),
        ("NOIOB", ctypes.c_ushort),
        ("NVMCAP", ctypes.c_ubyte * 16),
        ("NPWG", ctypes.c_ushort),
        ("NPWA", ctypes.c_ushort),
        ("NPDG", ctypes.c_ushort),
        ("NPDA", ctypes.c_ushort),
        ("NOWS", ctypes.c_ushort),
        ("MSSRL", ctypes.c_ushort),
        ("MCL", wintypes.DWORD),
        ("MSRC", ctypes.c_ubyte),
        ("Reserved2", ctypes.c_ubyte * 11),
        ("ANAGRPID", wintypes.DWORD),
        ("Reserved3", ctypes.c_ubyte * 3),
        ("NSATTR", _NSATTR_e__Struct),
        ("NVMSETID", ctypes.c_ushort),
        ("ENDGID", ctypes.c_ushort),
        ("NGUID", ctypes.c_ubyte * 16),
        ("EUI64", ctypes.c_ubyte * 8),
        ("LBAF", NVME_LBA_FORMAT * 64),
        ("VS", ctypes.c_ubyte * 3712),
    ]
#[repr(C)]
pub struct NVM_RESERVATION_CAPABILITIES {
    pub Anonymous: _Anonymous_e__Struct,
    pub AsUchar: u8,
}

#[repr(C)]
pub struct NVME_LBA_FORMAT {
    pub Anonymous: _Anonymous_e__Struct,
    pub AsUlong: u32,
}

#[repr(C)]
pub struct NVME_IDENTIFY_NAMESPACE_DATA {
    pub NSZE: u64,
    pub NCAP: u64,
    pub NUSE: u64,
    pub NSFEAT: _NSFEAT_e__Struct,
    pub NLBAF: u8,
    pub FLBAS: _FLBAS_e__Struct,
    pub MC: _MC_e__Struct,
    pub DPC: _DPC_e__Struct,
    pub DPS: _DPS_e__Struct,
    pub NMIC: _NMIC_e__Struct,
    pub RESCAP: NVM_RESERVATION_CAPABILITIES,
    pub FPI: _FPI_e__Struct,
    pub DLFEAT: _DLFEAT_e__Struct,
    pub NAWUN: u16,
    pub NAWUPF: u16,
    pub NACWU: u16,
    pub NABSN: u16,
    pub NABO: u16,
    pub NABSPF: u16,
    pub NOIOB: u16,
    pub NVMCAP: [u8; 16],
    pub NPWG: u16,
    pub NPWA: u16,
    pub NPDG: u16,
    pub NPDA: u16,
    pub NOWS: u16,
    pub MSSRL: u16,
    pub MCL: u32,
    pub MSRC: u8,
    pub Reserved2: [u8; 11],
    pub ANAGRPID: u32,
    pub Reserved3: [u8; 3],
    pub NSATTR: _NSATTR_e__Struct,
    pub NVMSETID: u16,
    pub ENDGID: u16,
    pub NGUID: [u8; 16],
    pub EUI64: [u8; 8],
    pub LBAF: [NVME_LBA_FORMAT; 64],
    pub VS: [u8; 3712],
}
import "golang.org/x/sys/windows"

type NVM_RESERVATION_CAPABILITIES struct {
	Anonymous _Anonymous_e__Struct
	AsUchar byte
}

type NVME_LBA_FORMAT struct {
	Anonymous _Anonymous_e__Struct
	AsUlong uint32
}

type NVME_IDENTIFY_NAMESPACE_DATA struct {
	NSZE uint64
	NCAP uint64
	NUSE uint64
	NSFEAT _NSFEAT_e__Struct
	NLBAF byte
	FLBAS _FLBAS_e__Struct
	MC _MC_e__Struct
	DPC _DPC_e__Struct
	DPS _DPS_e__Struct
	NMIC _NMIC_e__Struct
	RESCAP NVM_RESERVATION_CAPABILITIES
	FPI _FPI_e__Struct
	DLFEAT _DLFEAT_e__Struct
	NAWUN uint16
	NAWUPF uint16
	NACWU uint16
	NABSN uint16
	NABO uint16
	NABSPF uint16
	NOIOB uint16
	NVMCAP [16]byte
	NPWG uint16
	NPWA uint16
	NPDG uint16
	NPDA uint16
	NOWS uint16
	MSSRL uint16
	MCL uint32
	MSRC byte
	Reserved2 [11]byte
	ANAGRPID uint32
	Reserved3 [3]byte
	NSATTR _NSATTR_e__Struct
	NVMSETID uint16
	ENDGID uint16
	NGUID [16]byte
	EUI64 [8]byte
	LBAF [64]NVME_LBA_FORMAT
	VS [3712]byte
}
type
  NVM_RESERVATION_CAPABILITIES = record
    Anonymous: _Anonymous_e__Struct;
    AsUchar: Byte;
  end;

  NVME_LBA_FORMAT = record
    Anonymous: _Anonymous_e__Struct;
    AsUlong: DWORD;
  end;

  NVME_IDENTIFY_NAMESPACE_DATA = record
    NSZE: UInt64;
    NCAP: UInt64;
    NUSE: UInt64;
    NSFEAT: _NSFEAT_e__Struct;
    NLBAF: Byte;
    FLBAS: _FLBAS_e__Struct;
    MC: _MC_e__Struct;
    DPC: _DPC_e__Struct;
    DPS: _DPS_e__Struct;
    NMIC: _NMIC_e__Struct;
    RESCAP: NVM_RESERVATION_CAPABILITIES;
    FPI: _FPI_e__Struct;
    DLFEAT: _DLFEAT_e__Struct;
    NAWUN: Word;
    NAWUPF: Word;
    NACWU: Word;
    NABSN: Word;
    NABO: Word;
    NABSPF: Word;
    NOIOB: Word;
    NVMCAP: array[0..15] of Byte;
    NPWG: Word;
    NPWA: Word;
    NPDG: Word;
    NPDA: Word;
    NOWS: Word;
    MSSRL: Word;
    MCL: DWORD;
    MSRC: Byte;
    Reserved2: array[0..10] of Byte;
    ANAGRPID: DWORD;
    Reserved3: array[0..2] of Byte;
    NSATTR: _NSATTR_e__Struct;
    NVMSETID: Word;
    ENDGID: Word;
    NGUID: array[0..15] of Byte;
    EUI64: array[0..7] of Byte;
    LBAF: array[0..63] of NVME_LBA_FORMAT;
    VS: array[0..3711] of Byte;
  end;
const NVM_RESERVATION_CAPABILITIES = extern struct {
    Anonymous: _Anonymous_e__Struct,
    AsUchar: u8,
};

const NVME_LBA_FORMAT = extern struct {
    Anonymous: _Anonymous_e__Struct,
    AsUlong: u32,
};

const NVME_IDENTIFY_NAMESPACE_DATA = extern struct {
    NSZE: u64,
    NCAP: u64,
    NUSE: u64,
    NSFEAT: _NSFEAT_e__Struct,
    NLBAF: u8,
    FLBAS: _FLBAS_e__Struct,
    MC: _MC_e__Struct,
    DPC: _DPC_e__Struct,
    DPS: _DPS_e__Struct,
    NMIC: _NMIC_e__Struct,
    RESCAP: NVM_RESERVATION_CAPABILITIES,
    FPI: _FPI_e__Struct,
    DLFEAT: _DLFEAT_e__Struct,
    NAWUN: u16,
    NAWUPF: u16,
    NACWU: u16,
    NABSN: u16,
    NABO: u16,
    NABSPF: u16,
    NOIOB: u16,
    NVMCAP: [16]u8,
    NPWG: u16,
    NPWA: u16,
    NPDG: u16,
    NPDA: u16,
    NOWS: u16,
    MSSRL: u16,
    MCL: u32,
    MSRC: u8,
    Reserved2: [11]u8,
    ANAGRPID: u32,
    Reserved3: [3]u8,
    NSATTR: _NSATTR_e__Struct,
    NVMSETID: u16,
    ENDGID: u16,
    NGUID: [16]u8,
    EUI64: [8]u8,
    LBAF: [64]NVME_LBA_FORMAT,
    VS: [3712]u8,
};
type
  NVM_RESERVATION_CAPABILITIES {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    AsUchar: uint8

  NVME_LBA_FORMAT {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    AsUlong: uint32

  NVME_IDENTIFY_NAMESPACE_DATA {.bycopy.} = object
    NSZE: uint64
    NCAP: uint64
    NUSE: uint64
    NSFEAT: _NSFEAT_e__Struct
    NLBAF: uint8
    FLBAS: _FLBAS_e__Struct
    MC: _MC_e__Struct
    DPC: _DPC_e__Struct
    DPS: _DPS_e__Struct
    NMIC: _NMIC_e__Struct
    RESCAP: NVM_RESERVATION_CAPABILITIES
    FPI: _FPI_e__Struct
    DLFEAT: _DLFEAT_e__Struct
    NAWUN: uint16
    NAWUPF: uint16
    NACWU: uint16
    NABSN: uint16
    NABO: uint16
    NABSPF: uint16
    NOIOB: uint16
    NVMCAP: array[16, uint8]
    NPWG: uint16
    NPWA: uint16
    NPDG: uint16
    NPDA: uint16
    NOWS: uint16
    MSSRL: uint16
    MCL: uint32
    MSRC: uint8
    Reserved2: array[11, uint8]
    ANAGRPID: uint32
    Reserved3: array[3, uint8]
    NSATTR: _NSATTR_e__Struct
    NVMSETID: uint16
    ENDGID: uint16
    NGUID: array[16, uint8]
    EUI64: array[8, uint8]
    LBAF: array[64, NVME_LBA_FORMAT]
    VS: array[3712, uint8]
struct NVM_RESERVATION_CAPABILITIES
{
    _Anonymous_e__Struct Anonymous;
    ubyte AsUchar;
}

struct NVME_LBA_FORMAT
{
    _Anonymous_e__Struct Anonymous;
    uint AsUlong;
}

struct NVME_IDENTIFY_NAMESPACE_DATA
{
    ulong NSZE;
    ulong NCAP;
    ulong NUSE;
    _NSFEAT_e__Struct NSFEAT;
    ubyte NLBAF;
    _FLBAS_e__Struct FLBAS;
    _MC_e__Struct MC;
    _DPC_e__Struct DPC;
    _DPS_e__Struct DPS;
    _NMIC_e__Struct NMIC;
    NVM_RESERVATION_CAPABILITIES RESCAP;
    _FPI_e__Struct FPI;
    _DLFEAT_e__Struct DLFEAT;
    ushort NAWUN;
    ushort NAWUPF;
    ushort NACWU;
    ushort NABSN;
    ushort NABO;
    ushort NABSPF;
    ushort NOIOB;
    ubyte[16] NVMCAP;
    ushort NPWG;
    ushort NPWA;
    ushort NPDG;
    ushort NPDA;
    ushort NOWS;
    ushort MSSRL;
    uint MCL;
    ubyte MSRC;
    ubyte[11] Reserved2;
    uint ANAGRPID;
    ubyte[3] Reserved3;
    _NSATTR_e__Struct NSATTR;
    ushort NVMSETID;
    ushort ENDGID;
    ubyte[16] NGUID;
    ubyte[8] EUI64;
    NVME_LBA_FORMAT[64] LBAF;
    ubyte[3712] VS;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_IDENTIFY_NAMESPACE_DATA サイズ: 4096 バイト(x64)
dim st, 1024    ; 4byte整数×1024(構造体サイズ 4096 / 4 切り上げ)
; NSZE : ULONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; NCAP : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; NUSE : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; NSFEAT : _NSFEAT_e__Struct (+24, 1byte)  varptr(st)+24 を基点に操作(1byte:入れ子/配列)
; NLBAF : BYTE (+25, 1byte)  poke st,25,値  /  値 = peek(st,25)
; FLBAS : _FLBAS_e__Struct (+26, 1byte)  varptr(st)+26 を基点に操作(1byte:入れ子/配列)
; MC : _MC_e__Struct (+27, 1byte)  varptr(st)+27 を基点に操作(1byte:入れ子/配列)
; DPC : _DPC_e__Struct (+28, 1byte)  varptr(st)+28 を基点に操作(1byte:入れ子/配列)
; DPS : _DPS_e__Struct (+29, 1byte)  varptr(st)+29 を基点に操作(1byte:入れ子/配列)
; NMIC : _NMIC_e__Struct (+30, 1byte)  varptr(st)+30 を基点に操作(1byte:入れ子/配列)
; RESCAP : NVM_RESERVATION_CAPABILITIES (+31, 1byte)  varptr(st)+31 を基点に操作(1byte:入れ子/配列)
; FPI : _FPI_e__Struct (+32, 1byte)  varptr(st)+32 を基点に操作(1byte:入れ子/配列)
; DLFEAT : _DLFEAT_e__Struct (+33, 1byte)  varptr(st)+33 を基点に操作(1byte:入れ子/配列)
; NAWUN : WORD (+34, 2byte)  wpoke st,34,値  /  値 = wpeek(st,34)
; NAWUPF : WORD (+36, 2byte)  wpoke st,36,値  /  値 = wpeek(st,36)
; NACWU : WORD (+38, 2byte)  wpoke st,38,値  /  値 = wpeek(st,38)
; NABSN : WORD (+40, 2byte)  wpoke st,40,値  /  値 = wpeek(st,40)
; NABO : WORD (+42, 2byte)  wpoke st,42,値  /  値 = wpeek(st,42)
; NABSPF : WORD (+44, 2byte)  wpoke st,44,値  /  値 = wpeek(st,44)
; NOIOB : WORD (+46, 2byte)  wpoke st,46,値  /  値 = wpeek(st,46)
; NVMCAP : BYTE (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; NPWG : WORD (+64, 2byte)  wpoke st,64,値  /  値 = wpeek(st,64)
; NPWA : WORD (+66, 2byte)  wpoke st,66,値  /  値 = wpeek(st,66)
; NPDG : WORD (+68, 2byte)  wpoke st,68,値  /  値 = wpeek(st,68)
; NPDA : WORD (+70, 2byte)  wpoke st,70,値  /  値 = wpeek(st,70)
; NOWS : WORD (+72, 2byte)  wpoke st,72,値  /  値 = wpeek(st,72)
; MSSRL : WORD (+74, 2byte)  wpoke st,74,値  /  値 = wpeek(st,74)
; MCL : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; MSRC : BYTE (+80, 1byte)  poke st,80,値  /  値 = peek(st,80)
; Reserved2 : BYTE (+81, 11byte)  varptr(st)+81 を基点に操作(11byte:入れ子/配列)
; ANAGRPID : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; Reserved3 : BYTE (+96, 3byte)  varptr(st)+96 を基点に操作(3byte:入れ子/配列)
; NSATTR : _NSATTR_e__Struct (+99, 1byte)  varptr(st)+99 を基点に操作(1byte:入れ子/配列)
; NVMSETID : WORD (+100, 2byte)  wpoke st,100,値  /  値 = wpeek(st,100)
; ENDGID : WORD (+102, 2byte)  wpoke st,102,値  /  値 = wpeek(st,102)
; NGUID : BYTE (+104, 16byte)  varptr(st)+104 を基点に操作(16byte:入れ子/配列)
; EUI64 : BYTE (+120, 8byte)  varptr(st)+120 を基点に操作(8byte:入れ子/配列)
; LBAF : NVME_LBA_FORMAT (+128, 256byte)  varptr(st)+128 を基点に操作(256byte:入れ子/配列)
; VS : BYTE (+384, 3712byte)  varptr(st)+384 を基点に操作(3712byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_IDENTIFY_NAMESPACE_DATA
    #field int64 NSZE
    #field int64 NCAP
    #field int64 NUSE
    #field _NSFEAT_e__Struct NSFEAT
    #field byte NLBAF
    #field _FLBAS_e__Struct FLBAS
    #field _MC_e__Struct MC
    #field _DPC_e__Struct DPC
    #field _DPS_e__Struct DPS
    #field _NMIC_e__Struct NMIC
    #field byte RESCAP 1
    #field _FPI_e__Struct FPI
    #field _DLFEAT_e__Struct DLFEAT
    #field short NAWUN
    #field short NAWUPF
    #field short NACWU
    #field short NABSN
    #field short NABO
    #field short NABSPF
    #field short NOIOB
    #field byte NVMCAP 16
    #field short NPWG
    #field short NPWA
    #field short NPDG
    #field short NPDA
    #field short NOWS
    #field short MSSRL
    #field int MCL
    #field byte MSRC
    #field byte Reserved2 11
    #field int ANAGRPID
    #field byte Reserved3 3
    #field _NSATTR_e__Struct NSATTR
    #field short NVMSETID
    #field short ENDGID
    #field byte NGUID 16
    #field byte EUI64 8
    #field byte LBAF 256
    #field byte VS 3712
#endstruct

stdim st, NVME_IDENTIFY_NAMESPACE_DATA        ; NSTRUCT 変数を確保
st->NSZE = 100
mes "NSZE=" + st->NSZE
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。