WlanSetPsdIEDataList
関数シグネチャ
// wlanapi.dll
#include <windows.h>
DWORD WlanSetPsdIEDataList(
HANDLE hClientHandle,
LPCWSTR strFormat, // optional
const WLAN_RAW_DATA_LIST* pPsdIEDataList, // optional
void* pReserved // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hClientHandle | HANDLE | in | クライアントのセッションハンドル。WlanOpenHandle 関数を事前に呼び出して取得します。 |
| strFormat | LPCWSTR | inoptional | pPsdIEDataList パラメーターで渡される PSD IE データリスト内の PSD IE の形式です。これは、探索に使用するプロトコルの名前空間を指定する NULL 終端の URI 文字列です。 |
| pPsdIEDataList | WLAN_RAW_DATA_LIST* | inoptional | 設定する PSD IE データリストを格納した WLAN_RAW_DATA_LIST 構造体へのポインターです。 |
| pReserved | void* | optional | 将来の使用のために予約されています。NULL に設定する必要があります。 |
戻り値の型: DWORD
公式ドキュメント
近接サービス探索 (PSD) 情報要素 (IE) データリストを設定します。
戻り値
関数が成功した場合、戻り値は ERROR_SUCCESS です。
関数が失敗した場合、戻り値は次のいずれかのリターンコードになることがあります。
| リターンコード | 説明 |
|---|---|
| パラメーターが正しくありません。このエラーは、hClientHandle が NULL または無効である場合、あるいは pReserved が NULL でない場合に返されます。 | |
| ハンドル hClientHandle がハンドルテーブル内に見つかりませんでした。 | |
| この関数がサポートされていないプラットフォームから呼び出されました。この値は、Windows XP with SP3 または Wireless LAN API for Windows XP with SP2 のクライアントから関数が呼び出された場合に返されます。 | |
|
さまざまなエラーコードです。 |
解説(Remarks)
Proximity Service Discovery Protocol は、クライアントが物理的な近接範囲 (電波の到達範囲によって定義されます) 内のサービスを探索できるようにする Microsoft 独自のプロトコルです。Proximity Service Discovery Protocol の目的は、サービスのアドバタイズなどのサービス探索情報を Beacon フレームの一部として伝達することです。アクセスポイント (AP) およびアドホックモードで動作するステーション (STA) は、ビーコンフレームを定期的にブロードキャストします。ビーコンフレームには、デバイスが提供するサービスに関する探索情報を伝える単一または複数の独自情報要素を含めることができます。
PSD IE は、パッシブ探索を目的として上位レベルの探索プロトコルから提供された圧縮情報を送信するために使用されます。そうした上位レベルの探索用プロトコルの 1 つに WS-Discovery プロトコルがあります。探索には任意のプロトコルを使用できます。
Wireless LAN Service がインストールされた Windows Vista および Windows Server 2008 は、アドホッククライアント、アドホックサービス、およびインフラストラクチャクライアントのパッシブ探索をサポートします。つまり、アドホックサービスは、1 つ以上のビーコンで PSD IE を送信することにより、利用可能なリソースやサービスをアドバタイズできます。ただし、このビーコンがアドホッククライアントまたはインフラストラクチャクライアントによって受信される保証はありません。
Wireless LAN Service がインストールされた Windows 7 および Windows Server 2008 R2 は、Windows Vista と同じ方法で、アドホッククライアント、アドホックサービス、およびインフラストラクチャクライアントのパッシブ探索をサポートします。さらに、PSD IE はソフトウェアベースの無線アクセスポイント (AP) であるワイヤレス ホステッド ネットワークでもサポートされます。ワイヤレス ホステッド ネットワークを実行するローカルコンピューター上のアプリケーションは、ワイヤレス ホステッド ネットワークを開始する前に WlanSetPsdIeDataList 関数を使用して PSD IE を設定できます。いったん設定すると、ワイヤレス ホステッド ネットワークの開始後、PSD IE はビーコンおよびプローブ応答に含められます。
ビーコンを送受信する各アプリケーションは、独自の PSD IE データリストを保持します。pPsdIEDataList パラメーターは、アプリケーションが生成した PSD IE のリストを指します。各 PSD IE の形式は次のとおりです。
| フィールド | 説明と値 |
|---|---|
| Element ID (1 バイト) | 221 |
| Length (1 バイト) | Data フィールドの長さ (バイト単位) に 8 を加えた値。 |
| OUI (3 バイト) | Organizational Unique Identifier (OUI) には 00-50-F2 の値を格納する必要があります。このパブリック OUI は Microsoft に登録されています。 |
| OUI Type (1 バイト) | Proximity Service Discovery Protocol の場合、OUI Type には 6 の値を格納する必要があります。 |
| Format identifier hash (4 バイト) | strFormat パラメーターから計算された HMAC のビット 31-0。 |
| Data (可変長) | 探索用のユーザー定義データを格納します。このフィールドの長さは 240 バイトを超えてはなりません。 |
Format identifier hash フィールドは、PSD IE で伝達される情報の形式を表します。形式識別子を中央で管理する必要をなくしつつ一意性を確保するため、形式の区別には RFC 3986 で規定された Uniform Resource Identifier (URI) 形式の文字列が使用されます。ただし、送信は効率的である必要があり、情報要素内の領域は限られているため、実際には文字列そのものではなくそのハッシュが送信されます。ビーコンの受信側であるクライアントでは、このハッシュが既知の形式識別子のセットと照合されます。
Format identifier hash フィールドは、strFormat パラメーターで指定された形式識別子文字列に対するハッシュベースメッセージ認証コード (HMAC) のビット 0…31 で表されます。HMAC は、PSD IE の Data フィールドの形式を指定するために使用されます。HMAC の計算に使用する式は RFC 2104 に記載されています。HMAC を計算するサンプルコードは RFC 4634 に規定されているとおりです。HMAC を計算する際は、ハッシュ関数に SHA-256 を使用します。使用するキーは "null" キーです (RFC 4634 のソースコードに従い、認証キーへの NULL ポインターおよび長さ 0 の認証キー)。入力テキストには、strFormat パラメーターの値 (空白は含み、NULL 終端文字は除く) を、リトルエンディアン形式の Unicode UTF-16 としてエンコードして使用します。
たとえば、strFormat パラメーターが http://schemas.xmlsoaps.org/ws/2004/10/discovery の場合、対応する HMAC の最初の 4 オクテットは 0xF8 0xCB 0x35 0x15 になります。
strFormat パラメーターが http://schemas.microsoft.com/networking/discoveryformat/v2 の場合、対応する HMAC の 4 オクテットは 0xCF 0xF1 0x64 0x17 になります。
HMAC の最初の 4 オクテットをネットワーク経由で送信する場合は、最初の (最も左の) オクテットから送信します。
切り詰められた HMAC では衝突が発生する可能性があることに注意してください。つまり、与えられた HMAC のビットから PSD IE のペイロードに対応する探索プロトコルを一意に特定できない場合があります。PSD IE を受信したアプリケーションは、与えられた HMAC から使用されている探索プロトコルを最善の推測で判断し、接続が確立された後に上位レベルの探索プロトコルを再実行する必要があります。
1 つのリストで渡せる PSD IE は最大 5 個です。また、PSD IE リストの合計の長さ (バイト単位) は、ビーコンの長さに関するハードウェアの制限によって制約される場合があります。
アプリケーションは WlanSetPsdIeDataList を何度でも呼び出すことができます。同じ strFormat で WlanSetPsdIeDataList を 2 回呼び出した場合、1 回目の呼び出しで設定された WLAN_RAW_DATA_LIST の内容は、2 回目の呼び出しの WLAN_RAW_DATA_LIST のペイロードによって上書きされます。pPsdIEDataList パラメーターを NULL に設定して WlanSetPsdIeDataList を呼び出した場合、strFormat に関連付けられた PSD IE リストがクリアされます。pPsdIEDataList と strFormat の両方のパラメーターを NULL に設定して WlanSetPsdIeDataList を呼び出した場合、そのアプリケーションが設定したすべての PSD IE リストがクリアされます。
ワイヤレスサービスは、異なるアプリケーションによって設定された PSD IE データリストを処理し、生の IE データ BLOB を生成します。マシンが任意のワイヤレスアダプターでアドホックネットワークを作成または参加すると、そのネットワークに関連付けられた PSD IE データ BLOB を含むビーコンを他のマシンへ送信します。
ステーションは、マシンからビーコンを受信した後、WlanExtractPsdIEDataList 関数を呼び出して PSD IE データリストを取得できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// wlanapi.dll
#include <windows.h>
DWORD WlanSetPsdIEDataList(
HANDLE hClientHandle,
LPCWSTR strFormat, // optional
const WLAN_RAW_DATA_LIST* pPsdIEDataList, // optional
void* pReserved // optional
);[DllImport("wlanapi.dll", ExactSpelling = true)]
static extern uint WlanSetPsdIEDataList(
IntPtr hClientHandle, // HANDLE
[MarshalAs(UnmanagedType.LPWStr)] string strFormat, // LPCWSTR optional
IntPtr pPsdIEDataList, // WLAN_RAW_DATA_LIST* optional
IntPtr pReserved // void* optional
);<DllImport("wlanapi.dll", ExactSpelling:=True)>
Public Shared Function WlanSetPsdIEDataList(
hClientHandle As IntPtr, ' HANDLE
<MarshalAs(UnmanagedType.LPWStr)> strFormat As String, ' LPCWSTR optional
pPsdIEDataList As IntPtr, ' WLAN_RAW_DATA_LIST* optional
pReserved As IntPtr ' void* optional
) As UInteger
End Function' hClientHandle : HANDLE
' strFormat : LPCWSTR optional
' pPsdIEDataList : WLAN_RAW_DATA_LIST* optional
' pReserved : void* optional
Declare PtrSafe Function WlanSetPsdIEDataList Lib "wlanapi" ( _
ByVal hClientHandle As LongPtr, _
ByVal strFormat As LongPtr, _
ByVal pPsdIEDataList As LongPtr, _
ByVal pReserved As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
WlanSetPsdIEDataList = ctypes.windll.wlanapi.WlanSetPsdIEDataList
WlanSetPsdIEDataList.restype = wintypes.DWORD
WlanSetPsdIEDataList.argtypes = [
wintypes.HANDLE, # hClientHandle : HANDLE
wintypes.LPCWSTR, # strFormat : LPCWSTR optional
ctypes.c_void_p, # pPsdIEDataList : WLAN_RAW_DATA_LIST* optional
ctypes.POINTER(None), # pReserved : void* optional
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('wlanapi.dll')
WlanSetPsdIEDataList = Fiddle::Function.new(
lib['WlanSetPsdIEDataList'],
[
Fiddle::TYPE_VOIDP, # hClientHandle : HANDLE
Fiddle::TYPE_VOIDP, # strFormat : LPCWSTR optional
Fiddle::TYPE_VOIDP, # pPsdIEDataList : WLAN_RAW_DATA_LIST* optional
Fiddle::TYPE_VOIDP, # pReserved : void* optional
],
-Fiddle::TYPE_INT)#[link(name = "wlanapi")]
extern "system" {
fn WlanSetPsdIEDataList(
hClientHandle: *mut core::ffi::c_void, // HANDLE
strFormat: *const u16, // LPCWSTR optional
pPsdIEDataList: *const WLAN_RAW_DATA_LIST, // WLAN_RAW_DATA_LIST* optional
pReserved: *mut () // void* optional
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("wlanapi.dll")]
public static extern uint WlanSetPsdIEDataList(IntPtr hClientHandle, [MarshalAs(UnmanagedType.LPWStr)] string strFormat, IntPtr pPsdIEDataList, IntPtr pReserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'wlanapi_WlanSetPsdIEDataList' -Namespace Win32 -PassThru
# $api::WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved)#uselib "wlanapi.dll"
#func global WlanSetPsdIEDataList "WlanSetPsdIEDataList" sptr, sptr, sptr, sptr
; WlanSetPsdIEDataList hClientHandle, strFormat, varptr(pPsdIEDataList), pReserved ; 戻り値は stat
; hClientHandle : HANDLE -> "sptr"
; strFormat : LPCWSTR optional -> "sptr"
; pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "sptr"
; pReserved : void* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "wlanapi.dll" #cfunc global WlanSetPsdIEDataList "WlanSetPsdIEDataList" sptr, wstr, var, sptr ; res = WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved) ; hClientHandle : HANDLE -> "sptr" ; strFormat : LPCWSTR optional -> "wstr" ; pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "var" ; pReserved : void* optional -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "wlanapi.dll" #cfunc global WlanSetPsdIEDataList "WlanSetPsdIEDataList" sptr, wstr, sptr, sptr ; res = WlanSetPsdIEDataList(hClientHandle, strFormat, varptr(pPsdIEDataList), pReserved) ; hClientHandle : HANDLE -> "sptr" ; strFormat : LPCWSTR optional -> "wstr" ; pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "sptr" ; pReserved : void* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; DWORD WlanSetPsdIEDataList(HANDLE hClientHandle, LPCWSTR strFormat, WLAN_RAW_DATA_LIST* pPsdIEDataList, void* pReserved) #uselib "wlanapi.dll" #cfunc global WlanSetPsdIEDataList "WlanSetPsdIEDataList" intptr, wstr, var, intptr ; res = WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved) ; hClientHandle : HANDLE -> "intptr" ; strFormat : LPCWSTR optional -> "wstr" ; pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "var" ; pReserved : void* optional -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; DWORD WlanSetPsdIEDataList(HANDLE hClientHandle, LPCWSTR strFormat, WLAN_RAW_DATA_LIST* pPsdIEDataList, void* pReserved) #uselib "wlanapi.dll" #cfunc global WlanSetPsdIEDataList "WlanSetPsdIEDataList" intptr, wstr, intptr, intptr ; res = WlanSetPsdIEDataList(hClientHandle, strFormat, varptr(pPsdIEDataList), pReserved) ; hClientHandle : HANDLE -> "intptr" ; strFormat : LPCWSTR optional -> "wstr" ; pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "intptr" ; pReserved : void* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
wlanapi = windows.NewLazySystemDLL("wlanapi.dll")
procWlanSetPsdIEDataList = wlanapi.NewProc("WlanSetPsdIEDataList")
)
// hClientHandle (HANDLE), strFormat (LPCWSTR optional), pPsdIEDataList (WLAN_RAW_DATA_LIST* optional), pReserved (void* optional)
r1, _, err := procWlanSetPsdIEDataList.Call(
uintptr(hClientHandle),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(strFormat))),
uintptr(pPsdIEDataList),
uintptr(pReserved),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // DWORDfunction WlanSetPsdIEDataList(
hClientHandle: THandle; // HANDLE
strFormat: PWideChar; // LPCWSTR optional
pPsdIEDataList: Pointer; // WLAN_RAW_DATA_LIST* optional
pReserved: Pointer // void* optional
): DWORD; stdcall;
external 'wlanapi.dll' name 'WlanSetPsdIEDataList';result := DllCall("wlanapi\WlanSetPsdIEDataList"
, "Ptr", hClientHandle ; HANDLE
, "WStr", strFormat ; LPCWSTR optional
, "Ptr", pPsdIEDataList ; WLAN_RAW_DATA_LIST* optional
, "Ptr", pReserved ; void* optional
, "UInt") ; return: DWORD●WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved) = DLL("wlanapi.dll", "dword WlanSetPsdIEDataList(void*, char*, void*, void*)")
# 呼び出し: WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved)
# hClientHandle : HANDLE -> "void*"
# strFormat : LPCWSTR optional -> "char*"
# pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "void*"
# pReserved : void* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "wlanapi" fn WlanSetPsdIEDataList(
hClientHandle: ?*anyopaque, // HANDLE
strFormat: [*c]const u16, // LPCWSTR optional
pPsdIEDataList: [*c]WLAN_RAW_DATA_LIST, // WLAN_RAW_DATA_LIST* optional
pReserved: ?*anyopaque // void* optional
) callconv(std.os.windows.WINAPI) u32;proc WlanSetPsdIEDataList(
hClientHandle: pointer, # HANDLE
strFormat: WideCString, # LPCWSTR optional
pPsdIEDataList: ptr WLAN_RAW_DATA_LIST, # WLAN_RAW_DATA_LIST* optional
pReserved: pointer # void* optional
): uint32 {.importc: "WlanSetPsdIEDataList", stdcall, dynlib: "wlanapi.dll".}pragma(lib, "wlanapi");
extern(Windows)
uint WlanSetPsdIEDataList(
void* hClientHandle, // HANDLE
const(wchar)* strFormat, // LPCWSTR optional
WLAN_RAW_DATA_LIST* pPsdIEDataList, // WLAN_RAW_DATA_LIST* optional
void* pReserved // void* optional
);ccall((:WlanSetPsdIEDataList, "wlanapi.dll"), stdcall, UInt32,
(Ptr{Cvoid}, Cwstring, Ptr{WLAN_RAW_DATA_LIST}, Ptr{Cvoid}),
hClientHandle, strFormat, pPsdIEDataList, pReserved)
# hClientHandle : HANDLE -> Ptr{Cvoid}
# strFormat : LPCWSTR optional -> Cwstring
# pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> Ptr{WLAN_RAW_DATA_LIST}
# pReserved : void* optional -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t WlanSetPsdIEDataList(
void* hClientHandle,
const uint16_t* strFormat,
void* pPsdIEDataList,
void* pReserved);
]]
local wlanapi = ffi.load("wlanapi")
-- wlanapi.WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved)
-- hClientHandle : HANDLE
-- strFormat : LPCWSTR optional
-- pPsdIEDataList : WLAN_RAW_DATA_LIST* optional
-- pReserved : void* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('wlanapi.dll');
const WlanSetPsdIEDataList = lib.func('__stdcall', 'WlanSetPsdIEDataList', 'uint32_t', ['void *', 'str16', 'void *', 'void *']);
// WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved)
// hClientHandle : HANDLE -> 'void *'
// strFormat : LPCWSTR optional -> 'str16'
// pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> 'void *'
// pReserved : void* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("wlanapi.dll", {
WlanSetPsdIEDataList: { parameters: ["pointer", "buffer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved)
// hClientHandle : HANDLE -> "pointer"
// strFormat : LPCWSTR optional -> "buffer"
// pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> "pointer"
// pReserved : void* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t WlanSetPsdIEDataList(
void* hClientHandle,
const uint16_t* strFormat,
void* pPsdIEDataList,
void* pReserved);
C, "wlanapi.dll");
// $ffi->WlanSetPsdIEDataList(hClientHandle, strFormat, pPsdIEDataList, pReserved);
// hClientHandle : HANDLE
// strFormat : LPCWSTR optional
// pPsdIEDataList : WLAN_RAW_DATA_LIST* optional
// pReserved : void* optional
// 構造体/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 Wlanapi extends StdCallLibrary {
Wlanapi INSTANCE = Native.load("wlanapi", Wlanapi.class);
int WlanSetPsdIEDataList(
Pointer hClientHandle, // HANDLE
WString strFormat, // LPCWSTR optional
Pointer pPsdIEDataList, // WLAN_RAW_DATA_LIST* optional
Pointer pReserved // void* optional
);
}@[Link("wlanapi")]
lib Libwlanapi
fun WlanSetPsdIEDataList = WlanSetPsdIEDataList(
hClientHandle : Void*, # HANDLE
strFormat : UInt16*, # LPCWSTR optional
pPsdIEDataList : WLAN_RAW_DATA_LIST*, # WLAN_RAW_DATA_LIST* optional
pReserved : Void* # void* optional
) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef WlanSetPsdIEDataListNative = Uint32 Function(Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
typedef WlanSetPsdIEDataListDart = int Function(Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
final WlanSetPsdIEDataList = DynamicLibrary.open('wlanapi.dll')
.lookupFunction<WlanSetPsdIEDataListNative, WlanSetPsdIEDataListDart>('WlanSetPsdIEDataList');
// hClientHandle : HANDLE -> Pointer<Void>
// strFormat : LPCWSTR optional -> Pointer<Utf16>
// pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> Pointer<Void>
// pReserved : void* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function WlanSetPsdIEDataList(
hClientHandle: THandle; // HANDLE
strFormat: PWideChar; // LPCWSTR optional
pPsdIEDataList: Pointer; // WLAN_RAW_DATA_LIST* optional
pReserved: Pointer // void* optional
): DWORD; stdcall;
external 'wlanapi.dll' name 'WlanSetPsdIEDataList';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "WlanSetPsdIEDataList"
c_WlanSetPsdIEDataList :: Ptr () -> CWString -> Ptr () -> Ptr () -> IO Word32
-- hClientHandle : HANDLE -> Ptr ()
-- strFormat : LPCWSTR optional -> CWString
-- pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> Ptr ()
-- pReserved : void* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let wlansetpsdiedatalist =
foreign "WlanSetPsdIEDataList"
((ptr void) @-> (ptr uint16_t) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* hClientHandle : HANDLE -> (ptr void) *)
(* strFormat : LPCWSTR optional -> (ptr uint16_t) *)
(* pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> (ptr void) *)
(* pReserved : void* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library wlanapi (t "wlanapi.dll"))
(cffi:use-foreign-library wlanapi)
(cffi:defcfun ("WlanSetPsdIEDataList" wlan-set-psd-iedata-list :convention :stdcall) :uint32
(h-client-handle :pointer) ; HANDLE
(str-format (:string :encoding :utf-16le)) ; LPCWSTR optional
(p-psd-iedata-list :pointer) ; WLAN_RAW_DATA_LIST* optional
(p-reserved :pointer)) ; void* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $WlanSetPsdIEDataList = Win32::API::More->new('wlanapi',
'DWORD WlanSetPsdIEDataList(HANDLE hClientHandle, LPCWSTR strFormat, LPVOID pPsdIEDataList, LPVOID pReserved)');
# my $ret = $WlanSetPsdIEDataList->Call($hClientHandle, $strFormat, $pPsdIEDataList, $pReserved);
# hClientHandle : HANDLE -> HANDLE
# strFormat : LPCWSTR optional -> LPCWSTR
# pPsdIEDataList : WLAN_RAW_DATA_LIST* optional -> LPVOID
# pReserved : void* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f WlanExtractPsdIEDataList — 生IEデータからPSD情報要素データリストを抽出する。
- f WlanScan — 無線LANインターフェイスで利用可能なネットワークを走査する。