ホーム › Storage.IscsiDisc › ISCSI_SESSION_INFO_EX
ISCSI_SESSION_INFO_EX
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| SessionId | ISCSI_UNIQUE_SESSION_ID | 16 | +0 | +0 | このセッションを一意に識別するISCSI_UNIQUE_SESSION_ID。 |
| InitialR2t | BOOLEAN | 1 | +16 | +16 | 初回R2T(Ready to Transfer)を要求するかを示すブール値。 |
| ImmediateData | BOOLEAN | 1 | +17 | +17 | 即時データ送信が有効かを示すブール値。 |
| Type | BYTE | 1 | +18 | +18 | セッション種別(検出セッションか通常セッションか)を示す値。 |
| DataSequenceInOrder | BOOLEAN | 1 | +19 | +19 | データシーケンスを順序通りに扱うかを示すブール値。 |
| DataPduInOrder | BOOLEAN | 1 | +20 | +20 | データPDUを順序通りに扱うかを示すブール値。 |
| ErrorRecoveryLevel | BYTE | 1 | +21 | +21 | ネゴシエートされたエラー回復レベル(0〜2)。 |
| MaxOutstandingR2t | DWORD | 4 | +24 | +24 | 未完了で保持できる最大R2T数。 |
| FirstBurstLength | DWORD | 4 | +28 | +28 | 未送信R2T時に即時に送れる最大データバイト数(FirstBurstLength)。 |
| MaxBurstLength | DWORD | 4 | +32 | +32 | 1回のシーケンスで送れる最大データバイト数(MaxBurstLength)。 |
| MaximumConnections | DWORD | 4 | +36 | +36 | このセッションで許可される最大接続数。 |
| ConnectionCount | DWORD | 4 | +40 | +40 | Connectionsが指す接続情報配列の要素数。 |
| Connections | ISCSI_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 Structureimport 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: pointerstruct 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