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

ISCSI_CONNECTION_INFO_EX

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

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

フィールド

フィールドサイズx64x86説明
ConnectionIdISCSI_UNIQUE_SESSION_ID16+0+0この接続を一意に識別するISCSI_UNIQUE_SESSION_ID。
StateBYTE1+16+16接続の現在の状態を示す値(フリー、ログイン中、フルフィーチャ等)。
ProtocolBYTE1+17+17この接続で使用するトランスポートプロトコル種別。
HeaderDigestBYTE1+18+18ネゴシエートされたヘッダダイジェスト方式(なし/CRC32C等)。
DataDigestBYTE1+19+19ネゴシエートされたデータダイジェスト方式(なし/CRC32C等)。
MaxRecvDataSegmentLengthDWORD4+20+20受信可能な最大データセグメント長(バイト)。
AuthTypeISCSI_AUTH_TYPES4+24+24この接続で使用された認証方式を示すISCSI_AUTH_TYPES列挙値。
EstimatedThroughputULONGLONG8+32+32推定スループット(ビット毎秒)。
MaxDatagramSizeDWORD4+40+401データグラムあたりの最大サイズ(バイト)。

各言語での定義

#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_CONNECTION_INFO_EX  (x64 48 / x86 48 バイト)
typedef struct ISCSI_CONNECTION_INFO_EX {
    ISCSI_UNIQUE_SESSION_ID ConnectionId;
    BYTE State;
    BYTE Protocol;
    BYTE HeaderDigest;
    BYTE DataDigest;
    DWORD MaxRecvDataSegmentLength;
    ISCSI_AUTH_TYPES AuthType;
    ULONGLONG EstimatedThroughput;
    DWORD MaxDatagramSize;
} ISCSI_CONNECTION_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_CONNECTION_INFO_EX
{
    public ISCSI_UNIQUE_SESSION_ID ConnectionId;
    public byte State;
    public byte Protocol;
    public byte HeaderDigest;
    public byte DataDigest;
    public uint MaxRecvDataSegmentLength;
    public int AuthType;
    public ulong EstimatedThroughput;
    public uint MaxDatagramSize;
}
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_CONNECTION_INFO_EX
    Public ConnectionId As ISCSI_UNIQUE_SESSION_ID
    Public State As Byte
    Public Protocol As Byte
    Public HeaderDigest As Byte
    Public DataDigest As Byte
    Public MaxRecvDataSegmentLength As UInteger
    Public AuthType As Integer
    Public EstimatedThroughput As ULong
    Public MaxDatagramSize As UInteger
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_CONNECTION_INFO_EX(ctypes.Structure):
    _fields_ = [
        ("ConnectionId", ISCSI_UNIQUE_SESSION_ID),
        ("State", ctypes.c_ubyte),
        ("Protocol", ctypes.c_ubyte),
        ("HeaderDigest", ctypes.c_ubyte),
        ("DataDigest", ctypes.c_ubyte),
        ("MaxRecvDataSegmentLength", wintypes.DWORD),
        ("AuthType", ctypes.c_int),
        ("EstimatedThroughput", ctypes.c_ulonglong),
        ("MaxDatagramSize", wintypes.DWORD),
    ]
#[repr(C)]
pub struct ISCSI_UNIQUE_SESSION_ID {
    pub AdapterUnique: u64,
    pub AdapterSpecific: u64,
}

#[repr(C)]
pub struct ISCSI_CONNECTION_INFO_EX {
    pub ConnectionId: ISCSI_UNIQUE_SESSION_ID,
    pub State: u8,
    pub Protocol: u8,
    pub HeaderDigest: u8,
    pub DataDigest: u8,
    pub MaxRecvDataSegmentLength: u32,
    pub AuthType: i32,
    pub EstimatedThroughput: u64,
    pub MaxDatagramSize: u32,
}
import "golang.org/x/sys/windows"

type ISCSI_UNIQUE_SESSION_ID struct {
	AdapterUnique uint64
	AdapterSpecific uint64
}

type ISCSI_CONNECTION_INFO_EX struct {
	ConnectionId ISCSI_UNIQUE_SESSION_ID
	State byte
	Protocol byte
	HeaderDigest byte
	DataDigest byte
	MaxRecvDataSegmentLength uint32
	AuthType int32
	EstimatedThroughput uint64
	MaxDatagramSize uint32
}
type
  ISCSI_UNIQUE_SESSION_ID = record
    AdapterUnique: UInt64;
    AdapterSpecific: UInt64;
  end;

  ISCSI_CONNECTION_INFO_EX = record
    ConnectionId: ISCSI_UNIQUE_SESSION_ID;
    State: Byte;
    Protocol: Byte;
    HeaderDigest: Byte;
    DataDigest: Byte;
    MaxRecvDataSegmentLength: DWORD;
    AuthType: Integer;
    EstimatedThroughput: UInt64;
    MaxDatagramSize: DWORD;
  end;
const ISCSI_UNIQUE_SESSION_ID = extern struct {
    AdapterUnique: u64,
    AdapterSpecific: u64,
};

const ISCSI_CONNECTION_INFO_EX = extern struct {
    ConnectionId: ISCSI_UNIQUE_SESSION_ID,
    State: u8,
    Protocol: u8,
    HeaderDigest: u8,
    DataDigest: u8,
    MaxRecvDataSegmentLength: u32,
    AuthType: i32,
    EstimatedThroughput: u64,
    MaxDatagramSize: u32,
};
type
  ISCSI_UNIQUE_SESSION_ID {.bycopy.} = object
    AdapterUnique: uint64
    AdapterSpecific: uint64

  ISCSI_CONNECTION_INFO_EX {.bycopy.} = object
    ConnectionId: ISCSI_UNIQUE_SESSION_ID
    State: uint8
    Protocol: uint8
    HeaderDigest: uint8
    DataDigest: uint8
    MaxRecvDataSegmentLength: uint32
    AuthType: int32
    EstimatedThroughput: uint64
    MaxDatagramSize: uint32
struct ISCSI_UNIQUE_SESSION_ID
{
    ulong AdapterUnique;
    ulong AdapterSpecific;
}

struct ISCSI_CONNECTION_INFO_EX
{
    ISCSI_UNIQUE_SESSION_ID ConnectionId;
    ubyte State;
    ubyte Protocol;
    ubyte HeaderDigest;
    ubyte DataDigest;
    uint MaxRecvDataSegmentLength;
    int AuthType;
    ulong EstimatedThroughput;
    uint MaxDatagramSize;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ISCSI_CONNECTION_INFO_EX サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; ConnectionId : ISCSI_UNIQUE_SESSION_ID (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; State : BYTE (+16, 1byte)  poke st,16,値  /  値 = peek(st,16)
; Protocol : BYTE (+17, 1byte)  poke st,17,値  /  値 = peek(st,17)
; HeaderDigest : BYTE (+18, 1byte)  poke st,18,値  /  値 = peek(st,18)
; DataDigest : BYTE (+19, 1byte)  poke st,19,値  /  値 = peek(st,19)
; MaxRecvDataSegmentLength : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; AuthType : ISCSI_AUTH_TYPES (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; EstimatedThroughput : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; MaxDatagramSize : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ※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_CONNECTION_INFO_EX
    #field ISCSI_UNIQUE_SESSION_ID ConnectionId
    #field byte State
    #field byte Protocol
    #field byte HeaderDigest
    #field byte DataDigest
    #field int MaxRecvDataSegmentLength
    #field int AuthType
    #field int64 EstimatedThroughput
    #field int MaxDatagramSize
#endstruct

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