Win32 API 日本語リファレンス
ホームNetworking.WinSock › WSAPROTOCOL_INFOW

WSAPROTOCOL_INFOW

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

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

フィールド

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

プロトコルが提供するサービスを記述するビットマスクです。このメンバーに指定できる値は Winsock2.h ヘッダーファイルで定義されています。

次の値を指定できます。

意味
XP1_CONNECTIONLESS
0x00000001
コネクションレス (データグラム) サービスを提供します。設定されていない場合、プロトコルはコネクション指向のデータ転送をサポートします。
XP1_GUARANTEED_DELIVERY
0x00000002
送信されたすべてのデータが目的の宛先に到達することを保証します。
XP1_GUARANTEED_ORDER
0x00000004
データが送信された順序どおりにのみ到着し、重複しないことを保証します。この特性は、データが常に配信されることを必ずしも意味するものではなく、配信されるデータが送信された順序で配信されることを意味します。
XP1_MESSAGE_ORIENTED
0x00000008
メッセージ境界を尊重します。これは、メッセージ境界という概念を持たないストリーム指向のプロトコルとは対照的です。
XP1_PSEUDO_STREAM
0x00000010
メッセージ指向のプロトコルですが、すべての受信においてメッセージ境界は無視されます。これは、アプリケーションがプロトコルによるメッセージのフレーム化を望まない場合に便利です。
XP1_GRACEFUL_CLOSE
0x00000020
2 フェーズの (グレースフルな) クローズをサポートします。設定されていない場合は、強制的なクローズのみが実行されます。
XP1_EXPEDITED_DATA
0x00000040
緊急 (優先) データをサポートします。
XP1_CONNECT_DATA
0x00000080
接続データをサポートします。
XP1_DISCONNECT_DATA
0x00000100
切断データをサポートします。
XP1_SUPPORT_BROADCAST
0x00000200
ブロードキャスト機構をサポートします。
XP1_SUPPORT_MULTIPOINT
0x00000400
マルチポイントまたはマルチキャスト機構をサポートします。コントロールプレーンとデータプレーンの属性は以下に示します。
XP1_MULTIPOINT_CONTROL_PLANE
0x00000800
コントロールプレーンがルート付き (値 = 1) かルートなし (値 = 0) かを示します。
XP1_MULTIPOINT_DATA_PLANE
0x00001000
データプレーンがルート付き (値 = 1) かルートなし (値 = 0) かを示します。
XP1_QOS_SUPPORTED
0x00002000
サービス品質 (QoS) の要求をサポートします。
XP1_INTERRUPT
このビットは予約済みです。
XP1_UNI_SEND
0x00008000
プロトコルは送信方向の単方向です。
XP1_UNI_RECV
0x00010000
プロトコルは受信方向の単方向です。
XP1_IFS_HANDLES
0x00020000
プロバイダーが返すソケット記述子は、オペレーティングシステムのインストール可能ファイルシステム (IFS) ハンドルです。
XP1_PARTIAL_MESSAGE
0x00040000
MSG_PARTIAL フラグが WSASend および WSASendTo でサポートされます。
XP1_SAN_SUPPORT_SDP
0x00080000
プロトコルは SAN のサポートを提供します。

この値は Windows 7 および Windows Server 2008 R2 でサポートされます。

メモ XP1_UNI_SENDXP1_UNI_RECV のいずれか一方のみを設定できます。プロトコルがどちらの方向にも単方向になり得る場合は、2 つの WSAPROTOCOL_INFOW 構造体を使用してください。どちらのビットも設定されていない場合、プロトコルは双方向と見なされます。
dwServiceFlags2DWORD4+4+4追加のプロトコル属性定義用に予約済みです。
dwServiceFlags3DWORD4+8+8追加のプロトコル属性定義用に予約済みです。
dwServiceFlags4DWORD4+12+12追加のプロトコル属性定義用に予約済みです。
dwProviderFlagsDWORD4+16+16

このプロトコルが Winsock カタログ内でどのように表現されるかに関する情報を提供するフラグのセットです。このメンバーに指定できる値は Winsock2.h ヘッダーファイルで定義されています。

次の値を指定できます。

意味
PFL_MULTIPLE_PROTO_ENTRIES
0x00000001
これが、複数の動作を実装できる単一のプロトコル (特定のプロバイダーによるもの) に対する 2 つ以上のエントリのうちの 1 つであることを示します。その例が SPX で、受信側ではメッセージ指向プロトコルとしても、ストリーム指向プロトコルとしても動作できます。
PFL_RECOMMENDED_PROTO_ENTRY
0x00000002
これが、複数の動作を実装できるプロトコルに対する推奨エントリ、または最も頻繁に使用されるエントリであることを示します。
PFL_HIDDEN
0x00000004
このプロトコルを WSAEnumProtocols が生成する結果バッファーに返してはならないことを Ws2_32.dll に示すために、プロバイダーによって設定されます。当然ながら、Windows Sockets 2 アプリケーションがこのビットの設定されたエントリを目にすることはありません。
PFL_MATCHES_PROTOCOL_ZERO
0x00000008
socket または WSASocketprotocol パラメーターに 0 を指定した場合に、このプロトコルエントリが一致することを示します。
PFL_NETWORKDIRECT_PROVIDER
0x00000010
ネットワークダイレクトアクセスのサポートを示すために、プロバイダーによって設定されます。

この値は Windows 7 および Windows Server 2008 R2 でサポートされます。

ProviderIdGUID16+20+20サービスプロバイダーのベンダーによってプロバイダーに割り当てられたグローバル一意識別子 (GUID) です。この値は、複数のサービスプロバイダーが特定のプロトコルを実装できる場合に役立ちます。アプリケーションは ProviderId メンバーを使用して、それ以外では区別できないプロバイダーを識別できます。
dwCatalogEntryIdDWORD4+36+36WSAPROTOCOL_INFO 構造体に対して WS2_32.DLL によって割り当てられる一意の識別子です。
ProtocolChainWSAPROTOCOLCHAIN32+40+40プロトコルに関連付けられた WSAPROTOCOLCHAIN 構造体です。チェーンの長さが 0 の場合、この WSAPROTOCOL_INFO エントリは、上端と下端の両方が Windows Sockets 2 SPI である階層化プロトコルを表します。チェーンの長さが 1 の場合、このエントリは、カタログエントリ識別子が WSAPROTOCOL_INFO 構造体の dwCatalogEntryId メンバーに格納されている基本プロトコルを表します。チェーンの長さが 1 より大きい場合、このエントリは、基本プロトコルの上に 1 つ以上の階層化プロトコルが重なったプロトコルチェーンを表します。対応するカタログエントリ識別子は ProtocolChain.ChainEntries 配列に、最上位の階層化プロトコル (ProtocolChain.ChainEntries 配列の要素 0) から始まり、基本プロトコルで終わる順序で格納されます。プロトコルチェーンの詳細については、Windows Sockets 2 サービスプロバイダーインターフェイスの仕様を参照してください。
iVersionINT4+72+72プロトコルのバージョン識別子です。
iAddressFamilyINT4+76+76

このプロトコル用のソケットを開くために、 socket または WSASocket 関数のアドレスファミリパラメーターに渡す値です。この値は、プロトコルが使用する sockaddr のプロトコルアドレスの構造も一意に定義します。

Windows Vista 以降向けにリリースされた Windows SDK では、アドレスファミリに指定できる値は Ws2def.h ヘッダーファイルで定義されています。Ws2def.h ヘッダーファイルは Winsock2.h に自動的にインクルードされるため、直接使用しないでください。

Windows Server 2003 以前のバージョンの Platform SDK では、アドレスファミリに指定できる値は Winsock2.h ヘッダーファイルで定義されています。

現在サポートされている値は AF_INET または AF_INET6 で、これらは IPv4 および IPv6 のインターネットアドレスファミリ形式です。アドレスファミリのその他の選択肢 (たとえば NetBIOS で使用する AF_NETBIOS) は、そのアドレスファミリ用の Windows Sockets サービスプロバイダーがインストールされている場合にサポートされます。AF_ アドレスファミリ定数と PF_ プロトコルファミリ定数の値は同一である (たとえば AF_INETPF_INET) ため、どちらの定数も使用できます。

次の表はアドレスファミリの一般的な値を示しますが、他にも多くの値を指定できます。

iAddressFamily 意味
AF_INET
2
インターネットプロトコルバージョン 4 (IPv4) のアドレスファミリです。
AF_IPX
6
IPX/SPX アドレスファミリです。このアドレスファミリは、NWLink IPX/SPX NetBIOS 互換トランスポートプロトコルがインストールされている場合にのみサポートされます。

このアドレスファミリは Windows Vista 以降ではサポートされません。

AF_APPLETALK
16
AppleTalk アドレスファミリです。このアドレスファミリは、AppleTalk プロトコルがインストールされている場合にのみサポートされます。

このアドレスファミリは Windows Vista 以降ではサポートされません。

AF_NETBIOS
17
NetBIOS アドレスファミリです。このアドレスファミリは、NetBIOS 用の Windows Sockets プロバイダーがインストールされている場合にのみサポートされます。

NetBIOS 用の Windows Sockets プロバイダーは、32 ビット版の Windows でサポートされます。このプロバイダーは 32 ビット版の Windows に既定でインストールされます。

NetBIOS 用の Windows Sockets プロバイダーは、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP を含む 64 ビット版の Windows ではサポートされません。

NetBIOS 用の Windows Sockets プロバイダーは、type パラメーターが SOCK_DGRAM に設定されたソケットのみをサポートします。

NetBIOS 用の Windows Sockets プロバイダーは、NetBIOS プログラミングインターフェイスとは直接の関係はありません。NetBIOS プログラミングインターフェイスは、Windows Vista、Windows Server 2008 以降ではサポートされません。

AF_INET6
23
インターネットプロトコルバージョン 6 (IPv6) のアドレスファミリです。
AF_IRDA
26
Infrared Data Association (IrDA) アドレスファミリです。

このアドレスファミリは、コンピューターに赤外線ポートとドライバーがインストールされている場合にのみサポートされます。

AF_BTH
32
Bluetooth アドレスファミリです。

このアドレスファミリは、コンピューターに Bluetooth アダプターとドライバーがインストールされている場合、Windows XP SP2 以降でサポートされます。

iMaxSockAddrINT4+80+80アドレスの最大長 (バイト単位) です。
iMinSockAddrINT4+84+84アドレスの最小長 (バイト単位) です。
iSocketTypeINT4+88+88

このプロトコル用のソケットを開くために、 socket または WSASocket 関数のソケットタイプパラメーターに渡す値です。ソケットタイプに指定できる値は Winsock2.h ヘッダーファイルで定義されています。

次の表は、Windows Sockets 2 でサポートされる iSocketType メンバーの値を示します。

iSocketType 意味
SOCK_STREAM
1
順序が保証された信頼性のある双方向のコネクション型バイトストリームを、OOB データ送信機構とともに提供するソケットタイプです。このソケットタイプは、インターネットアドレスファミリ (AF_INET または AF_INET6) では伝送制御プロトコル (TCP) を使用します。
SOCK_DGRAM
2
データグラムをサポートするソケットタイプです。データグラムはコネクションレスで信頼性がなく、固定の (通常は小さい) 最大長を持つバッファーです。このソケットタイプは、インターネットアドレスファミリ (AF_INET または AF_INET6) ではユーザーデータグラムプロトコル (UDP) を使用します。
SOCK_RAW
3
アプリケーションが 1 つ上位層のプロトコルヘッダーを操作できる raw ソケットを提供するソケットタイプです。IPv4 ヘッダーを操作するには、ソケットに IP_HDRINCL ソケットオプションを設定する必要があります。IPv6 ヘッダーを操作するには、ソケットに IPV6_HDRINCL ソケットオプションを設定する必要があります。
SOCK_RDM
4
信頼性のあるメッセージデータグラムを提供するソケットタイプです。この例としては、Windows における Pragmatic General Multicast (PGM) マルチキャストプロトコルの実装があり、しばしば 信頼性のあるマルチキャストプログラミング と呼ばれます。

この値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

SOCK_SEQPACKET
5
データグラムに基づく擬似ストリームパケットを提供するソケットタイプです。
iProtocolINT4+92+92

このプロトコル用のソケットを開くために、 socket または WSASocket 関数の protocol パラメーターに渡す値です。iProtocol メンバーに指定できる選択肢は、指定されたアドレスファミリとソケットタイプに固有です。

Windows Vista 以降向けにリリースされた Windows SDK では、このメンバーには Ws2def.h ヘッダーファイルで定義されている IPPROTO 列挙型の値のいずれかを指定できます。Ws2def.h ヘッダーファイルは Winsock2.h に自動的にインクルードされるため、直接使用しないでください。

Windows Server 2003 以前のバージョンの Platform SDK では、iProtocol メンバーに指定できる値は Winsock2.h および Wsrm.h ヘッダーファイルで定義されています。

次の表は iProtocol の一般的な値を示しますが、他にも多くの値を指定できます。

iProtocol 意味
IPPROTO_ICMP
1
インターネット制御メッセージプロトコル (ICMP) です。

この値は Windows XP 以降でサポートされます。

IPPROTO_IGMP
2
インターネットグループ管理プロトコル (IGMP) です。

この値は Windows XP 以降でサポートされます。

BTHPROTO_RFCOMM
3
Bluetooth 無線周波数通信 (Bluetooth RFCOMM) プロトコルです。

この値は Windows XP SP2 以降でサポートされます。

IPPROTO_TCP
6
伝送制御プロトコル (TCP) です。
IPPROTO_UDP
17
ユーザーデータグラムプロトコル (UDP) です。
IPPROTO_ICMPV6
58
インターネット制御メッセージプロトコル バージョン 6 (ICMPv6) です。

この値は Windows XP 以降でサポートされます。

IPPROTO_RM
113
信頼性のあるマルチキャストのための PGM プロトコルです。Windows Vista 以降向けにリリースされた Windows SDK では、このプロトコルは IPPROTO_PGM とも呼ばれます。

この値は、Reliable Multicast Protocol がインストールされている場合にのみサポートされます。

iProtocolMaxOffsetINT4+96+96socket および WSASocketprotocol パラメーターに値を指定する際に、iProtocol メンバーに加算できる最大値です。すべてのプロトコルが値の範囲を許可するわけではありません。その場合、iProtocolMaxOffset は 0 になります。
iNetworkByteOrderINT4+100+100現在のところ、これらの値はマニフェスト定数 (BIGENDIAN および LITTLEENDIAN) であり、それぞれ値 0 と 1 でビッグエンディアンまたはリトルエンディアンを示します。
iSecuritySchemeINT4+104+104採用されているセキュリティスキームの種類です (ある場合)。セキュリティ機構を組み込んでいないプロトコルには、SECURITY_PROTOCOL_NONE (0) の値が使用されます。
dwMessageSizeDWORD4+108+108

プロトコルがサポートする最大メッセージサイズ (バイト単位) です。これは、ホストのいずれかのローカルインターフェイスから送信できる最大サイズです。メッセージのフレーム化をサポートしないプロトコルでは、特定のアドレスに送信できる実際の最大値はこれより小さくなる場合があります。受信メッセージの最大サイズを判別するための標準的な手段はありません。次の特別な値が定義されています。

意味
0
プロトコルはストリーム指向であるため、メッセージサイズという概念は関係ありません。
0x1
送信メッセージの最大サイズは、基盤となるネットワークの MTU (最大伝送単位) に依存するため、ソケットがバインドされるまで判別できません。アプリケーションは、ソケットがローカルアドレスにバインドされた後に getsockopt を使用して SO_MAX_MSG_SIZE の値を取得してください。
0xFFFFFFFF
プロトコルはメッセージ指向ですが、送信できるメッセージのサイズに上限はありません。
dwProviderReservedDWORD4+112+112サービスプロバイダーが使用するために予約済みです。
szProtocolWCHAR512+116+116プロトコルを識別する、人間が読める名前を格納する Unicode 文字の配列です。たとえば "MSAFD Tcpip [UDP/IP]" のようになります。使用できる文字数の最大値は WSAPROTOCOL_LEN で、255 と定義されています。

公式ドキュメント

WSAPROTOCOL_INFOW 構造体は、指定されたプロトコルの完全な情報を格納または取得するために使用されます。プロトコル名は Unicode 文字の配列として表されます。

解説(Remarks)

メモ

winsock2.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WSAPROTOCOL_INFO を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となる可能性があります。詳細については、関数プロトタイプの規則 を参照してください。

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

各言語での定義

#include <windows.h>

// WSAPROTOCOLCHAIN  (x64 32 / x86 32 バイト)
typedef struct WSAPROTOCOLCHAIN {
    INT ChainLen;
    DWORD ChainEntries[7];
} WSAPROTOCOLCHAIN;

// WSAPROTOCOL_INFOW  (x64 628 / x86 628 バイト)
typedef struct WSAPROTOCOL_INFOW {
    DWORD dwServiceFlags1;
    DWORD dwServiceFlags2;
    DWORD dwServiceFlags3;
    DWORD dwServiceFlags4;
    DWORD dwProviderFlags;
    GUID ProviderId;
    DWORD dwCatalogEntryId;
    WSAPROTOCOLCHAIN ProtocolChain;
    INT iVersion;
    INT iAddressFamily;
    INT iMaxSockAddr;
    INT iMinSockAddr;
    INT iSocketType;
    INT iProtocol;
    INT iProtocolMaxOffset;
    INT iNetworkByteOrder;
    INT iSecurityScheme;
    DWORD dwMessageSize;
    DWORD dwProviderReserved;
    WCHAR szProtocol[256];
} WSAPROTOCOL_INFOW;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WSAPROTOCOLCHAIN
{
    public int ChainLen;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public uint[] ChainEntries;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WSAPROTOCOL_INFOW
{
    public uint dwServiceFlags1;
    public uint dwServiceFlags2;
    public uint dwServiceFlags3;
    public uint dwServiceFlags4;
    public uint dwProviderFlags;
    public Guid ProviderId;
    public uint dwCatalogEntryId;
    public WSAPROTOCOLCHAIN ProtocolChain;
    public int iVersion;
    public int iAddressFamily;
    public int iMaxSockAddr;
    public int iMinSockAddr;
    public int iSocketType;
    public int iProtocol;
    public int iProtocolMaxOffset;
    public int iNetworkByteOrder;
    public int iSecurityScheme;
    public uint dwMessageSize;
    public uint dwProviderReserved;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string szProtocol;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WSAPROTOCOLCHAIN
    Public ChainLen As Integer
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=7)> Public ChainEntries() As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WSAPROTOCOL_INFOW
    Public dwServiceFlags1 As UInteger
    Public dwServiceFlags2 As UInteger
    Public dwServiceFlags3 As UInteger
    Public dwServiceFlags4 As UInteger
    Public dwProviderFlags As UInteger
    Public ProviderId As Guid
    Public dwCatalogEntryId As UInteger
    Public ProtocolChain As WSAPROTOCOLCHAIN
    Public iVersion As Integer
    Public iAddressFamily As Integer
    Public iMaxSockAddr As Integer
    Public iMinSockAddr As Integer
    Public iSocketType As Integer
    Public iProtocol As Integer
    Public iProtocolMaxOffset As Integer
    Public iNetworkByteOrder As Integer
    Public iSecurityScheme As Integer
    Public dwMessageSize As UInteger
    Public dwProviderReserved As UInteger
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public szProtocol As String
End Structure
import ctypes
from ctypes import wintypes

class WSAPROTOCOLCHAIN(ctypes.Structure):
    _fields_ = [
        ("ChainLen", ctypes.c_int),
        ("ChainEntries", wintypes.DWORD * 7),
    ]

class WSAPROTOCOL_INFOW(ctypes.Structure):
    _fields_ = [
        ("dwServiceFlags1", wintypes.DWORD),
        ("dwServiceFlags2", wintypes.DWORD),
        ("dwServiceFlags3", wintypes.DWORD),
        ("dwServiceFlags4", wintypes.DWORD),
        ("dwProviderFlags", wintypes.DWORD),
        ("ProviderId", GUID),
        ("dwCatalogEntryId", wintypes.DWORD),
        ("ProtocolChain", WSAPROTOCOLCHAIN),
        ("iVersion", ctypes.c_int),
        ("iAddressFamily", ctypes.c_int),
        ("iMaxSockAddr", ctypes.c_int),
        ("iMinSockAddr", ctypes.c_int),
        ("iSocketType", ctypes.c_int),
        ("iProtocol", ctypes.c_int),
        ("iProtocolMaxOffset", ctypes.c_int),
        ("iNetworkByteOrder", ctypes.c_int),
        ("iSecurityScheme", ctypes.c_int),
        ("dwMessageSize", wintypes.DWORD),
        ("dwProviderReserved", wintypes.DWORD),
        ("szProtocol", ctypes.c_wchar * 256),
    ]
#[repr(C)]
pub struct WSAPROTOCOLCHAIN {
    pub ChainLen: i32,
    pub ChainEntries: [u32; 7],
}

#[repr(C)]
pub struct WSAPROTOCOL_INFOW {
    pub dwServiceFlags1: u32,
    pub dwServiceFlags2: u32,
    pub dwServiceFlags3: u32,
    pub dwServiceFlags4: u32,
    pub dwProviderFlags: u32,
    pub ProviderId: GUID,
    pub dwCatalogEntryId: u32,
    pub ProtocolChain: WSAPROTOCOLCHAIN,
    pub iVersion: i32,
    pub iAddressFamily: i32,
    pub iMaxSockAddr: i32,
    pub iMinSockAddr: i32,
    pub iSocketType: i32,
    pub iProtocol: i32,
    pub iProtocolMaxOffset: i32,
    pub iNetworkByteOrder: i32,
    pub iSecurityScheme: i32,
    pub dwMessageSize: u32,
    pub dwProviderReserved: u32,
    pub szProtocol: [u16; 256],
}
import "golang.org/x/sys/windows"

type WSAPROTOCOLCHAIN struct {
	ChainLen int32
	ChainEntries [7]uint32
}

type WSAPROTOCOL_INFOW struct {
	dwServiceFlags1 uint32
	dwServiceFlags2 uint32
	dwServiceFlags3 uint32
	dwServiceFlags4 uint32
	dwProviderFlags uint32
	ProviderId windows.GUID
	dwCatalogEntryId uint32
	ProtocolChain WSAPROTOCOLCHAIN
	iVersion int32
	iAddressFamily int32
	iMaxSockAddr int32
	iMinSockAddr int32
	iSocketType int32
	iProtocol int32
	iProtocolMaxOffset int32
	iNetworkByteOrder int32
	iSecurityScheme int32
	dwMessageSize uint32
	dwProviderReserved uint32
	szProtocol [256]uint16
}
type
  WSAPROTOCOLCHAIN = record
    ChainLen: Integer;
    ChainEntries: array[0..6] of DWORD;
  end;

  WSAPROTOCOL_INFOW = record
    dwServiceFlags1: DWORD;
    dwServiceFlags2: DWORD;
    dwServiceFlags3: DWORD;
    dwServiceFlags4: DWORD;
    dwProviderFlags: DWORD;
    ProviderId: TGUID;
    dwCatalogEntryId: DWORD;
    ProtocolChain: WSAPROTOCOLCHAIN;
    iVersion: Integer;
    iAddressFamily: Integer;
    iMaxSockAddr: Integer;
    iMinSockAddr: Integer;
    iSocketType: Integer;
    iProtocol: Integer;
    iProtocolMaxOffset: Integer;
    iNetworkByteOrder: Integer;
    iSecurityScheme: Integer;
    dwMessageSize: DWORD;
    dwProviderReserved: DWORD;
    szProtocol: array[0..255] of WideChar;
  end;
const WSAPROTOCOLCHAIN = extern struct {
    ChainLen: i32,
    ChainEntries: [7]u32,
};

const WSAPROTOCOL_INFOW = extern struct {
    dwServiceFlags1: u32,
    dwServiceFlags2: u32,
    dwServiceFlags3: u32,
    dwServiceFlags4: u32,
    dwProviderFlags: u32,
    ProviderId: GUID,
    dwCatalogEntryId: u32,
    ProtocolChain: WSAPROTOCOLCHAIN,
    iVersion: i32,
    iAddressFamily: i32,
    iMaxSockAddr: i32,
    iMinSockAddr: i32,
    iSocketType: i32,
    iProtocol: i32,
    iProtocolMaxOffset: i32,
    iNetworkByteOrder: i32,
    iSecurityScheme: i32,
    dwMessageSize: u32,
    dwProviderReserved: u32,
    szProtocol: [256]u16,
};
type
  WSAPROTOCOLCHAIN {.bycopy.} = object
    ChainLen: int32
    ChainEntries: array[7, uint32]

  WSAPROTOCOL_INFOW {.bycopy.} = object
    dwServiceFlags1: uint32
    dwServiceFlags2: uint32
    dwServiceFlags3: uint32
    dwServiceFlags4: uint32
    dwProviderFlags: uint32
    ProviderId: GUID
    dwCatalogEntryId: uint32
    ProtocolChain: WSAPROTOCOLCHAIN
    iVersion: int32
    iAddressFamily: int32
    iMaxSockAddr: int32
    iMinSockAddr: int32
    iSocketType: int32
    iProtocol: int32
    iProtocolMaxOffset: int32
    iNetworkByteOrder: int32
    iSecurityScheme: int32
    dwMessageSize: uint32
    dwProviderReserved: uint32
    szProtocol: array[256, uint16]
struct WSAPROTOCOLCHAIN
{
    int ChainLen;
    uint[7] ChainEntries;
}

struct WSAPROTOCOL_INFOW
{
    uint dwServiceFlags1;
    uint dwServiceFlags2;
    uint dwServiceFlags3;
    uint dwServiceFlags4;
    uint dwProviderFlags;
    GUID ProviderId;
    uint dwCatalogEntryId;
    WSAPROTOCOLCHAIN ProtocolChain;
    int iVersion;
    int iAddressFamily;
    int iMaxSockAddr;
    int iMinSockAddr;
    int iSocketType;
    int iProtocol;
    int iProtocolMaxOffset;
    int iNetworkByteOrder;
    int iSecurityScheme;
    uint dwMessageSize;
    uint dwProviderReserved;
    wchar[256] szProtocol;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WSAPROTOCOL_INFOW サイズ: 628 バイト(x64)
dim st, 157    ; 4byte整数×157(構造体サイズ 628 / 4 切り上げ)
; dwServiceFlags1 : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwServiceFlags2 : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwServiceFlags3 : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwServiceFlags4 : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwProviderFlags : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ProviderId : GUID (+20, 16byte)  varptr(st)+20 を基点に操作(16byte:入れ子/配列)
; dwCatalogEntryId : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ProtocolChain : WSAPROTOCOLCHAIN (+40, 32byte)  varptr(st)+40 を基点に操作(32byte:入れ子/配列)
; iVersion : INT (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; iAddressFamily : INT (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; iMaxSockAddr : INT (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; iMinSockAddr : INT (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; iSocketType : INT (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; iProtocol : INT (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; iProtocolMaxOffset : INT (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; iNetworkByteOrder : INT (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; iSecurityScheme : INT (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; dwMessageSize : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; dwProviderReserved : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; szProtocol : WCHAR (+116, 512byte)  varptr(st)+116 を基点に操作(512byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global WSAPROTOCOLCHAIN
    #field int ChainLen
    #field int ChainEntries 7
#endstruct

#defstruct global WSAPROTOCOL_INFOW
    #field int dwServiceFlags1
    #field int dwServiceFlags2
    #field int dwServiceFlags3
    #field int dwServiceFlags4
    #field int dwProviderFlags
    #field GUID ProviderId
    #field int dwCatalogEntryId
    #field WSAPROTOCOLCHAIN ProtocolChain
    #field int iVersion
    #field int iAddressFamily
    #field int iMaxSockAddr
    #field int iMinSockAddr
    #field int iSocketType
    #field int iProtocol
    #field int iProtocolMaxOffset
    #field int iNetworkByteOrder
    #field int iSecurityScheme
    #field int dwMessageSize
    #field int dwProviderReserved
    #field wchar szProtocol 256
#endstruct

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