Icmp6SendEcho2
関数シグネチャ
// IPHLPAPI.dll
#include <windows.h>
DWORD Icmp6SendEcho2(
HANDLE IcmpHandle,
HANDLE Event, // optional
PIO_APC_ROUTINE ApcRoutine, // optional
void* ApcContext, // optional
SOCKADDR_IN6* SourceAddress,
SOCKADDR_IN6* DestinationAddress,
void* RequestData,
WORD RequestSize,
IP_OPTION_INFORMATION* RequestOptions, // optional
void* ReplyBuffer,
DWORD ReplySize,
DWORD Timeout
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| IcmpHandle | HANDLE | in | Icmp6CreateFile が返したオープン済みのハンドル。 |
| Event | HANDLE | inoptional | ICMPv6 応答が到着するたびにシグナル状態になるイベント。このパラメーターを指定する場合は、有効なイベントオブジェクトへのハンドルが必要です。このイベントオブジェクトを作成するには、 CreateEvent または CreateEventEx 関数を使用します。 イベントの使用方法の詳細については、Event Objects を参照してください。 |
| ApcRoutine | PIO_APC_ROUTINE | inoptional | 呼び出し元スレッドがアラート可能状態にあり、かつ ICMPv6 応答が到着したときに呼び出されるルーチン。Windows Vista 以降では、このパラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE にするために PIO_APC_ROUTINE_DEFINED を定義する必要があります。 Windows Server 2003 および Windows XP では、 このパラメーターのデータ型を FARPROC にするために PIO_APC_ROUTINE_DEFINED を定義してはなりません。 |
| ApcContext | void* | inoptional | ICMPv6 応答が到着したとき、またはエラーが発生したときに、ApcRoutine パラメーターで指定したコールバックルーチンに渡される省略可能なパラメーター。 |
| SourceAddress | SOCKADDR_IN6* | in | エコー要求を発行する IPv6 送信元アドレス。sockaddr 構造体の形式で指定します。 |
| DestinationAddress | SOCKADDR_IN6* | in | エコー要求の IPv6 宛先アドレス。sockaddr 構造体の形式で指定します。 |
| RequestData | void* | in | 要求で送信するデータを格納したバッファーへのポインター。 |
| RequestSize | WORD | in | RequestData パラメーターが指す要求データバッファーのサイズ(バイト単位)。 |
| RequestOptions | IP_OPTION_INFORMATION* | inoptional | 要求の IPv6 ヘッダーオプションへのポインター。IP_OPTION_INFORMATION 構造体の形式で指定します。64 ビットプラットフォームでは、このパラメーターは IP_OPTION_INFORMATION32 構造体の形式になります。 IP ヘッダーオプションを指定する必要がない場合、このパラメーターは NULL でかまいません。 Note Windows Server 2003 および Windows XP では、RequestOptions パラメーターは省略可能ではなく、NULL であってはなりません。また、Ttl および Flags メンバーのみが使用されます。
|
| ReplyBuffer | void* | out | 要求に対する応答を格納するバッファーへのポインター。戻り時には、このバッファーには ICMPV6_ECHO_REPLY 構造体に続いて、ICMPv6 エコー応答の応答データのメッセージ本文が格納されます。バッファーは、少なくとも 1 つの ICMPV6_ECHO_REPLY 構造体に加えて、RequestSize パラメーターで指定したバイト数のデータを格納できる十分な大きさが必要です。さらに、このバッファーは追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体の領域も格納できる大きさにする必要があります。 |
| ReplySize | DWORD | in | ReplyBuffer パラメーターが指す応答バッファーのサイズ(バイト単位)。このバッファーは、少なくとも 1 つの ICMPV6_ECHO_REPLY 構造体に加えて、RequestSize バイトのデータを格納できる十分な大きさが必要です。さらに、このバッファーは追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体の領域も格納できる大きさにする必要があります。 |
| Timeout | DWORD | in | 応答を待機する時間(ミリ秒単位)。このパラメーターは、Icmp6SendEcho2 関数を同期的に呼び出した場合にのみ使用されます。したがって、ApcRoutine または Event パラメーターのいずれかが NULL でない場合、このパラメーターは使用されません。 |
戻り値の型: DWORD
公式ドキュメント
Icmp6SendEcho2 関数は IPv6 ICMPv6 エコー要求を送信し、(Event または ApcRoutine が非 NULL の場合は)即座に返るか、指定されたタイムアウト後に返ります。ReplyBuffer には、応答があれば IPv6 ICMPv6 エコー応答が格納されます。
戻り値
同期的に呼び出した場合、受信して ReplyBuffer に格納された応答の数を返します。
非同期的に呼び出した場合、ERROR_IO_PENDING を返すことで操作が進行中であることを示します。応答数の結果は、Event パラメーターで指定したイベントがシグナル状態になったとき、または ApcRoutine パラメーターで指定したコールバック関数が呼び出されたときに後から取得できます。
(同期または非同期の)応答数の値がゼロの場合は、拡張エラー情報を得るために GetLastError を呼び出します。
関数が失敗した場合、GetLastError が返す拡張エラーコードは次のいずれかの値になります。
| 戻り値 | 説明 |
|---|---|
| この関数はこのシステムではサポートされていません。 | |
| システムコールに渡されたデータ領域が小さすぎます。このエラーは、ReplySize パラメーターが、ReplyBuffer パラメーターの指すバッファーが小さすぎることを示している場合に返されます。 | |
| いずれかのパラメーターが無効です。このエラーは、IcmpHandle パラメーターに無効なハンドルが含まれている場合に返されます。 | |
| 操作が進行中です。この値は Icmp6SendEcho2 の非同期呼び出しが成功した場合に返され、エラーを示すものではありません。 | |
| このコマンドを処理するのに十分なメモリがありません。 | |
| 要求はサポートされていません。このエラーは、ローカルコンピューターに IPv6 スタックが存在しない場合に返されます。 | |
| ReplySize パラメーターで指定された ReplyBuffer のサイズが小さすぎました。 | |
|
返されたエラーのメッセージ文字列を取得するには FormatMessage を使用します。 |
解説(Remarks)
ApcRoutine および Event パラメーターが NULL の場合、Icmp6SendEcho2 関数は同期的に呼び出されます。同期的に呼び出された場合、戻り値には、Timeout パラメーターで指定した時間だけ待機した後に受信して ReplyBuffer に格納された応答の数が含まれます。戻り値がゼロの場合は、拡張エラー情報を得るために GetLastError を呼び出します。
ApcRoutine または Event パラメーターのいずれかが指定された場合、Icmp6SendEcho2 関数は非同期的に呼び出されます。非同期的に呼び出された場合、応答を受け取るために ReplyBuffer および ReplySize パラメーターが必要です。ICMP 応答データは指定された ReplyBuffer にコピーされ、(Event パラメーターが指定されている場合は)アプリケーションにシグナルが送られるか、(ApcRoutine パラメーターが指定されている場合は)コールバック関数が呼び出されます。アプリケーションは、Icmp6ParseReplies 関数を使用して ReplyBuffer パラメーターが指すデータを解析する必要があります。
Event パラメーターが指定された場合、Icmp6SendEcho2 関数は非同期的に呼び出されます。Event パラメーターで指定したイベントは、ICMPv6 応答が到着するたびにシグナル状態になります。このイベントオブジェクトを作成するには CreateEvent 関数を使用します。
ApcRoutine パラメーターが指定された場合、Icmp6SendEcho2 関数は非同期的に呼び出されます。ApcRoutine パラメーターは、ユーザー定義のコールバック関数を指す必要があります。ApcRoutine パラメーターで指定したコールバック関数は、ICMPv6 応答が到着するたびに呼び出されます。ApcRoutine パラメーターで指定したコールバック関数の呼び出しは直列化されます。
Event パラメーターと ApcRoutine パラメーターの両方が指定された場合、ICMPv6 応答が到着するたびに Event パラメーターで指定したイベントがシグナル状態になりますが、ApcRoutine パラメーターで指定したコールバック関数は無視されます。
Windows Vista 以降では、ApcRoutine パラメーターを使用して Icmp6SendEcho2 関数を非同期的に呼び出すアプリケーションは、ApcRoutine パラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE にするために PIO_APC_ROUTINE_DEFINED を定義する必要があります。
Windows Vista 以降では、ApcRoutine が指すコールバック関数は、VOID 型の関数として次の構文で定義する必要があります。
typedef
VOID WINAPI
(*PIO_APC_ROUTINE) (
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
Windows Vista 以降では、コールバック関数に渡されるパラメーターは次のとおりです。
Windows Server 2003 および Windows XP では、ApcRoutine パラメーターを使用して Icmp6SendEcho2 関数を非同期的に呼び出すアプリケーションは、ApcRoutine パラメーターのデータ型を PIO_APC_ROUTINE ではなく FARPROC にするために PIO_APC_ROUTINE_DEFINED を定義してはなりません。
Windows Server 2003 および Windows XP では、ApcRoutine が指すコールバック関数は、VOID 型の関数として次の構文で定義する必要があります。
typedef
VOID WINAPI
(*FARPROC) (
IN PVOID ApcContext,
);
Windows Server 2003 および Windows XP では、コールバック関数に渡されるパラメーターは次のとおりです。
| パラメーター | 説明 |
|---|---|
| IN PVOID ApcContext | Icmp6SendEcho2 関数に渡された ApcContext パラメーター。このパラメーターは、コールバック関数が応答している Icmp6SendEcho2 要求をアプリケーションが識別するために使用できます。 |
ApcRoutine パラメーターで指定したコールバック関数は、Icmp6SendEcho2 関数を呼び出すアプリケーションと同じプロセス内に実装する必要があります。コールバック関数が別の DLL 内にある場合は、その DLL を Icmp6SendEcho2 関数を呼び出す前に読み込む必要があります。
IPv4 の場合は、IcmpCreateFile、IcmpSendEcho、IcmpSendEcho2、IcmpSendEcho2Ex、IcmpParseReplies の各関数を使用します。
Iphlpapi.h ヘッダーファイルのインクルードディレクティブは、Icmpapi.h ヘッダーファイルの前に配置する必要があることに注意してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// IPHLPAPI.dll
#include <windows.h>
DWORD Icmp6SendEcho2(
HANDLE IcmpHandle,
HANDLE Event, // optional
PIO_APC_ROUTINE ApcRoutine, // optional
void* ApcContext, // optional
SOCKADDR_IN6* SourceAddress,
SOCKADDR_IN6* DestinationAddress,
void* RequestData,
WORD RequestSize,
IP_OPTION_INFORMATION* RequestOptions, // optional
void* ReplyBuffer,
DWORD ReplySize,
DWORD Timeout
);[DllImport("IPHLPAPI.dll", SetLastError = true, ExactSpelling = true)]
static extern uint Icmp6SendEcho2(
IntPtr IcmpHandle, // HANDLE
IntPtr Event, // HANDLE optional
IntPtr ApcRoutine, // PIO_APC_ROUTINE optional
IntPtr ApcContext, // void* optional
IntPtr SourceAddress, // SOCKADDR_IN6*
IntPtr DestinationAddress, // SOCKADDR_IN6*
IntPtr RequestData, // void*
ushort RequestSize, // WORD
IntPtr RequestOptions, // IP_OPTION_INFORMATION* optional
IntPtr ReplyBuffer, // void* out
uint ReplySize, // DWORD
uint Timeout // DWORD
);<DllImport("IPHLPAPI.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function Icmp6SendEcho2(
IcmpHandle As IntPtr, ' HANDLE
[Event] As IntPtr, ' HANDLE optional
ApcRoutine As IntPtr, ' PIO_APC_ROUTINE optional
ApcContext As IntPtr, ' void* optional
SourceAddress As IntPtr, ' SOCKADDR_IN6*
DestinationAddress As IntPtr, ' SOCKADDR_IN6*
RequestData As IntPtr, ' void*
RequestSize As UShort, ' WORD
RequestOptions As IntPtr, ' IP_OPTION_INFORMATION* optional
ReplyBuffer As IntPtr, ' void* out
ReplySize As UInteger, ' DWORD
Timeout As UInteger ' DWORD
) As UInteger
End Function' IcmpHandle : HANDLE
' Event : HANDLE optional
' ApcRoutine : PIO_APC_ROUTINE optional
' ApcContext : void* optional
' SourceAddress : SOCKADDR_IN6*
' DestinationAddress : SOCKADDR_IN6*
' RequestData : void*
' RequestSize : WORD
' RequestOptions : IP_OPTION_INFORMATION* optional
' ReplyBuffer : void* out
' ReplySize : DWORD
' Timeout : DWORD
Declare PtrSafe Function Icmp6SendEcho2 Lib "iphlpapi" ( _
ByVal IcmpHandle As LongPtr, _
ByVal Event As LongPtr, _
ByVal ApcRoutine As LongPtr, _
ByVal ApcContext As LongPtr, _
ByVal SourceAddress As LongPtr, _
ByVal DestinationAddress As LongPtr, _
ByVal RequestData As LongPtr, _
ByVal RequestSize As Integer, _
ByVal RequestOptions As LongPtr, _
ByVal ReplyBuffer As LongPtr, _
ByVal ReplySize As Long, _
ByVal Timeout As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
Icmp6SendEcho2 = ctypes.windll.iphlpapi.Icmp6SendEcho2
Icmp6SendEcho2.restype = wintypes.DWORD
Icmp6SendEcho2.argtypes = [
wintypes.HANDLE, # IcmpHandle : HANDLE
wintypes.HANDLE, # Event : HANDLE optional
ctypes.c_void_p, # ApcRoutine : PIO_APC_ROUTINE optional
ctypes.POINTER(None), # ApcContext : void* optional
ctypes.c_void_p, # SourceAddress : SOCKADDR_IN6*
ctypes.c_void_p, # DestinationAddress : SOCKADDR_IN6*
ctypes.POINTER(None), # RequestData : void*
ctypes.c_ushort, # RequestSize : WORD
ctypes.c_void_p, # RequestOptions : IP_OPTION_INFORMATION* optional
ctypes.POINTER(None), # ReplyBuffer : void* out
wintypes.DWORD, # ReplySize : DWORD
wintypes.DWORD, # Timeout : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('IPHLPAPI.dll')
Icmp6SendEcho2 = Fiddle::Function.new(
lib['Icmp6SendEcho2'],
[
Fiddle::TYPE_VOIDP, # IcmpHandle : HANDLE
Fiddle::TYPE_VOIDP, # Event : HANDLE optional
Fiddle::TYPE_VOIDP, # ApcRoutine : PIO_APC_ROUTINE optional
Fiddle::TYPE_VOIDP, # ApcContext : void* optional
Fiddle::TYPE_VOIDP, # SourceAddress : SOCKADDR_IN6*
Fiddle::TYPE_VOIDP, # DestinationAddress : SOCKADDR_IN6*
Fiddle::TYPE_VOIDP, # RequestData : void*
-Fiddle::TYPE_SHORT, # RequestSize : WORD
Fiddle::TYPE_VOIDP, # RequestOptions : IP_OPTION_INFORMATION* optional
Fiddle::TYPE_VOIDP, # ReplyBuffer : void* out
-Fiddle::TYPE_INT, # ReplySize : DWORD
-Fiddle::TYPE_INT, # Timeout : DWORD
],
-Fiddle::TYPE_INT)#[link(name = "iphlpapi")]
extern "system" {
fn Icmp6SendEcho2(
IcmpHandle: *mut core::ffi::c_void, // HANDLE
Event: *mut core::ffi::c_void, // HANDLE optional
ApcRoutine: *const core::ffi::c_void, // PIO_APC_ROUTINE optional
ApcContext: *mut (), // void* optional
SourceAddress: *mut SOCKADDR_IN6, // SOCKADDR_IN6*
DestinationAddress: *mut SOCKADDR_IN6, // SOCKADDR_IN6*
RequestData: *mut (), // void*
RequestSize: u16, // WORD
RequestOptions: *mut IP_OPTION_INFORMATION, // IP_OPTION_INFORMATION* optional
ReplyBuffer: *mut (), // void* out
ReplySize: u32, // DWORD
Timeout: u32 // DWORD
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("IPHLPAPI.dll", SetLastError = true)]
public static extern uint Icmp6SendEcho2(IntPtr IcmpHandle, IntPtr Event, IntPtr ApcRoutine, IntPtr ApcContext, IntPtr SourceAddress, IntPtr DestinationAddress, IntPtr RequestData, ushort RequestSize, IntPtr RequestOptions, IntPtr ReplyBuffer, uint ReplySize, uint Timeout);
"@
$api = Add-Type -MemberDefinition $sig -Name 'IPHLPAPI_Icmp6SendEcho2' -Namespace Win32 -PassThru
# $api::Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)#uselib "IPHLPAPI.dll"
#func global Icmp6SendEcho2 "Icmp6SendEcho2" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; Icmp6SendEcho2 IcmpHandle, Event, ApcRoutine, ApcContext, varptr(SourceAddress), varptr(DestinationAddress), RequestData, RequestSize, varptr(RequestOptions), ReplyBuffer, ReplySize, Timeout ; 戻り値は stat
; IcmpHandle : HANDLE -> "sptr"
; Event : HANDLE optional -> "sptr"
; ApcRoutine : PIO_APC_ROUTINE optional -> "sptr"
; ApcContext : void* optional -> "sptr"
; SourceAddress : SOCKADDR_IN6* -> "sptr"
; DestinationAddress : SOCKADDR_IN6* -> "sptr"
; RequestData : void* -> "sptr"
; RequestSize : WORD -> "sptr"
; RequestOptions : IP_OPTION_INFORMATION* optional -> "sptr"
; ReplyBuffer : void* out -> "sptr"
; ReplySize : DWORD -> "sptr"
; Timeout : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "IPHLPAPI.dll" #cfunc global Icmp6SendEcho2 "Icmp6SendEcho2" sptr, sptr, sptr, sptr, var, var, sptr, int, var, sptr, int, int ; res = Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout) ; IcmpHandle : HANDLE -> "sptr" ; Event : HANDLE optional -> "sptr" ; ApcRoutine : PIO_APC_ROUTINE optional -> "sptr" ; ApcContext : void* optional -> "sptr" ; SourceAddress : SOCKADDR_IN6* -> "var" ; DestinationAddress : SOCKADDR_IN6* -> "var" ; RequestData : void* -> "sptr" ; RequestSize : WORD -> "int" ; RequestOptions : IP_OPTION_INFORMATION* optional -> "var" ; ReplyBuffer : void* out -> "sptr" ; ReplySize : DWORD -> "int" ; Timeout : DWORD -> "int" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "IPHLPAPI.dll" #cfunc global Icmp6SendEcho2 "Icmp6SendEcho2" sptr, sptr, sptr, sptr, sptr, sptr, sptr, int, sptr, sptr, int, int ; res = Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, varptr(SourceAddress), varptr(DestinationAddress), RequestData, RequestSize, varptr(RequestOptions), ReplyBuffer, ReplySize, Timeout) ; IcmpHandle : HANDLE -> "sptr" ; Event : HANDLE optional -> "sptr" ; ApcRoutine : PIO_APC_ROUTINE optional -> "sptr" ; ApcContext : void* optional -> "sptr" ; SourceAddress : SOCKADDR_IN6* -> "sptr" ; DestinationAddress : SOCKADDR_IN6* -> "sptr" ; RequestData : void* -> "sptr" ; RequestSize : WORD -> "int" ; RequestOptions : IP_OPTION_INFORMATION* optional -> "sptr" ; ReplyBuffer : void* out -> "sptr" ; ReplySize : DWORD -> "int" ; Timeout : DWORD -> "int" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; DWORD Icmp6SendEcho2(HANDLE IcmpHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, void* ApcContext, SOCKADDR_IN6* SourceAddress, SOCKADDR_IN6* DestinationAddress, void* RequestData, WORD RequestSize, IP_OPTION_INFORMATION* RequestOptions, void* ReplyBuffer, DWORD ReplySize, DWORD Timeout) #uselib "IPHLPAPI.dll" #cfunc global Icmp6SendEcho2 "Icmp6SendEcho2" intptr, intptr, intptr, intptr, var, var, intptr, int, var, intptr, int, int ; res = Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout) ; IcmpHandle : HANDLE -> "intptr" ; Event : HANDLE optional -> "intptr" ; ApcRoutine : PIO_APC_ROUTINE optional -> "intptr" ; ApcContext : void* optional -> "intptr" ; SourceAddress : SOCKADDR_IN6* -> "var" ; DestinationAddress : SOCKADDR_IN6* -> "var" ; RequestData : void* -> "intptr" ; RequestSize : WORD -> "int" ; RequestOptions : IP_OPTION_INFORMATION* optional -> "var" ; ReplyBuffer : void* out -> "intptr" ; ReplySize : DWORD -> "int" ; Timeout : DWORD -> "int" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; DWORD Icmp6SendEcho2(HANDLE IcmpHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, void* ApcContext, SOCKADDR_IN6* SourceAddress, SOCKADDR_IN6* DestinationAddress, void* RequestData, WORD RequestSize, IP_OPTION_INFORMATION* RequestOptions, void* ReplyBuffer, DWORD ReplySize, DWORD Timeout) #uselib "IPHLPAPI.dll" #cfunc global Icmp6SendEcho2 "Icmp6SendEcho2" intptr, intptr, intptr, intptr, intptr, intptr, intptr, int, intptr, intptr, int, int ; res = Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, varptr(SourceAddress), varptr(DestinationAddress), RequestData, RequestSize, varptr(RequestOptions), ReplyBuffer, ReplySize, Timeout) ; IcmpHandle : HANDLE -> "intptr" ; Event : HANDLE optional -> "intptr" ; ApcRoutine : PIO_APC_ROUTINE optional -> "intptr" ; ApcContext : void* optional -> "intptr" ; SourceAddress : SOCKADDR_IN6* -> "intptr" ; DestinationAddress : SOCKADDR_IN6* -> "intptr" ; RequestData : void* -> "intptr" ; RequestSize : WORD -> "int" ; RequestOptions : IP_OPTION_INFORMATION* optional -> "intptr" ; ReplyBuffer : void* out -> "intptr" ; ReplySize : DWORD -> "int" ; Timeout : DWORD -> "int" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
iphlpapi = windows.NewLazySystemDLL("IPHLPAPI.dll")
procIcmp6SendEcho2 = iphlpapi.NewProc("Icmp6SendEcho2")
)
// IcmpHandle (HANDLE), Event (HANDLE optional), ApcRoutine (PIO_APC_ROUTINE optional), ApcContext (void* optional), SourceAddress (SOCKADDR_IN6*), DestinationAddress (SOCKADDR_IN6*), RequestData (void*), RequestSize (WORD), RequestOptions (IP_OPTION_INFORMATION* optional), ReplyBuffer (void* out), ReplySize (DWORD), Timeout (DWORD)
r1, _, err := procIcmp6SendEcho2.Call(
uintptr(IcmpHandle),
uintptr(Event),
uintptr(ApcRoutine),
uintptr(ApcContext),
uintptr(SourceAddress),
uintptr(DestinationAddress),
uintptr(RequestData),
uintptr(RequestSize),
uintptr(RequestOptions),
uintptr(ReplyBuffer),
uintptr(ReplySize),
uintptr(Timeout),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // DWORDfunction Icmp6SendEcho2(
IcmpHandle: THandle; // HANDLE
Event: THandle; // HANDLE optional
ApcRoutine: Pointer; // PIO_APC_ROUTINE optional
ApcContext: Pointer; // void* optional
SourceAddress: Pointer; // SOCKADDR_IN6*
DestinationAddress: Pointer; // SOCKADDR_IN6*
RequestData: Pointer; // void*
RequestSize: Word; // WORD
RequestOptions: Pointer; // IP_OPTION_INFORMATION* optional
ReplyBuffer: Pointer; // void* out
ReplySize: DWORD; // DWORD
Timeout: DWORD // DWORD
): DWORD; stdcall;
external 'IPHLPAPI.dll' name 'Icmp6SendEcho2';result := DllCall("IPHLPAPI\Icmp6SendEcho2"
, "Ptr", IcmpHandle ; HANDLE
, "Ptr", Event ; HANDLE optional
, "Ptr", ApcRoutine ; PIO_APC_ROUTINE optional
, "Ptr", ApcContext ; void* optional
, "Ptr", SourceAddress ; SOCKADDR_IN6*
, "Ptr", DestinationAddress ; SOCKADDR_IN6*
, "Ptr", RequestData ; void*
, "UShort", RequestSize ; WORD
, "Ptr", RequestOptions ; IP_OPTION_INFORMATION* optional
, "Ptr", ReplyBuffer ; void* out
, "UInt", ReplySize ; DWORD
, "UInt", Timeout ; DWORD
, "UInt") ; return: DWORD●Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout) = DLL("IPHLPAPI.dll", "dword Icmp6SendEcho2(void*, void*, void*, void*, void*, void*, void*, int, void*, void*, dword, dword)")
# 呼び出し: Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
# IcmpHandle : HANDLE -> "void*"
# Event : HANDLE optional -> "void*"
# ApcRoutine : PIO_APC_ROUTINE optional -> "void*"
# ApcContext : void* optional -> "void*"
# SourceAddress : SOCKADDR_IN6* -> "void*"
# DestinationAddress : SOCKADDR_IN6* -> "void*"
# RequestData : void* -> "void*"
# RequestSize : WORD -> "int"
# RequestOptions : IP_OPTION_INFORMATION* optional -> "void*"
# ReplyBuffer : void* out -> "void*"
# ReplySize : DWORD -> "dword"
# Timeout : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "iphlpapi" fn Icmp6SendEcho2(
IcmpHandle: ?*anyopaque, // HANDLE
Event: ?*anyopaque, // HANDLE optional
ApcRoutine: ?*anyopaque, // PIO_APC_ROUTINE optional
ApcContext: ?*anyopaque, // void* optional
SourceAddress: [*c]SOCKADDR_IN6, // SOCKADDR_IN6*
DestinationAddress: [*c]SOCKADDR_IN6, // SOCKADDR_IN6*
RequestData: ?*anyopaque, // void*
RequestSize: u16, // WORD
RequestOptions: [*c]IP_OPTION_INFORMATION, // IP_OPTION_INFORMATION* optional
ReplyBuffer: ?*anyopaque, // void* out
ReplySize: u32, // DWORD
Timeout: u32 // DWORD
) callconv(std.os.windows.WINAPI) u32;proc Icmp6SendEcho2(
IcmpHandle: pointer, # HANDLE
Event: pointer, # HANDLE optional
ApcRoutine: pointer, # PIO_APC_ROUTINE optional
ApcContext: pointer, # void* optional
SourceAddress: ptr SOCKADDR_IN6, # SOCKADDR_IN6*
DestinationAddress: ptr SOCKADDR_IN6, # SOCKADDR_IN6*
RequestData: pointer, # void*
RequestSize: uint16, # WORD
RequestOptions: ptr IP_OPTION_INFORMATION, # IP_OPTION_INFORMATION* optional
ReplyBuffer: pointer, # void* out
ReplySize: uint32, # DWORD
Timeout: uint32 # DWORD
): uint32 {.importc: "Icmp6SendEcho2", stdcall, dynlib: "IPHLPAPI.dll".}pragma(lib, "iphlpapi");
extern(Windows)
uint Icmp6SendEcho2(
void* IcmpHandle, // HANDLE
void* Event, // HANDLE optional
void* ApcRoutine, // PIO_APC_ROUTINE optional
void* ApcContext, // void* optional
SOCKADDR_IN6* SourceAddress, // SOCKADDR_IN6*
SOCKADDR_IN6* DestinationAddress, // SOCKADDR_IN6*
void* RequestData, // void*
ushort RequestSize, // WORD
IP_OPTION_INFORMATION* RequestOptions, // IP_OPTION_INFORMATION* optional
void* ReplyBuffer, // void* out
uint ReplySize, // DWORD
uint Timeout // DWORD
);ccall((:Icmp6SendEcho2, "IPHLPAPI.dll"), stdcall, UInt32,
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{SOCKADDR_IN6}, Ptr{SOCKADDR_IN6}, Ptr{Cvoid}, UInt16, Ptr{IP_OPTION_INFORMATION}, Ptr{Cvoid}, UInt32, UInt32),
IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
# IcmpHandle : HANDLE -> Ptr{Cvoid}
# Event : HANDLE optional -> Ptr{Cvoid}
# ApcRoutine : PIO_APC_ROUTINE optional -> Ptr{Cvoid}
# ApcContext : void* optional -> Ptr{Cvoid}
# SourceAddress : SOCKADDR_IN6* -> Ptr{SOCKADDR_IN6}
# DestinationAddress : SOCKADDR_IN6* -> Ptr{SOCKADDR_IN6}
# RequestData : void* -> Ptr{Cvoid}
# RequestSize : WORD -> UInt16
# RequestOptions : IP_OPTION_INFORMATION* optional -> Ptr{IP_OPTION_INFORMATION}
# ReplyBuffer : void* out -> Ptr{Cvoid}
# ReplySize : DWORD -> UInt32
# Timeout : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t Icmp6SendEcho2(
void* IcmpHandle,
void* Event,
void* ApcRoutine,
void* ApcContext,
void* SourceAddress,
void* DestinationAddress,
void* RequestData,
uint16_t RequestSize,
void* RequestOptions,
void* ReplyBuffer,
uint32_t ReplySize,
uint32_t Timeout);
]]
local iphlpapi = ffi.load("iphlpapi")
-- iphlpapi.Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
-- IcmpHandle : HANDLE
-- Event : HANDLE optional
-- ApcRoutine : PIO_APC_ROUTINE optional
-- ApcContext : void* optional
-- SourceAddress : SOCKADDR_IN6*
-- DestinationAddress : SOCKADDR_IN6*
-- RequestData : void*
-- RequestSize : WORD
-- RequestOptions : IP_OPTION_INFORMATION* optional
-- ReplyBuffer : void* out
-- ReplySize : DWORD
-- Timeout : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('IPHLPAPI.dll');
const Icmp6SendEcho2 = lib.func('__stdcall', 'Icmp6SendEcho2', 'uint32_t', ['void *', 'void *', 'void *', 'void *', 'void *', 'void *', 'void *', 'uint16_t', 'void *', 'void *', 'uint32_t', 'uint32_t']);
// Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
// IcmpHandle : HANDLE -> 'void *'
// Event : HANDLE optional -> 'void *'
// ApcRoutine : PIO_APC_ROUTINE optional -> 'void *'
// ApcContext : void* optional -> 'void *'
// SourceAddress : SOCKADDR_IN6* -> 'void *'
// DestinationAddress : SOCKADDR_IN6* -> 'void *'
// RequestData : void* -> 'void *'
// RequestSize : WORD -> 'uint16_t'
// RequestOptions : IP_OPTION_INFORMATION* optional -> 'void *'
// ReplyBuffer : void* out -> 'void *'
// ReplySize : DWORD -> 'uint32_t'
// Timeout : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。const lib = Deno.dlopen("IPHLPAPI.dll", {
Icmp6SendEcho2: { parameters: ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "u16", "pointer", "pointer", "u32", "u32"], result: "u32" },
});
// lib.symbols.Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
// IcmpHandle : HANDLE -> "pointer"
// Event : HANDLE optional -> "pointer"
// ApcRoutine : PIO_APC_ROUTINE optional -> "pointer"
// ApcContext : void* optional -> "pointer"
// SourceAddress : SOCKADDR_IN6* -> "pointer"
// DestinationAddress : SOCKADDR_IN6* -> "pointer"
// RequestData : void* -> "pointer"
// RequestSize : WORD -> "u16"
// RequestOptions : IP_OPTION_INFORMATION* optional -> "pointer"
// ReplyBuffer : void* out -> "pointer"
// ReplySize : DWORD -> "u32"
// Timeout : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t Icmp6SendEcho2(
void* IcmpHandle,
void* Event,
void* ApcRoutine,
void* ApcContext,
void* SourceAddress,
void* DestinationAddress,
void* RequestData,
uint16_t RequestSize,
void* RequestOptions,
void* ReplyBuffer,
uint32_t ReplySize,
uint32_t Timeout);
C, "IPHLPAPI.dll");
// $ffi->Icmp6SendEcho2(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout);
// IcmpHandle : HANDLE
// Event : HANDLE optional
// ApcRoutine : PIO_APC_ROUTINE optional
// ApcContext : void* optional
// SourceAddress : SOCKADDR_IN6*
// DestinationAddress : SOCKADDR_IN6*
// RequestData : void*
// RequestSize : WORD
// RequestOptions : IP_OPTION_INFORMATION* optional
// ReplyBuffer : void* out
// ReplySize : DWORD
// Timeout : DWORD
// 構造体/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 Iphlpapi extends StdCallLibrary {
Iphlpapi INSTANCE = Native.load("iphlpapi", Iphlpapi.class);
int Icmp6SendEcho2(
Pointer IcmpHandle, // HANDLE
Pointer Event, // HANDLE optional
Callback ApcRoutine, // PIO_APC_ROUTINE optional
Pointer ApcContext, // void* optional
Pointer SourceAddress, // SOCKADDR_IN6*
Pointer DestinationAddress, // SOCKADDR_IN6*
Pointer RequestData, // void*
short RequestSize, // WORD
Pointer RequestOptions, // IP_OPTION_INFORMATION* optional
Pointer ReplyBuffer, // void* out
int ReplySize, // DWORD
int Timeout // DWORD
);
}@[Link("iphlpapi")]
lib LibIPHLPAPI
fun Icmp6SendEcho2 = Icmp6SendEcho2(
IcmpHandle : Void*, # HANDLE
Event : Void*, # HANDLE optional
ApcRoutine : Void*, # PIO_APC_ROUTINE optional
ApcContext : Void*, # void* optional
SourceAddress : SOCKADDR_IN6*, # SOCKADDR_IN6*
DestinationAddress : SOCKADDR_IN6*, # SOCKADDR_IN6*
RequestData : Void*, # void*
RequestSize : UInt16, # WORD
RequestOptions : IP_OPTION_INFORMATION*, # IP_OPTION_INFORMATION* optional
ReplyBuffer : Void*, # void* out
ReplySize : UInt32, # DWORD
Timeout : UInt32 # DWORD
) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef Icmp6SendEcho2Native = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint16, Pointer<Void>, Pointer<Void>, Uint32, Uint32);
typedef Icmp6SendEcho2Dart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, int, Pointer<Void>, Pointer<Void>, int, int);
final Icmp6SendEcho2 = DynamicLibrary.open('IPHLPAPI.dll')
.lookupFunction<Icmp6SendEcho2Native, Icmp6SendEcho2Dart>('Icmp6SendEcho2');
// IcmpHandle : HANDLE -> Pointer<Void>
// Event : HANDLE optional -> Pointer<Void>
// ApcRoutine : PIO_APC_ROUTINE optional -> Pointer<Void>
// ApcContext : void* optional -> Pointer<Void>
// SourceAddress : SOCKADDR_IN6* -> Pointer<Void>
// DestinationAddress : SOCKADDR_IN6* -> Pointer<Void>
// RequestData : void* -> Pointer<Void>
// RequestSize : WORD -> Uint16
// RequestOptions : IP_OPTION_INFORMATION* optional -> Pointer<Void>
// ReplyBuffer : void* out -> Pointer<Void>
// ReplySize : DWORD -> Uint32
// Timeout : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function Icmp6SendEcho2(
IcmpHandle: THandle; // HANDLE
Event: THandle; // HANDLE optional
ApcRoutine: Pointer; // PIO_APC_ROUTINE optional
ApcContext: Pointer; // void* optional
SourceAddress: Pointer; // SOCKADDR_IN6*
DestinationAddress: Pointer; // SOCKADDR_IN6*
RequestData: Pointer; // void*
RequestSize: Word; // WORD
RequestOptions: Pointer; // IP_OPTION_INFORMATION* optional
ReplyBuffer: Pointer; // void* out
ReplySize: DWORD; // DWORD
Timeout: DWORD // DWORD
): DWORD; stdcall;
external 'IPHLPAPI.dll' name 'Icmp6SendEcho2';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "Icmp6SendEcho2"
c_Icmp6SendEcho2 :: Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> Word16 -> Ptr () -> Ptr () -> Word32 -> Word32 -> IO Word32
-- IcmpHandle : HANDLE -> Ptr ()
-- Event : HANDLE optional -> Ptr ()
-- ApcRoutine : PIO_APC_ROUTINE optional -> Ptr ()
-- ApcContext : void* optional -> Ptr ()
-- SourceAddress : SOCKADDR_IN6* -> Ptr ()
-- DestinationAddress : SOCKADDR_IN6* -> Ptr ()
-- RequestData : void* -> Ptr ()
-- RequestSize : WORD -> Word16
-- RequestOptions : IP_OPTION_INFORMATION* optional -> Ptr ()
-- ReplyBuffer : void* out -> Ptr ()
-- ReplySize : DWORD -> Word32
-- Timeout : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let icmp6sendecho2 =
foreign "Icmp6SendEcho2"
((ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> uint16_t @-> (ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> returning uint32_t)
(* IcmpHandle : HANDLE -> (ptr void) *)
(* Event : HANDLE optional -> (ptr void) *)
(* ApcRoutine : PIO_APC_ROUTINE optional -> (ptr void) *)
(* ApcContext : void* optional -> (ptr void) *)
(* SourceAddress : SOCKADDR_IN6* -> (ptr void) *)
(* DestinationAddress : SOCKADDR_IN6* -> (ptr void) *)
(* RequestData : void* -> (ptr void) *)
(* RequestSize : WORD -> uint16_t *)
(* RequestOptions : IP_OPTION_INFORMATION* optional -> (ptr void) *)
(* ReplyBuffer : void* out -> (ptr void) *)
(* ReplySize : DWORD -> uint32_t *)
(* Timeout : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library iphlpapi (t "IPHLPAPI.dll"))
(cffi:use-foreign-library iphlpapi)
(cffi:defcfun ("Icmp6SendEcho2" icmp6-send-echo2 :convention :stdcall) :uint32
(icmp-handle :pointer) ; HANDLE
(event :pointer) ; HANDLE optional
(apc-routine :pointer) ; PIO_APC_ROUTINE optional
(apc-context :pointer) ; void* optional
(source-address :pointer) ; SOCKADDR_IN6*
(destination-address :pointer) ; SOCKADDR_IN6*
(request-data :pointer) ; void*
(request-size :uint16) ; WORD
(request-options :pointer) ; IP_OPTION_INFORMATION* optional
(reply-buffer :pointer) ; void* out
(reply-size :uint32) ; DWORD
(timeout :uint32)) ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $Icmp6SendEcho2 = Win32::API::More->new('IPHLPAPI',
'DWORD Icmp6SendEcho2(HANDLE IcmpHandle, HANDLE Event, LPVOID ApcRoutine, LPVOID ApcContext, LPVOID SourceAddress, LPVOID DestinationAddress, LPVOID RequestData, WORD RequestSize, LPVOID RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout)');
# my $ret = $Icmp6SendEcho2->Call($IcmpHandle, $Event, $ApcRoutine, $ApcContext, $SourceAddress, $DestinationAddress, $RequestData, $RequestSize, $RequestOptions, $ReplyBuffer, $ReplySize, $Timeout);
# IcmpHandle : HANDLE -> HANDLE
# Event : HANDLE optional -> HANDLE
# ApcRoutine : PIO_APC_ROUTINE optional -> LPVOID
# ApcContext : void* optional -> LPVOID
# SourceAddress : SOCKADDR_IN6* -> LPVOID
# DestinationAddress : SOCKADDR_IN6* -> LPVOID
# RequestData : void* -> LPVOID
# RequestSize : WORD -> WORD
# RequestOptions : IP_OPTION_INFORMATION* optional -> LPVOID
# ReplyBuffer : void* out -> LPVOID
# ReplySize : DWORD -> DWORD
# Timeout : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。関連項目
- f CreateEventW — 名前付きまたは無名のイベントを作成する(Unicode版)。
- f CreateEventExW — アクセス権とフラグを指定してイベントを作成する(Unicode版)。
- f GetLastError — 呼び出しスレッドの最終エラーコードを取得する。
- s ICMPV6_ECHO_REPLY_LH
- s ICMP_ECHO_REPLY
- f Icmp6CreateFile — ICMPv6エコー要求送信用のハンドルを作成する。
- f Icmp6ParseReplies — ICMPv6エコー応答バッファを解析し応答数を返す。
- f IcmpCloseHandle — ICMPエコー要求用に開いたハンドルを閉じる。
- f IcmpCreateFile — ICMPエコー要求送信用のハンドルを作成する。
- f IcmpParseReplies — ICMPエコー応答バッファを解析し応答数を返す。
- f IcmpSendEcho — 指定先へICMPエコー要求を送信し応答を受信する。
- f IcmpSendEcho2 — ICMPエコー要求を同期または非同期で送信する。