WSCGetProviderInfo32
関数シグネチャ
// WS2_32.dll
#include <windows.h>
INT WSCGetProviderInfo32(
GUID* lpProviderId,
WSC_PROVIDER_INFO_TYPE InfoType,
BYTE* Info,
UINT_PTR* InfoSize,
DWORD Flags,
INT* lpErrno
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| lpProviderId | GUID* | in | プロバイダーのグローバル一意識別子 (GUID) へのポインター。 |
| InfoType | WSC_PROVIDER_INFO_TYPE | in | この LSP プロトコル エントリに対して要求される情報クラス。 |
| Info | BYTE* | out | 要求された LSP プロトコル エントリの情報クラス データを受け取るバッファーへのポインター。このパラメーターが NULL の場合、WSCGetProviderInfo32 は失敗を返し、このバッファーに必要なサイズが InfoSize パラメーターに返されます。 |
| InfoSize | UINT_PTR* | inout | Info パラメーターが指すバッファーのサイズ (バイト単位)。Info パラメーターが NULL の場合、WSCGetProviderInfo32 は失敗を返し、InfoSize パラメーターに必要なバッファーのサイズが設定されます。 |
| Flags | DWORD | in | WSCGetProviderInfo32 関数呼び出しの動作を変更するために使用するフラグ。 |
| lpErrno | INT* | out | 関数が失敗した場合のエラー コードへのポインター。 |
戻り値の型: INT
公式ドキュメント
32 ビットのレイヤード サービス プロバイダー (LSP) について、情報クラスに関連付けられたデータを取得します。注意 この呼び出しは、64 ビット プラットフォームで使用するための WSCGetProviderInfo の厳密な 32 ビット版です。
戻り値
エラーが発生しない場合、WSCGetProviderInfo32 は ERROR_SUCCESS (ゼロ) を返します。それ以外の場合は SOCKET_ERROR を返し、特定のエラー コードが lpErrno パラメーターに返されます。
| エラー コード | 意味 |
|---|---|
| 呼び出しが実装されていません。このエラーは、InfoType パラメーターに **ProviderInfoAudit** が指定された場合に返されます。 | |
| 1 つ以上の引数が、ユーザー アドレス空間の有効な部分にありません。 | |
| 1 つ以上の引数が無効です。 | |
| 指定された lpProviderId に対するプロトコル エントリが見つかりませんでした。 | |
| 回復不能なエラーが発生しました。このエラーは、次のようないくつかの状況で返されます。ユーザーが Winsock レジストリへのアクセスに必要な管理者権限を持っていない場合、または Winsock カタログ エントリを開く際に障害が発生した場合などです。 | |
| 使用可能なメモリが不足していました。このエラーは、新しいカタログ エントリを割り当てるためのメモリが不足している場合に返されます。 |
解説(Remarks)
WSCGetProviderInfo32 は、WSCGetProviderInfo の厳密な 32 ビット版です。64 ビット コンピューターでは、特に 32 ビット用ではないすべての呼び出し (たとえば、名前が "32" で終わらないすべての関数) は、ネイティブの 64 ビット カタログに対して動作します。64 ビット コンピューターで実行されるプロセスは、厳密な 32 ビット カタログに対して動作させて互換性を維持するために、特定の 32 ビット関数呼び出しを使用する必要があります。特定の 32 ビット呼び出しの定義とセマンティクスは、対応するネイティブ版と同じです。
WSCGetProviderInfo32 は、32 ビットのレイヤード サービス プロバイダー上のプロトコル エントリに関する情報クラス データを取得するために使用されます。InfoType パラメーターが ProviderInfoLspCategories に設定されている場合、成功すると WSCGetProviderInfo32 は、32 ビット LSP によって実装された適切な LSP カテゴリ フラグを設定した Info パラメーターとともに返ります。
Winsock 2 はレイヤード プロトコルに対応しています。レイヤード プロトコルとは、より高レベルの通信機能のみを実装し、リモート エンドポイントとの実際のデータ交換については下位のトランスポート スタックに依存するプロトコルです。レイヤード プロトコルまたはレイヤード サービス プロバイダーの例としては、認証を実行し、相互に合意した暗号化方式を確立するために、接続確立プロセスにプロトコルを追加するセキュリティ レイヤーが挙げられます。このようなセキュリティ プロトコルは、一般に TCP や SPX などの下位の信頼性の高いトランスポート プロトコルのサービスを必要とします。ベース プロトコルという用語は、リモート エンドポイントとのデータ通信を実行できる TCP や SPX などのプロトコルを指します。レイヤード プロトコルという用語は、単独では成立できないプロトコルを表すために使用されます。プロトコル チェーンとは、1 つ以上のレイヤード プロトコルが連結され、ベース プロトコルによって固定されたものとして定義されます。 ベース プロトコルでは、WSAProtocol_Info 構造体の ChainLen メンバーが、1 と定義されている BASE_PROTOCOL に設定されます。レイヤード プロトコルでは、WSAPROTOCOL_INFO 構造体の ChainLen メンバーが、ゼロと定義されている LAYERED_PROTOCOL に設定されます。プロトコル チェーンでは、WSAPROTOCOL_INFO 構造体の ChainLen メンバーが 1 より大きい値に設定されます。
LSP の初期化中に、LSP は多数の Winsock SPI 関数へのポインターを提供する必要があります。これらの関数は、通常の処理中に LSP の直上のレイヤー (別の LSP または Ws2_32.DLL) によって呼び出されます。
インストール可能ファイル システム (IFS) を実装する LSP は、自身が実装する関数へのポインターを提供するか、LSP の直下のレイヤーによって提供されるポインターを渡し戻すかを選択的に選ぶことができます。非 IFS LSP は、独自のハンドルを提供するため、すべての Winsock SPI 関数を実装する必要があります。これは、各 SPI で、LSP が作成したすべてのソケット ハンドルを下位プロバイダー (別の LSP またはベース プロトコル) のソケット ハンドルにマッピングする必要があるためです。
ただし、すべての LSP は、Winsock SPI 関数のサブセットに対してのみ追加処理を行うことで、それぞれ固有の作業を実行します。
LSP が実装する SPI 関数のサブセットと、それらの各関数に対して実行される追加処理の性質に基づいて、LSP カテゴリを定義することが可能です。
LSP を分類し、また Winsock ソケットを使用するアプリケーションを分類することで、実行時に特定のプロセスに LSP を関与させるべきかどうかを選択的に判断できるようになります。
Windows Vista 以降では、LSP は、Windows Sockets の呼び出しおよびデータとどのように相互作用するかに基づいて分類できます。LSP カテゴリとは、Winsock SPI 関数のサブセットにおける識別可能な動作のグループです。たとえば、HTTP コンテンツ フィルターはデータ インスペクター (LSP_INSPECTOR カテゴリ) として分類されます。LSP_INSPECTOR カテゴリは、データ転送 SPI 関数のパラメーターを検査しますが、変更はしません。アプリケーションは LSP のカテゴリを照会し、LSP カテゴリとアプリケーションが許可する LSP カテゴリのセットに基づいて、その LSP を読み込まないことを選択できます。
次の表は、LSP を分類できるカテゴリの一覧です。
| LSP カテゴリ | 説明 |
|---|---|
| **LSP_CRYPTO_COMPRESS** | LSP は暗号化またはデータ圧縮プロバイダーです。 |
| **LSP_FIREWALL** | LSP はファイアウォール プロバイダーです。 |
| **LSP_LOCAL_CACHE** | LSP はローカル キャッシュ プロバイダーです。 |
| **LSP_INBOUND_MODIFY** | LSP は受信データを変更します。 |
| **LSP_INSPECTOR** | LSP はデータを検査またはフィルター処理します。 |
| **LSP_OUTBOUND_MODIFY** | LSP は送信データを変更します。 |
| **LSP_PROXY** | LSP はプロキシとして動作し、パケットをリダイレクトします。 |
| **LSP_REDIRECTOR** | LSP はネットワーク リダイレクターです。 |
| **LSP_SYSTEM** | LSP はサービスおよびシステム プロセスでの使用に適しています。 |
LSP は複数のカテゴリに属する場合があります。たとえば、ファイアウォール/セキュリティ LSP は、インスペクター (LSP_INSPECTOR) とファイアウォール (LSP_FIREWALL) の両方のカテゴリに属することができます。
LSP にカテゴリが設定されていない場合、その LSP は All Other カテゴリに属するものと見なされます。この LSP カテゴリは、サービスやシステム プロセス (たとえば、lsass、winlogon、および多くの svchost プロセス) では読み込まれません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// WS2_32.dll
#include <windows.h>
INT WSCGetProviderInfo32(
GUID* lpProviderId,
WSC_PROVIDER_INFO_TYPE InfoType,
BYTE* Info,
UINT_PTR* InfoSize,
DWORD Flags,
INT* lpErrno
);[DllImport("WS2_32.dll", ExactSpelling = true)]
static extern int WSCGetProviderInfo32(
ref Guid lpProviderId, // GUID*
int InfoType, // WSC_PROVIDER_INFO_TYPE
IntPtr Info, // BYTE* out
ref UIntPtr InfoSize, // UINT_PTR* in/out
uint Flags, // DWORD
out int lpErrno // INT* out
);<DllImport("WS2_32.dll", ExactSpelling:=True)>
Public Shared Function WSCGetProviderInfo32(
ByRef lpProviderId As Guid, ' GUID*
InfoType As Integer, ' WSC_PROVIDER_INFO_TYPE
Info As IntPtr, ' BYTE* out
ByRef InfoSize As UIntPtr, ' UINT_PTR* in/out
Flags As UInteger, ' DWORD
<Out> ByRef lpErrno As Integer ' INT* out
) As Integer
End Function' lpProviderId : GUID*
' InfoType : WSC_PROVIDER_INFO_TYPE
' Info : BYTE* out
' InfoSize : UINT_PTR* in/out
' Flags : DWORD
' lpErrno : INT* out
Declare PtrSafe Function WSCGetProviderInfo32 Lib "ws2_32" ( _
ByVal lpProviderId As LongPtr, _
ByVal InfoType As Long, _
ByVal Info As LongPtr, _
ByRef InfoSize As LongPtr, _
ByVal Flags As Long, _
ByRef lpErrno As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
WSCGetProviderInfo32 = ctypes.windll.ws2_32.WSCGetProviderInfo32
WSCGetProviderInfo32.restype = ctypes.c_int
WSCGetProviderInfo32.argtypes = [
ctypes.c_void_p, # lpProviderId : GUID*
ctypes.c_int, # InfoType : WSC_PROVIDER_INFO_TYPE
ctypes.POINTER(ctypes.c_ubyte), # Info : BYTE* out
ctypes.POINTER(ctypes.c_size_t), # InfoSize : UINT_PTR* in/out
wintypes.DWORD, # Flags : DWORD
ctypes.POINTER(ctypes.c_int), # lpErrno : INT* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('WS2_32.dll')
WSCGetProviderInfo32 = Fiddle::Function.new(
lib['WSCGetProviderInfo32'],
[
Fiddle::TYPE_VOIDP, # lpProviderId : GUID*
Fiddle::TYPE_INT, # InfoType : WSC_PROVIDER_INFO_TYPE
Fiddle::TYPE_VOIDP, # Info : BYTE* out
Fiddle::TYPE_VOIDP, # InfoSize : UINT_PTR* in/out
-Fiddle::TYPE_INT, # Flags : DWORD
Fiddle::TYPE_VOIDP, # lpErrno : INT* out
],
Fiddle::TYPE_INT)#[link(name = "ws2_32")]
extern "system" {
fn WSCGetProviderInfo32(
lpProviderId: *mut GUID, // GUID*
InfoType: i32, // WSC_PROVIDER_INFO_TYPE
Info: *mut u8, // BYTE* out
InfoSize: *mut usize, // UINT_PTR* in/out
Flags: u32, // DWORD
lpErrno: *mut i32 // INT* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("WS2_32.dll")]
public static extern int WSCGetProviderInfo32(ref Guid lpProviderId, int InfoType, IntPtr Info, ref UIntPtr InfoSize, uint Flags, out int lpErrno);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSCGetProviderInfo32' -Namespace Win32 -PassThru
# $api::WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)#uselib "WS2_32.dll"
#func global WSCGetProviderInfo32 "WSCGetProviderInfo32" sptr, sptr, sptr, sptr, sptr, sptr
; WSCGetProviderInfo32 varptr(lpProviderId), InfoType, varptr(Info), varptr(InfoSize), Flags, varptr(lpErrno) ; 戻り値は stat
; lpProviderId : GUID* -> "sptr"
; InfoType : WSC_PROVIDER_INFO_TYPE -> "sptr"
; Info : BYTE* out -> "sptr"
; InfoSize : UINT_PTR* in/out -> "sptr"
; Flags : DWORD -> "sptr"
; lpErrno : INT* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "WS2_32.dll" #cfunc global WSCGetProviderInfo32 "WSCGetProviderInfo32" var, int, var, var, int, var ; res = WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno) ; lpProviderId : GUID* -> "var" ; InfoType : WSC_PROVIDER_INFO_TYPE -> "int" ; Info : BYTE* out -> "var" ; InfoSize : UINT_PTR* in/out -> "var" ; Flags : DWORD -> "int" ; lpErrno : INT* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "WS2_32.dll" #cfunc global WSCGetProviderInfo32 "WSCGetProviderInfo32" sptr, int, sptr, sptr, int, sptr ; res = WSCGetProviderInfo32(varptr(lpProviderId), InfoType, varptr(Info), varptr(InfoSize), Flags, varptr(lpErrno)) ; lpProviderId : GUID* -> "sptr" ; InfoType : WSC_PROVIDER_INFO_TYPE -> "int" ; Info : BYTE* out -> "sptr" ; InfoSize : UINT_PTR* in/out -> "sptr" ; Flags : DWORD -> "int" ; lpErrno : INT* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; INT WSCGetProviderInfo32(GUID* lpProviderId, WSC_PROVIDER_INFO_TYPE InfoType, BYTE* Info, UINT_PTR* InfoSize, DWORD Flags, INT* lpErrno) #uselib "WS2_32.dll" #cfunc global WSCGetProviderInfo32 "WSCGetProviderInfo32" var, int, var, var, int, var ; res = WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno) ; lpProviderId : GUID* -> "var" ; InfoType : WSC_PROVIDER_INFO_TYPE -> "int" ; Info : BYTE* out -> "var" ; InfoSize : UINT_PTR* in/out -> "var" ; Flags : DWORD -> "int" ; lpErrno : INT* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; INT WSCGetProviderInfo32(GUID* lpProviderId, WSC_PROVIDER_INFO_TYPE InfoType, BYTE* Info, UINT_PTR* InfoSize, DWORD Flags, INT* lpErrno) #uselib "WS2_32.dll" #cfunc global WSCGetProviderInfo32 "WSCGetProviderInfo32" intptr, int, intptr, intptr, int, intptr ; res = WSCGetProviderInfo32(varptr(lpProviderId), InfoType, varptr(Info), varptr(InfoSize), Flags, varptr(lpErrno)) ; lpProviderId : GUID* -> "intptr" ; InfoType : WSC_PROVIDER_INFO_TYPE -> "int" ; Info : BYTE* out -> "intptr" ; InfoSize : UINT_PTR* in/out -> "intptr" ; Flags : DWORD -> "int" ; lpErrno : INT* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
procWSCGetProviderInfo32 = ws2_32.NewProc("WSCGetProviderInfo32")
)
// lpProviderId (GUID*), InfoType (WSC_PROVIDER_INFO_TYPE), Info (BYTE* out), InfoSize (UINT_PTR* in/out), Flags (DWORD), lpErrno (INT* out)
r1, _, err := procWSCGetProviderInfo32.Call(
uintptr(lpProviderId),
uintptr(InfoType),
uintptr(Info),
uintptr(InfoSize),
uintptr(Flags),
uintptr(lpErrno),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // INTfunction WSCGetProviderInfo32(
lpProviderId: PGUID; // GUID*
InfoType: Integer; // WSC_PROVIDER_INFO_TYPE
Info: Pointer; // BYTE* out
InfoSize: Pointer; // UINT_PTR* in/out
Flags: DWORD; // DWORD
lpErrno: Pointer // INT* out
): Integer; stdcall;
external 'WS2_32.dll' name 'WSCGetProviderInfo32';result := DllCall("WS2_32\WSCGetProviderInfo32"
, "Ptr", lpProviderId ; GUID*
, "Int", InfoType ; WSC_PROVIDER_INFO_TYPE
, "Ptr", Info ; BYTE* out
, "Ptr", InfoSize ; UINT_PTR* in/out
, "UInt", Flags ; DWORD
, "Ptr", lpErrno ; INT* out
, "Int") ; return: INT●WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno) = DLL("WS2_32.dll", "int WSCGetProviderInfo32(void*, int, void*, void*, dword, void*)")
# 呼び出し: WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)
# lpProviderId : GUID* -> "void*"
# InfoType : WSC_PROVIDER_INFO_TYPE -> "int"
# Info : BYTE* out -> "void*"
# InfoSize : UINT_PTR* in/out -> "void*"
# Flags : DWORD -> "dword"
# lpErrno : INT* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "ws2_32" fn WSCGetProviderInfo32(
lpProviderId: [*c]GUID, // GUID*
InfoType: i32, // WSC_PROVIDER_INFO_TYPE
Info: [*c]u8, // BYTE* out
InfoSize: [*c]usize, // UINT_PTR* in/out
Flags: u32, // DWORD
lpErrno: [*c]i32 // INT* out
) callconv(std.os.windows.WINAPI) i32;proc WSCGetProviderInfo32(
lpProviderId: ptr GUID, # GUID*
InfoType: int32, # WSC_PROVIDER_INFO_TYPE
Info: ptr uint8, # BYTE* out
InfoSize: ptr uint, # UINT_PTR* in/out
Flags: uint32, # DWORD
lpErrno: ptr int32 # INT* out
): int32 {.importc: "WSCGetProviderInfo32", stdcall, dynlib: "WS2_32.dll".}pragma(lib, "ws2_32");
extern(Windows)
int WSCGetProviderInfo32(
GUID* lpProviderId, // GUID*
int InfoType, // WSC_PROVIDER_INFO_TYPE
ubyte* Info, // BYTE* out
size_t* InfoSize, // UINT_PTR* in/out
uint Flags, // DWORD
int* lpErrno // INT* out
);ccall((:WSCGetProviderInfo32, "WS2_32.dll"), stdcall, Int32,
(Ptr{GUID}, Int32, Ptr{UInt8}, Ptr{Csize_t}, UInt32, Ptr{Int32}),
lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)
# lpProviderId : GUID* -> Ptr{GUID}
# InfoType : WSC_PROVIDER_INFO_TYPE -> Int32
# Info : BYTE* out -> Ptr{UInt8}
# InfoSize : UINT_PTR* in/out -> Ptr{Csize_t}
# Flags : DWORD -> UInt32
# lpErrno : INT* out -> Ptr{Int32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t WSCGetProviderInfo32(
void* lpProviderId,
int32_t InfoType,
uint8_t* Info,
uintptr_t* InfoSize,
uint32_t Flags,
int32_t* lpErrno);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)
-- lpProviderId : GUID*
-- InfoType : WSC_PROVIDER_INFO_TYPE
-- Info : BYTE* out
-- InfoSize : UINT_PTR* in/out
-- Flags : DWORD
-- lpErrno : INT* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const WSCGetProviderInfo32 = lib.func('__stdcall', 'WSCGetProviderInfo32', 'int32_t', ['void *', 'int32_t', 'uint8_t *', 'uintptr_t *', 'uint32_t', 'int32_t *']);
// WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)
// lpProviderId : GUID* -> 'void *'
// InfoType : WSC_PROVIDER_INFO_TYPE -> 'int32_t'
// Info : BYTE* out -> 'uint8_t *'
// InfoSize : UINT_PTR* in/out -> 'uintptr_t *'
// Flags : DWORD -> 'uint32_t'
// lpErrno : INT* out -> 'int32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("WS2_32.dll", {
WSCGetProviderInfo32: { parameters: ["pointer", "i32", "pointer", "pointer", "u32", "pointer"], result: "i32" },
});
// lib.symbols.WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno)
// lpProviderId : GUID* -> "pointer"
// InfoType : WSC_PROVIDER_INFO_TYPE -> "i32"
// Info : BYTE* out -> "pointer"
// InfoSize : UINT_PTR* in/out -> "pointer"
// Flags : DWORD -> "u32"
// lpErrno : INT* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t WSCGetProviderInfo32(
void* lpProviderId,
int32_t InfoType,
uint8_t* Info,
size_t* InfoSize,
uint32_t Flags,
int32_t* lpErrno);
C, "WS2_32.dll");
// $ffi->WSCGetProviderInfo32(lpProviderId, InfoType, Info, InfoSize, Flags, lpErrno);
// lpProviderId : GUID*
// InfoType : WSC_PROVIDER_INFO_TYPE
// Info : BYTE* out
// InfoSize : UINT_PTR* in/out
// Flags : DWORD
// lpErrno : INT* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Ws2_32 extends StdCallLibrary {
Ws2_32 INSTANCE = Native.load("ws2_32", Ws2_32.class);
int WSCGetProviderInfo32(
Pointer lpProviderId, // GUID*
int InfoType, // WSC_PROVIDER_INFO_TYPE
byte[] Info, // BYTE* out
LongByReference InfoSize, // UINT_PTR* in/out
int Flags, // DWORD
IntByReference lpErrno // INT* out
);
}@[Link("ws2_32")]
lib LibWS2_32
fun WSCGetProviderInfo32 = WSCGetProviderInfo32(
lpProviderId : GUID*, # GUID*
InfoType : Int32, # WSC_PROVIDER_INFO_TYPE
Info : UInt8*, # BYTE* out
InfoSize : LibC::SizeT*, # UINT_PTR* in/out
Flags : UInt32, # DWORD
lpErrno : Int32* # INT* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef WSCGetProviderInfo32Native = Int32 Function(Pointer<Void>, Int32, Pointer<Uint8>, Pointer<UintPtr>, Uint32, Pointer<Int32>);
typedef WSCGetProviderInfo32Dart = int Function(Pointer<Void>, int, Pointer<Uint8>, Pointer<UintPtr>, int, Pointer<Int32>);
final WSCGetProviderInfo32 = DynamicLibrary.open('WS2_32.dll')
.lookupFunction<WSCGetProviderInfo32Native, WSCGetProviderInfo32Dart>('WSCGetProviderInfo32');
// lpProviderId : GUID* -> Pointer<Void>
// InfoType : WSC_PROVIDER_INFO_TYPE -> Int32
// Info : BYTE* out -> Pointer<Uint8>
// InfoSize : UINT_PTR* in/out -> Pointer<UintPtr>
// Flags : DWORD -> Uint32
// lpErrno : INT* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function WSCGetProviderInfo32(
lpProviderId: PGUID; // GUID*
InfoType: Integer; // WSC_PROVIDER_INFO_TYPE
Info: Pointer; // BYTE* out
InfoSize: Pointer; // UINT_PTR* in/out
Flags: DWORD; // DWORD
lpErrno: Pointer // INT* out
): Integer; stdcall;
external 'WS2_32.dll' name 'WSCGetProviderInfo32';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "WSCGetProviderInfo32"
c_WSCGetProviderInfo32 :: Ptr () -> Int32 -> Ptr Word8 -> Ptr CUIntPtr -> Word32 -> Ptr Int32 -> IO Int32
-- lpProviderId : GUID* -> Ptr ()
-- InfoType : WSC_PROVIDER_INFO_TYPE -> Int32
-- Info : BYTE* out -> Ptr Word8
-- InfoSize : UINT_PTR* in/out -> Ptr CUIntPtr
-- Flags : DWORD -> Word32
-- lpErrno : INT* out -> Ptr Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let wscgetproviderinfo32 =
foreign "WSCGetProviderInfo32"
((ptr void) @-> int32_t @-> (ptr uint8_t) @-> (ptr size_t) @-> uint32_t @-> (ptr int32_t) @-> returning int32_t)
(* lpProviderId : GUID* -> (ptr void) *)
(* InfoType : WSC_PROVIDER_INFO_TYPE -> int32_t *)
(* Info : BYTE* out -> (ptr uint8_t) *)
(* InfoSize : UINT_PTR* in/out -> (ptr size_t) *)
(* Flags : DWORD -> uint32_t *)
(* lpErrno : INT* out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)
(cffi:defcfun ("WSCGetProviderInfo32" wscget-provider-info32 :convention :stdcall) :int32
(lp-provider-id :pointer) ; GUID*
(info-type :int32) ; WSC_PROVIDER_INFO_TYPE
(info :pointer) ; BYTE* out
(info-size :pointer) ; UINT_PTR* in/out
(flags :uint32) ; DWORD
(lp-errno :pointer)) ; INT* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $WSCGetProviderInfo32 = Win32::API::More->new('WS2_32',
'int WSCGetProviderInfo32(LPVOID lpProviderId, int InfoType, LPVOID Info, LPVOID InfoSize, DWORD Flags, LPVOID lpErrno)');
# my $ret = $WSCGetProviderInfo32->Call($lpProviderId, $InfoType, $Info, $InfoSize, $Flags, $lpErrno);
# lpProviderId : GUID* -> LPVOID
# InfoType : WSC_PROVIDER_INFO_TYPE -> int
# Info : BYTE* out -> LPVOID
# InfoSize : UINT_PTR* in/out -> LPVOID
# Flags : DWORD -> DWORD
# lpErrno : INT* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f WSCGetProviderInfo — プロバイダーの追加情報を取得する。
- s WSAPROTOCOL_INFOW
- f WSCGetApplicationCategory — アプリケーションのLSPカテゴリ許可を取得する。
- f WSCSetApplicationCategory — アプリケーションのLSPカテゴリ許可を設定する。
- f WSCSetProviderInfo32 — 32ビットカタログのプロバイダ情報を設定する。