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

ISCSI_SESSION_INFO_EX

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

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

フィールド

フィールドサイズx64x86説明
SessionIdISCSI_UNIQUE_SESSION_ID16+0+0このセッションを一意に識別するISCSI_UNIQUE_SESSION_ID。
InitialR2tBOOLEAN1+16+16初回R2T(Ready to Transfer)を要求するかを示すブール値。
ImmediateDataBOOLEAN1+17+17即時データ送信が有効かを示すブール値。
TypeBYTE1+18+18セッション種別(検出セッションか通常セッションか)を示す値。
DataSequenceInOrderBOOLEAN1+19+19データシーケンスを順序通りに扱うかを示すブール値。
DataPduInOrderBOOLEAN1+20+20データPDUを順序通りに扱うかを示すブール値。
ErrorRecoveryLevelBYTE1+21+21ネゴシエートされたエラー回復レベル(0〜2)。
MaxOutstandingR2tDWORD4+24+24未完了で保持できる最大R2T数。
FirstBurstLengthDWORD4+28+28未送信R2T時に即時に送れる最大データバイト数(FirstBurstLength)。
MaxBurstLengthDWORD4+32+321回のシーケンスで送れる最大データバイト数(MaxBurstLength)。
MaximumConnectionsDWORD4+36+36このセッションで許可される最大接続数。
ConnectionCountDWORD4+40+40Connectionsが指す接続情報配列の要素数。
ConnectionsISCSI_CONNECTION_INFO_EX*8/4+48+44このセッションに属する各接続の詳細を並べたISCSI_CONNECTION_INFO_EX配列へのポインタ。

各言語での定義

#include <windows.h>

// ISCSI_UNIQUE_SESSION_ID  (x64 16 / x86 16 バイト)
typedef struct ISCSI_UNIQUE_SESSION_ID {
    ULONGLONG AdapterUnique;
    ULONGLONG AdapterSpecific;
} ISCSI_UNIQUE_SESSION_ID;

// ISCSI_SESSION_INFO_EX  (x64 56 / x86 48 バイト)
typedef struct ISCSI_SESSION_INFO_EX {
    ISCSI_UNIQUE_SESSION_ID SessionId;
    BOOLEAN InitialR2t;
    BOOLEAN ImmediateData;
    BYTE Type;
    BOOLEAN DataSequenceInOrder;
    BOOLEAN DataPduInOrder;
    BYTE ErrorRecoveryLevel;
    DWORD MaxOutstandingR2t;
    DWORD FirstBurstLength;
    DWORD MaxBurstLength;
    DWORD MaximumConnections;
    DWORD ConnectionCount;
    ISCSI_CONNECTION_INFO_EX* Connections;
} ISCSI_SESSION_INFO_EX;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ISCSI_UNIQUE_SESSION_ID
{
    public ulong AdapterUnique;
    public ulong AdapterSpecific;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ISCSI_SESSION_INFO_EX
{
    public ISCSI_UNIQUE_SESSION_ID SessionId;
    [MarshalAs(UnmanagedType.U1)] public bool InitialR2t;
    [MarshalAs(UnmanagedType.U1)] public bool ImmediateData;
    public byte Type;
    [MarshalAs(UnmanagedType.U1)] public bool DataSequenceInOrder;
    [MarshalAs(UnmanagedType.U1)] public bool DataPduInOrder;
    public byte ErrorRecoveryLevel;
    public uint MaxOutstandingR2t;
    public uint FirstBurstLength;
    public uint MaxBurstLength;
    public uint MaximumConnections;
    public uint ConnectionCount;
    public IntPtr Connections;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ISCSI_UNIQUE_SESSION_ID
    Public AdapterUnique As ULong
    Public AdapterSpecific As ULong
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ISCSI_SESSION_INFO_EX
    Public SessionId As ISCSI_UNIQUE_SESSION_ID
    <MarshalAs(UnmanagedType.U1)> Public InitialR2t As Boolean
    <MarshalAs(UnmanagedType.U1)> Public ImmediateData As Boolean
    Public Type As Byte
    <MarshalAs(UnmanagedType.U1)> Public DataSequenceInOrder As Boolean
    <MarshalAs(UnmanagedType.U1)> Public DataPduInOrder As Boolean
    Public ErrorRecoveryLevel As Byte
    Public MaxOutstandingR2t As UInteger
    Public FirstBurstLength As UInteger
    Public MaxBurstLength As UInteger
    Public MaximumConnections As UInteger
    Public ConnectionCount As UInteger
    Public Connections As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class ISCSI_UNIQUE_SESSION_ID(ctypes.Structure):
    _fields_ = [
        ("AdapterUnique", ctypes.c_ulonglong),
        ("AdapterSpecific", ctypes.c_ulonglong),
    ]

class ISCSI_SESSION_INFO_EX(ctypes.Structure):
    _fields_ = [
        ("SessionId", ISCSI_UNIQUE_SESSION_ID),
        ("InitialR2t", ctypes.c_byte),
        ("ImmediateData", ctypes.c_byte),
        ("Type", ctypes.c_ubyte),
        ("DataSequenceInOrder", ctypes.c_byte),
        ("DataPduInOrder", ctypes.c_byte),
        ("ErrorRecoveryLevel", ctypes.c_ubyte),
        ("MaxOutstandingR2t", wintypes.DWORD),
        ("FirstBurstLength", wintypes.DWORD),
        ("MaxBurstLength", wintypes.DWORD),
        ("MaximumConnections", wintypes.DWORD),
        ("ConnectionCount", wintypes.DWORD),
        ("Connections", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct ISCSI_UNIQUE_SESSION_ID {
    pub AdapterUnique: u64,
    pub AdapterSpecific: u64,
}

#[repr(C)]
pub struct ISCSI_SESSION_INFO_EX {
    pub SessionId: ISCSI_UNIQUE_SESSION_ID,
    pub InitialR2t: u8,
    pub ImmediateData: u8,
    pub Type: u8,
    pub DataSequenceInOrder: u8,
    pub DataPduInOrder: u8,
    pub ErrorRecoveryLevel: u8,
    pub MaxOutstandingR2t: u32,
    pub FirstBurstLength: u32,
    pub MaxBurstLength: u32,
    pub MaximumConnections: u32,
    pub ConnectionCount: u32,
    pub Connections: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type ISCSI_UNIQUE_SESSION_ID struct {
	AdapterUnique uint64
	AdapterSpecific uint64
}

type ISCSI_SESSION_INFO_EX struct {
	SessionId ISCSI_UNIQUE_SESSION_ID
	InitialR2t byte
	ImmediateData byte
	Type byte
	DataSequenceInOrder byte
	DataPduInOrder byte
	ErrorRecoveryLevel byte
	MaxOutstandingR2t uint32
	FirstBurstLength uint32
	MaxBurstLength uint32
	MaximumConnections uint32
	ConnectionCount uint32
	Connections uintptr
}
type
  ISCSI_UNIQUE_SESSION_ID = record
    AdapterUnique: UInt64;
    AdapterSpecific: UInt64;
  end;

  ISCSI_SESSION_INFO_EX = record
    SessionId: ISCSI_UNIQUE_SESSION_ID;
    InitialR2t: ByteBool;
    ImmediateData: ByteBool;
    Type: Byte;
    DataSequenceInOrder: ByteBool;
    DataPduInOrder: ByteBool;
    ErrorRecoveryLevel: Byte;
    MaxOutstandingR2t: DWORD;
    FirstBurstLength: DWORD;
    MaxBurstLength: DWORD;
    MaximumConnections: DWORD;
    ConnectionCount: DWORD;
    Connections: Pointer;
  end;
const ISCSI_UNIQUE_SESSION_ID = extern struct {
    AdapterUnique: u64,
    AdapterSpecific: u64,
};

const ISCSI_SESSION_INFO_EX = extern struct {
    SessionId: ISCSI_UNIQUE_SESSION_ID,
    InitialR2t: u8,
    ImmediateData: u8,
    Type: u8,
    DataSequenceInOrder: u8,
    DataPduInOrder: u8,
    ErrorRecoveryLevel: u8,
    MaxOutstandingR2t: u32,
    FirstBurstLength: u32,
    MaxBurstLength: u32,
    MaximumConnections: u32,
    ConnectionCount: u32,
    Connections: ?*anyopaque,
};
type
  ISCSI_UNIQUE_SESSION_ID {.bycopy.} = object
    AdapterUnique: uint64
    AdapterSpecific: uint64

  ISCSI_SESSION_INFO_EX {.bycopy.} = object
    SessionId: ISCSI_UNIQUE_SESSION_ID
    InitialR2t: uint8
    ImmediateData: uint8
    Type: uint8
    DataSequenceInOrder: uint8
    DataPduInOrder: uint8
    ErrorRecoveryLevel: uint8
    MaxOutstandingR2t: uint32
    FirstBurstLength: uint32
    MaxBurstLength: uint32
    MaximumConnections: uint32
    ConnectionCount: uint32
    Connections: pointer
struct ISCSI_UNIQUE_SESSION_ID
{
    ulong AdapterUnique;
    ulong AdapterSpecific;
}

struct ISCSI_SESSION_INFO_EX
{
    ISCSI_UNIQUE_SESSION_ID SessionId;
    ubyte InitialR2t;
    ubyte ImmediateData;
    ubyte Type;
    ubyte DataSequenceInOrder;
    ubyte DataPduInOrder;
    ubyte ErrorRecoveryLevel;
    uint MaxOutstandingR2t;
    uint FirstBurstLength;
    uint MaxBurstLength;
    uint MaximumConnections;
    uint ConnectionCount;
    void* Connections;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; ISCSI_SESSION_INFO_EX サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; SessionId : ISCSI_UNIQUE_SESSION_ID (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; InitialR2t : BOOLEAN (+16, 1byte)  poke st,16,値  /  値 = peek(st,16)
; ImmediateData : BOOLEAN (+17, 1byte)  poke st,17,値  /  値 = peek(st,17)
; Type : BYTE (+18, 1byte)  poke st,18,値  /  値 = peek(st,18)
; DataSequenceInOrder : BOOLEAN (+19, 1byte)  poke st,19,値  /  値 = peek(st,19)
; DataPduInOrder : BOOLEAN (+20, 1byte)  poke st,20,値  /  値 = peek(st,20)
; ErrorRecoveryLevel : BYTE (+21, 1byte)  poke st,21,値  /  値 = peek(st,21)
; MaxOutstandingR2t : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; FirstBurstLength : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; MaxBurstLength : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; MaximumConnections : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ConnectionCount : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Connections : ISCSI_CONNECTION_INFO_EX* (+44, 4byte)  varptr(st)+44 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ISCSI_SESSION_INFO_EX サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; SessionId : ISCSI_UNIQUE_SESSION_ID (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; InitialR2t : BOOLEAN (+16, 1byte)  poke st,16,値  /  値 = peek(st,16)
; ImmediateData : BOOLEAN (+17, 1byte)  poke st,17,値  /  値 = peek(st,17)
; Type : BYTE (+18, 1byte)  poke st,18,値  /  値 = peek(st,18)
; DataSequenceInOrder : BOOLEAN (+19, 1byte)  poke st,19,値  /  値 = peek(st,19)
; DataPduInOrder : BOOLEAN (+20, 1byte)  poke st,20,値  /  値 = peek(st,20)
; ErrorRecoveryLevel : BYTE (+21, 1byte)  poke st,21,値  /  値 = peek(st,21)
; MaxOutstandingR2t : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; FirstBurstLength : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; MaxBurstLength : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; MaximumConnections : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ConnectionCount : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Connections : ISCSI_CONNECTION_INFO_EX* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global ISCSI_UNIQUE_SESSION_ID
    #field int64 AdapterUnique
    #field int64 AdapterSpecific
#endstruct

#defstruct global ISCSI_SESSION_INFO_EX
    #field ISCSI_UNIQUE_SESSION_ID SessionId
    #field bool1 InitialR2t
    #field bool1 ImmediateData
    #field byte Type
    #field bool1 DataSequenceInOrder
    #field bool1 DataPduInOrder
    #field byte ErrorRecoveryLevel
    #field int MaxOutstandingR2t
    #field int FirstBurstLength
    #field int MaxBurstLength
    #field int MaximumConnections
    #field int ConnectionCount
    #field intptr Connections
#endstruct

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