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

WSAQUERYSETA

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

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

フィールド

フィールドサイズx64x86説明
dwSizeDWORD4+0+0WSAQUERYSET 構造体のサイズ (バイト単位)。後のバージョンの Windows では WSAQUERYSET 構造体のサイズが変更されているため、このメンバーはバージョン管理の仕組みとして使用されます。
lpszServiceInstanceNameLPSTR8/4+8+4サービス名を格納した、省略可能な NULL 終端文字列へのポインター。文字列内でワイルドカードを使用する際のセマンティクスは定義されていませんが、特定の名前空間プロバイダーではサポートされる場合があります。
lpServiceClassIdGUID*8/4+16+8サービス クラスに対応する GUID。このメンバーは必ず設定する必要があります。
lpVersionWSAVERSION*8/4+24+12名前空間プロバイダーの必要なバージョン番号 (省略可能) へのポインター。このメンバーはバージョン比較のセマンティクス (要求したバージョンと完全に一致しなければならない、またはバージョンが指定した値以上でなければならない) を提供します。
lpszCommentLPSTR8/4+32+16このメンバーはクエリでは無視されます。
dwNameSpaceDWORD4+40+20

どの名前空間プロバイダーに対してクエリを実行するかを決定する名前空間識別子。特定の名前空間識別子を渡すと、指定した名前空間をサポートする名前空間プロバイダーのみがクエリの対象となります。NS_ALL を指定すると、インストール済みでアクティブなすべての名前空間プロバイダーがクエリの対象となります。

dwNameSpace メンバーに指定できる値は Winsock2.h インクルード ファイルに列挙されています。Windows Vista 以降では、いくつかの新しい名前空間プロバイダーが含まれています。ほかの名前空間プロバイダーをインストールすることもできるため、次に示す値は一般的に利用できるもののみです。ほかにも多くの値が存在し得ます。

意味
NS_ALL
インストール済みでアクティブなすべての名前空間。
NS_BTH
Bluetooth 名前空間。この名前空間識別子は Windows Vista 以降でサポートされます。
NS_DNS
ドメイン ネーム システム (DNS) 名前空間。
NS_EMAIL
電子メール名前空間。この名前空間識別子は Windows Vista 以降でサポートされます。
NS_NLA
ネットワーク ロケーション認識 (NLA) 名前空間。この名前空間識別子は Windows XP 以降でサポートされます。
NS_PNRPNAME
特定のピア名に対するピアツーピア名前空間。この名前空間識別子は Windows Vista 以降でサポートされます。
NS_PNRPCLOUD
ピア名のコレクションに対するピアツーピア名前空間。この名前空間識別子は Windows Vista 以降でサポートされます。
lpNSProviderIdGUID*8/4+48+24NS_DNS のように単一の名前空間に複数の名前空間プロバイダーが登録されている場合に、クエリの対象とする特定の名前空間プロバイダーの GUID (省略可能) へのポインター。特定の名前空間プロバイダーの GUID を渡すと、指定した名前空間プロバイダーのみがクエリの対象となります。名前空間プロバイダーの GUID を取得するには、WSAEnumNameSpaceProviders 関数または WSAEnumNameSpaceProvidersEx 関数を呼び出します。
lpszContextLPSTR8/4+56+28階層型名前空間におけるクエリの開始位置 (省略可能) へのポインター。
dwNumberOfProtocolsDWORD4+64+32プロトコル制約配列のサイズ (バイト単位)。このメンバーは 0 でもかまいません。
lpafpProtocolsAFPROTOCOLS*8/4+72+36省略可能な AFPROTOCOLS 構造体の配列へのポインター。これらのプロトコルを使用するサービスのみが返されます。
lpszQueryStringLPSTR8/4+80+40省略可能な NULL 終端のクエリ文字列へのポインター。Whois++ など一部の名前空間では、単純なテキスト文字列で表現される SQL に似た拡張クエリがサポートされます。このパラメーターはその文字列を指定するために使用します。
dwNumberOfCsAddrsDWORD4+88+44このメンバーはクエリでは無視されます。
lpcsaBufferCSADDR_INFO*8/4+96+48このメンバーはクエリでは無視されます。
dwOutputFlagsDWORD4+104+52このメンバーはクエリでは無視されます。
lpBlobBLOB*8/4+112+56プロバイダー固有の名前空間情報を照会または設定するために使用するデータへの、省略可能なポインター。この情報の形式は名前空間プロバイダーに固有です。

公式ドキュメント

WSAQUERYSET 構造体は、指定されたサービスに関する情報 (サービス クラス ID、サービス名、該当する名前空間識別子とプロトコル情報、およびサービスが待ち受けるトランスポート アドレスのセット) を提供します。

解説(Remarks)

WSAQUERYSET 構造体は、Windows 95 以降で利用できる元の名前空間プロバイダー バージョン 1 アーキテクチャの一部として使用されます。より新しいバージョン 2 の名前空間アーキテクチャは、Windows Vista 以降で利用できます。

ほとんどの場合、特定のトランスポート プロトコルのみを対象とするアプリケーションは、名前空間ではなくアドレス ファミリとプロトコルによってクエリを制限すべきです。これにより、たとえば TCP/IP サービスを検索する必要があるアプリケーションは、ローカルの hosts ファイル、DNS、NIS など利用可能なすべての名前空間でクエリを処理させることができます。

メモ

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

// WSAQUERYSETA  (x64 120 / x86 60 バイト)
typedef struct WSAQUERYSETA {
    DWORD dwSize;
    LPSTR lpszServiceInstanceName;
    GUID* lpServiceClassId;
    WSAVERSION* lpVersion;
    LPSTR lpszComment;
    DWORD dwNameSpace;
    GUID* lpNSProviderId;
    LPSTR lpszContext;
    DWORD dwNumberOfProtocols;
    AFPROTOCOLS* lpafpProtocols;
    LPSTR lpszQueryString;
    DWORD dwNumberOfCsAddrs;
    CSADDR_INFO* lpcsaBuffer;
    DWORD dwOutputFlags;
    BLOB* lpBlob;
} WSAQUERYSETA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WSAQUERYSETA
{
    public uint dwSize;
    public IntPtr lpszServiceInstanceName;
    public IntPtr lpServiceClassId;
    public IntPtr lpVersion;
    public IntPtr lpszComment;
    public uint dwNameSpace;
    public IntPtr lpNSProviderId;
    public IntPtr lpszContext;
    public uint dwNumberOfProtocols;
    public IntPtr lpafpProtocols;
    public IntPtr lpszQueryString;
    public uint dwNumberOfCsAddrs;
    public IntPtr lpcsaBuffer;
    public uint dwOutputFlags;
    public IntPtr lpBlob;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WSAQUERYSETA
    Public dwSize As UInteger
    Public lpszServiceInstanceName As IntPtr
    Public lpServiceClassId As IntPtr
    Public lpVersion As IntPtr
    Public lpszComment As IntPtr
    Public dwNameSpace As UInteger
    Public lpNSProviderId As IntPtr
    Public lpszContext As IntPtr
    Public dwNumberOfProtocols As UInteger
    Public lpafpProtocols As IntPtr
    Public lpszQueryString As IntPtr
    Public dwNumberOfCsAddrs As UInteger
    Public lpcsaBuffer As IntPtr
    Public dwOutputFlags As UInteger
    Public lpBlob As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class WSAQUERYSETA(ctypes.Structure):
    _fields_ = [
        ("dwSize", wintypes.DWORD),
        ("lpszServiceInstanceName", ctypes.c_void_p),
        ("lpServiceClassId", ctypes.c_void_p),
        ("lpVersion", ctypes.c_void_p),
        ("lpszComment", ctypes.c_void_p),
        ("dwNameSpace", wintypes.DWORD),
        ("lpNSProviderId", ctypes.c_void_p),
        ("lpszContext", ctypes.c_void_p),
        ("dwNumberOfProtocols", wintypes.DWORD),
        ("lpafpProtocols", ctypes.c_void_p),
        ("lpszQueryString", ctypes.c_void_p),
        ("dwNumberOfCsAddrs", wintypes.DWORD),
        ("lpcsaBuffer", ctypes.c_void_p),
        ("dwOutputFlags", wintypes.DWORD),
        ("lpBlob", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WSAQUERYSETA {
    pub dwSize: u32,
    pub lpszServiceInstanceName: *mut core::ffi::c_void,
    pub lpServiceClassId: *mut core::ffi::c_void,
    pub lpVersion: *mut core::ffi::c_void,
    pub lpszComment: *mut core::ffi::c_void,
    pub dwNameSpace: u32,
    pub lpNSProviderId: *mut core::ffi::c_void,
    pub lpszContext: *mut core::ffi::c_void,
    pub dwNumberOfProtocols: u32,
    pub lpafpProtocols: *mut core::ffi::c_void,
    pub lpszQueryString: *mut core::ffi::c_void,
    pub dwNumberOfCsAddrs: u32,
    pub lpcsaBuffer: *mut core::ffi::c_void,
    pub dwOutputFlags: u32,
    pub lpBlob: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WSAQUERYSETA struct {
	dwSize uint32
	lpszServiceInstanceName uintptr
	lpServiceClassId uintptr
	lpVersion uintptr
	lpszComment uintptr
	dwNameSpace uint32
	lpNSProviderId uintptr
	lpszContext uintptr
	dwNumberOfProtocols uint32
	lpafpProtocols uintptr
	lpszQueryString uintptr
	dwNumberOfCsAddrs uint32
	lpcsaBuffer uintptr
	dwOutputFlags uint32
	lpBlob uintptr
}
type
  WSAQUERYSETA = record
    dwSize: DWORD;
    lpszServiceInstanceName: Pointer;
    lpServiceClassId: Pointer;
    lpVersion: Pointer;
    lpszComment: Pointer;
    dwNameSpace: DWORD;
    lpNSProviderId: Pointer;
    lpszContext: Pointer;
    dwNumberOfProtocols: DWORD;
    lpafpProtocols: Pointer;
    lpszQueryString: Pointer;
    dwNumberOfCsAddrs: DWORD;
    lpcsaBuffer: Pointer;
    dwOutputFlags: DWORD;
    lpBlob: Pointer;
  end;
const WSAQUERYSETA = extern struct {
    dwSize: u32,
    lpszServiceInstanceName: ?*anyopaque,
    lpServiceClassId: ?*anyopaque,
    lpVersion: ?*anyopaque,
    lpszComment: ?*anyopaque,
    dwNameSpace: u32,
    lpNSProviderId: ?*anyopaque,
    lpszContext: ?*anyopaque,
    dwNumberOfProtocols: u32,
    lpafpProtocols: ?*anyopaque,
    lpszQueryString: ?*anyopaque,
    dwNumberOfCsAddrs: u32,
    lpcsaBuffer: ?*anyopaque,
    dwOutputFlags: u32,
    lpBlob: ?*anyopaque,
};
type
  WSAQUERYSETA {.bycopy.} = object
    dwSize: uint32
    lpszServiceInstanceName: pointer
    lpServiceClassId: pointer
    lpVersion: pointer
    lpszComment: pointer
    dwNameSpace: uint32
    lpNSProviderId: pointer
    lpszContext: pointer
    dwNumberOfProtocols: uint32
    lpafpProtocols: pointer
    lpszQueryString: pointer
    dwNumberOfCsAddrs: uint32
    lpcsaBuffer: pointer
    dwOutputFlags: uint32
    lpBlob: pointer
struct WSAQUERYSETA
{
    uint dwSize;
    void* lpszServiceInstanceName;
    void* lpServiceClassId;
    void* lpVersion;
    void* lpszComment;
    uint dwNameSpace;
    void* lpNSProviderId;
    void* lpszContext;
    uint dwNumberOfProtocols;
    void* lpafpProtocols;
    void* lpszQueryString;
    uint dwNumberOfCsAddrs;
    void* lpcsaBuffer;
    uint dwOutputFlags;
    void* lpBlob;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WSAQUERYSETA サイズ: 60 バイト(x86)
dim st, 15    ; 4byte整数×15(構造体サイズ 60 / 4 切り上げ)
; dwSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; lpszServiceInstanceName : LPSTR (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; lpServiceClassId : GUID* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; lpVersion : WSAVERSION* (+12, 4byte)  varptr(st)+12 を基点に操作(4byte:入れ子/配列)
; lpszComment : LPSTR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwNameSpace : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; lpNSProviderId : GUID* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; lpszContext : LPSTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; dwNumberOfProtocols : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; lpafpProtocols : AFPROTOCOLS* (+36, 4byte)  varptr(st)+36 を基点に操作(4byte:入れ子/配列)
; lpszQueryString : LPSTR (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwNumberOfCsAddrs : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; lpcsaBuffer : CSADDR_INFO* (+48, 4byte)  varptr(st)+48 を基点に操作(4byte:入れ子/配列)
; dwOutputFlags : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; lpBlob : BLOB* (+56, 4byte)  varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WSAQUERYSETA サイズ: 120 バイト(x64)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; dwSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; lpszServiceInstanceName : LPSTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; lpServiceClassId : GUID* (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; lpVersion : WSAVERSION* (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; lpszComment : LPSTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; dwNameSpace : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; lpNSProviderId : GUID* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; lpszContext : LPSTR (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; dwNumberOfProtocols : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; lpafpProtocols : AFPROTOCOLS* (+72, 8byte)  varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; lpszQueryString : LPSTR (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; dwNumberOfCsAddrs : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; lpcsaBuffer : CSADDR_INFO* (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; dwOutputFlags : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; lpBlob : BLOB* (+112, 8byte)  varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WSAQUERYSETA
    #field int dwSize
    #field intptr lpszServiceInstanceName
    #field intptr lpServiceClassId
    #field intptr lpVersion
    #field intptr lpszComment
    #field int dwNameSpace
    #field intptr lpNSProviderId
    #field intptr lpszContext
    #field int dwNumberOfProtocols
    #field intptr lpafpProtocols
    #field intptr lpszQueryString
    #field int dwNumberOfCsAddrs
    #field intptr lpcsaBuffer
    #field int dwOutputFlags
    #field intptr lpBlob
#endstruct

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