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

WSAPROTOCOL_INFOA

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

サイズ=各フィールドのバイト数(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
緊急 (expedited) データをサポートします。
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

WSASend および WSASendToMSG_PARTIAL フラグがサポートされます。

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 配列の 0 番目の要素) から始まり基本プロトコルで終わる順序で、ProtocolChain.ChainEntries 配列に格納されます。プロトコルチェーンの詳細については、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 または WSASocket 関数の protocol パラメーターに値を指定する際に、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サービスプロバイダーが使用するために予約されています。
szProtocolCHAR256+116+116プロトコルを識別する、人間が読める名前を格納する文字の配列です。たとえば "MSAFD Tcpip [UDP/IP]" のようになります。使用できる文字数の最大値は WSAPROTOCOL_LEN で、255 として定義されています。

公式ドキュメント

WSAPROTOCOL_INFO 構造体は、指定したプロトコルの完全な情報を格納または取得するために使用します。

解説(Remarks)

メモ

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

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_INFOA  (x64 372 / x86 372 バイト)
typedef struct WSAPROTOCOL_INFOA {
    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;
    CHAR szProtocol[256];
} WSAPROTOCOL_INFOA;
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_INFOA
{
    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.ByValArray, SizeConst = 256)] public sbyte[] 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_INFOA
    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.ByValArray, SizeConst:=256)> Public szProtocol() As SByte
End Structure
import ctypes
from ctypes import wintypes

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

class WSAPROTOCOL_INFOA(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_byte * 256),
    ]
#[repr(C)]
pub struct WSAPROTOCOLCHAIN {
    pub ChainLen: i32,
    pub ChainEntries: [u32; 7],
}

#[repr(C)]
pub struct WSAPROTOCOL_INFOA {
    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: [i8; 256],
}
import "golang.org/x/sys/windows"

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

type WSAPROTOCOL_INFOA 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]int8
}
type
  WSAPROTOCOLCHAIN = record
    ChainLen: Integer;
    ChainEntries: array[0..6] of DWORD;
  end;

  WSAPROTOCOL_INFOA = 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 Shortint;
  end;
const WSAPROTOCOLCHAIN = extern struct {
    ChainLen: i32,
    ChainEntries: [7]u32,
};

const WSAPROTOCOL_INFOA = 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]i8,
};
type
  WSAPROTOCOLCHAIN {.bycopy.} = object
    ChainLen: int32
    ChainEntries: array[7, uint32]

  WSAPROTOCOL_INFOA {.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, int8]
struct WSAPROTOCOLCHAIN
{
    int ChainLen;
    uint[7] ChainEntries;
}

struct WSAPROTOCOL_INFOA
{
    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;
    byte[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_INFOA サイズ: 372 バイト(x64)
dim st, 93    ; 4byte整数×93(構造体サイズ 372 / 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 : CHAR (+116, 256byte)  varptr(st)+116 を基点に操作(256byte:入れ子/配列)
; ※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_INFOA
    #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 byte szProtocol 256
#endstruct

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