WSAPROTOCOL_INFOW
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwServiceFlags1 | DWORD | 4 | +0 | +0 | プロトコルが提供するサービスを記述するビットマスクです。このメンバーに指定できる値は Winsock2.h ヘッダーファイルで定義されています。 次の値を指定できます。
メモ XP1_UNI_SEND と XP1_UNI_RECV のいずれか一方のみを設定できます。プロトコルがどちらの方向にも単方向になり得る場合は、2 つの WSAPROTOCOL_INFOW 構造体を使用してください。どちらのビットも設定されていない場合、プロトコルは双方向と見なされます。
| ||||||||||||||||||||||||||||||||||||||||||
| dwServiceFlags2 | DWORD | 4 | +4 | +4 | 追加のプロトコル属性定義用に予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||
| dwServiceFlags3 | DWORD | 4 | +8 | +8 | 追加のプロトコル属性定義用に予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||
| dwServiceFlags4 | DWORD | 4 | +12 | +12 | 追加のプロトコル属性定義用に予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||
| dwProviderFlags | DWORD | 4 | +16 | +16 | このプロトコルが Winsock カタログ内でどのように表現されるかに関する情報を提供するフラグのセットです。このメンバーに指定できる値は Winsock2.h ヘッダーファイルで定義されています。 次の値を指定できます。
| ||||||||||||||||||||||||||||||||||||||||||
| ProviderId | GUID | 16 | +20 | +20 | サービスプロバイダーのベンダーによってプロバイダーに割り当てられたグローバル一意識別子 (GUID) です。この値は、複数のサービスプロバイダーが特定のプロトコルを実装できる場合に役立ちます。アプリケーションは ProviderId メンバーを使用して、それ以外では区別できないプロバイダーを識別できます。 | ||||||||||||||||||||||||||||||||||||||||||
| dwCatalogEntryId | DWORD | 4 | +36 | +36 | 各 WSAPROTOCOL_INFO 構造体に対して WS2_32.DLL によって割り当てられる一意の識別子です。 | ||||||||||||||||||||||||||||||||||||||||||
| ProtocolChain | WSAPROTOCOLCHAIN | 32 | +40 | +40 | プロトコルに関連付けられた WSAPROTOCOLCHAIN 構造体です。チェーンの長さが 0 の場合、この WSAPROTOCOL_INFO エントリは、上端と下端の両方が Windows Sockets 2 SPI である階層化プロトコルを表します。チェーンの長さが 1 の場合、このエントリは、カタログエントリ識別子が WSAPROTOCOL_INFO 構造体の dwCatalogEntryId メンバーに格納されている基本プロトコルを表します。チェーンの長さが 1 より大きい場合、このエントリは、基本プロトコルの上に 1 つ以上の階層化プロトコルが重なったプロトコルチェーンを表します。対応するカタログエントリ識別子は ProtocolChain.ChainEntries 配列に、最上位の階層化プロトコル (ProtocolChain.ChainEntries 配列の要素 0) から始まり、基本プロトコルで終わる順序で格納されます。プロトコルチェーンの詳細については、Windows Sockets 2 サービスプロバイダーインターフェイスの仕様を参照してください。 | ||||||||||||||||||||||||||||||||||||||||||
| iVersion | INT | 4 | +72 | +72 | プロトコルのバージョン識別子です。 | ||||||||||||||||||||||||||||||||||||||||||
| iAddressFamily | INT | 4 | +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_INET と PF_INET) ため、どちらの定数も使用できます。 次の表はアドレスファミリの一般的な値を示しますが、他にも多くの値を指定できます。
| ||||||||||||||||||||||||||||||||||||||||||
| iMaxSockAddr | INT | 4 | +80 | +80 | アドレスの最大長 (バイト単位) です。 | ||||||||||||||||||||||||||||||||||||||||||
| iMinSockAddr | INT | 4 | +84 | +84 | アドレスの最小長 (バイト単位) です。 | ||||||||||||||||||||||||||||||||||||||||||
| iSocketType | INT | 4 | +88 | +88 | このプロトコル用のソケットを開くために、 socket または WSASocket 関数のソケットタイプパラメーターに渡す値です。ソケットタイプに指定できる値は Winsock2.h ヘッダーファイルで定義されています。 次の表は、Windows Sockets 2 でサポートされる iSocketType メンバーの値を示します。
| ||||||||||||||||||||||||||||||||||||||||||
| iProtocol | INT | 4 | +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 の一般的な値を示しますが、他にも多くの値を指定できます。
| ||||||||||||||||||||||||||||||||||||||||||
| iProtocolMaxOffset | INT | 4 | +96 | +96 | socket および WSASocket の protocol パラメーターに値を指定する際に、iProtocol メンバーに加算できる最大値です。すべてのプロトコルが値の範囲を許可するわけではありません。その場合、iProtocolMaxOffset は 0 になります。 | ||||||||||||||||||||||||||||||||||||||||||
| iNetworkByteOrder | INT | 4 | +100 | +100 | 現在のところ、これらの値はマニフェスト定数 (BIGENDIAN および LITTLEENDIAN) であり、それぞれ値 0 と 1 でビッグエンディアンまたはリトルエンディアンを示します。 | ||||||||||||||||||||||||||||||||||||||||||
| iSecurityScheme | INT | 4 | +104 | +104 | 採用されているセキュリティスキームの種類です (ある場合)。セキュリティ機構を組み込んでいないプロトコルには、SECURITY_PROTOCOL_NONE (0) の値が使用されます。 | ||||||||||||||||||||||||||||||||||||||||||
| dwMessageSize | DWORD | 4 | +108 | +108 | プロトコルがサポートする最大メッセージサイズ (バイト単位) です。これは、ホストのいずれかのローカルインターフェイスから送信できる最大サイズです。メッセージのフレーム化をサポートしないプロトコルでは、特定のアドレスに送信できる実際の最大値はこれより小さくなる場合があります。受信メッセージの最大サイズを判別するための標準的な手段はありません。次の特別な値が定義されています。
| ||||||||||||||||||||||||||||||||||||||||||
| dwProviderReserved | DWORD | 4 | +112 | +112 | サービスプロバイダーが使用するために予約済みです。 | ||||||||||||||||||||||||||||||||||||||||||
| szProtocol | WCHAR | 512 | +116 | +116 | プロトコルを識別する、人間が読める名前を格納する Unicode 文字の配列です。たとえば "MSAFD Tcpip [UDP/IP]" のようになります。使用できる文字数の最大値は WSAPROTOCOL_LEN で、255 と定義されています。 |
公式ドキュメント
WSAPROTOCOL_INFOW 構造体は、指定されたプロトコルの完全な情報を格納または取得するために使用されます。プロトコル名は Unicode 文字の配列として表されます。
解説(Remarks)
winsock2.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WSAPROTOCOL_INFO を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となる可能性があります。詳細については、関数プロトタイプの規則 を参照してください。
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 Structureimport 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