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

NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET

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

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

フィールド

フィールドサイズx64x86説明
VSLBYTE1+0+0Verifyコマンドの最大サイズ。最小メモリページサイズ単位で表す。
WZSLBYTE1+1+1Write Zeroesコマンドの最大サイズ。最小ページ単位で表す。
WUSLBYTE1+2+2Write Uncorrectableコマンドの最大サイズ。論理ブロック単位で表す。
DMRLBYTE1+3+3Dataset Management 1コマンドあたりの範囲数の最大値。
DMRSLDWORD4+4+4Dataset Management 1範囲の最大論理ブロック数。
DMSLULONGLONG8+8+8Dataset Management 1コマンドの最大サイズ。論理ブロック単位の64ビット値。
ReservedBYTE4080+16+16予約領域。将来拡張用で0とする。

各言語での定義

#include <windows.h>

// NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET  (x64 4096 / x86 4096 バイト)
typedef struct NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET {
    BYTE VSL;
    BYTE WZSL;
    BYTE WUSL;
    BYTE DMRL;
    DWORD DMRSL;
    ULONGLONG DMSL;
    BYTE Reserved[4080];
} NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET
{
    public byte VSL;
    public byte WZSL;
    public byte WUSL;
    public byte DMRL;
    public uint DMRSL;
    public ulong DMSL;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4080)] public byte[] Reserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET
    Public VSL As Byte
    Public WZSL As Byte
    Public WUSL As Byte
    Public DMRL As Byte
    Public DMRSL As UInteger
    Public DMSL As ULong
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4080)> Public Reserved() As Byte
End Structure
import ctypes
from ctypes import wintypes

class NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET(ctypes.Structure):
    _fields_ = [
        ("VSL", ctypes.c_ubyte),
        ("WZSL", ctypes.c_ubyte),
        ("WUSL", ctypes.c_ubyte),
        ("DMRL", ctypes.c_ubyte),
        ("DMRSL", wintypes.DWORD),
        ("DMSL", ctypes.c_ulonglong),
        ("Reserved", ctypes.c_ubyte * 4080),
    ]
#[repr(C)]
pub struct NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET {
    pub VSL: u8,
    pub WZSL: u8,
    pub WUSL: u8,
    pub DMRL: u8,
    pub DMRSL: u32,
    pub DMSL: u64,
    pub Reserved: [u8; 4080],
}
import "golang.org/x/sys/windows"

type NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET struct {
	VSL byte
	WZSL byte
	WUSL byte
	DMRL byte
	DMRSL uint32
	DMSL uint64
	Reserved [4080]byte
}
type
  NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET = record
    VSL: Byte;
    WZSL: Byte;
    WUSL: Byte;
    DMRL: Byte;
    DMRSL: DWORD;
    DMSL: UInt64;
    Reserved: array[0..4079] of Byte;
  end;
const NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET = extern struct {
    VSL: u8,
    WZSL: u8,
    WUSL: u8,
    DMRL: u8,
    DMRSL: u32,
    DMSL: u64,
    Reserved: [4080]u8,
};
type
  NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET {.bycopy.} = object
    VSL: uint8
    WZSL: uint8
    WUSL: uint8
    DMRL: uint8
    DMRSL: uint32
    DMSL: uint64
    Reserved: array[4080, uint8]
struct NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET
{
    ubyte VSL;
    ubyte WZSL;
    ubyte WUSL;
    ubyte DMRL;
    uint DMRSL;
    ulong DMSL;
    ubyte[4080] Reserved;
}

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_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET サイズ: 4096 バイト(x64)
dim st, 1024    ; 4byte整数×1024(構造体サイズ 4096 / 4 切り上げ)
; VSL : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; WZSL : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; WUSL : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; DMRL : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; DMRSL : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; DMSL : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Reserved : BYTE (+16, 4080byte)  varptr(st)+16 を基点に操作(4080byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_IDENTIFY_NVM_SPECIFIC_CONTROLLER_IO_COMMAND_SET
    #field byte VSL
    #field byte WZSL
    #field byte WUSL
    #field byte DMRL
    #field int DMRSL
    #field int64 DMSL
    #field byte Reserved 4080
#endstruct

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