Win32 API 日本語リファレンス
ホームNetworkManagement.IpHelper › Icmp6SendEcho2

Icmp6SendEcho2

関数
IPv6でICMPv6エコー要求を送信し応答を受信する。
DLLIPHLPAPI.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// 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
);

パラメーター

名前方向説明
IcmpHandleHANDLEinIcmp6CreateFile が返したオープン済みのハンドル。
EventHANDLEinoptional

ICMPv6 応答が到着するたびにシグナル状態になるイベント。このパラメーターを指定する場合は、有効なイベントオブジェクトへのハンドルが必要です。このイベントオブジェクトを作成するには、 CreateEvent または CreateEventEx 関数を使用します。

イベントの使用方法の詳細については、Event Objects を参照してください。

ApcRoutinePIO_APC_ROUTINEinoptional

呼び出し元スレッドがアラート可能状態にあり、かつ ICMPv6 応答が到着したときに呼び出されるルーチン。Windows Vista 以降では、このパラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE にするために PIO_APC_ROUTINE_DEFINED を定義する必要があります。

Windows Server 2003 および Windows XP では、 このパラメーターのデータ型を FARPROC にするために PIO_APC_ROUTINE_DEFINED を定義してはなりません。

ApcContextvoid*inoptionalICMPv6 応答が到着したとき、またはエラーが発生したときに、ApcRoutine パラメーターで指定したコールバックルーチンに渡される省略可能なパラメーター。
SourceAddressSOCKADDR_IN6*inエコー要求を発行する IPv6 送信元アドレス。sockaddr 構造体の形式で指定します。
DestinationAddressSOCKADDR_IN6*inエコー要求の IPv6 宛先アドレス。sockaddr 構造体の形式で指定します。
RequestDatavoid*in要求で送信するデータを格納したバッファーへのポインター。
RequestSizeWORDinRequestData パラメーターが指す要求データバッファーのサイズ(バイト単位)。
RequestOptionsIP_OPTION_INFORMATION*inoptional

要求の IPv6 ヘッダーオプションへのポインター。IP_OPTION_INFORMATION 構造体の形式で指定します。64 ビットプラットフォームでは、このパラメーターは IP_OPTION_INFORMATION32 構造体の形式になります。

IP ヘッダーオプションを指定する必要がない場合、このパラメーターは NULL でかまいません。

Note Windows Server 2003 および Windows XP では、RequestOptions パラメーターは省略可能ではなく、NULL であってはなりません。また、Ttl および Flags メンバーのみが使用されます。
ReplyBuffervoid*out要求に対する応答を格納するバッファーへのポインター。戻り時には、このバッファーには ICMPV6_ECHO_REPLY 構造体に続いて、ICMPv6 エコー応答の応答データのメッセージ本文が格納されます。バッファーは、少なくとも 1 つの ICMPV6_ECHO_REPLY 構造体に加えて、RequestSize パラメーターで指定したバイト数のデータを格納できる十分な大きさが必要です。さらに、このバッファーは追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体の領域も格納できる大きさにする必要があります。
ReplySizeDWORDinReplyBuffer パラメーターが指す応答バッファーのサイズ(バイト単位)。このバッファーは、少なくとも 1 つの ICMPV6_ECHO_REPLY 構造体に加えて、RequestSize バイトのデータを格納できる十分な大きさが必要です。さらに、このバッファーは追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体の領域も格納できる大きさにする必要があります。
TimeoutDWORDin応答を待機する時間(ミリ秒単位)。このパラメーターは、Icmp6SendEcho2 関数を同期的に呼び出した場合にのみ使用されます。したがって、ApcRoutine または Event パラメーターのいずれかが NULL でない場合、このパラメーターは使用されません。

戻り値の型: DWORD

公式ドキュメント

Icmp6SendEcho2 関数は IPv6 ICMPv6 エコー要求を送信し、(Event または ApcRoutine が非 NULL の場合は)即座に返るか、指定されたタイムアウト後に返ります。ReplyBuffer には、応答があれば IPv6 ICMPv6 エコー応答が格納されます。

戻り値

同期的に呼び出した場合、受信して ReplyBuffer に格納された応答の数を返します。

非同期的に呼び出した場合、ERROR_IO_PENDING を返すことで操作が進行中であることを示します。応答数の結果は、Event パラメーターで指定したイベントがシグナル状態になったとき、または ApcRoutine パラメーターで指定したコールバック関数が呼び出されたときに後から取得できます。

(同期または非同期の)応答数の値がゼロの場合は、拡張エラー情報を得るために GetLastError を呼び出します。

関数が失敗した場合、GetLastError が返す拡張エラーコードは次のいずれかの値になります。

戻り値 説明
ERROR_CALL_NOT_IMPLEMENTED
この関数はこのシステムではサポートされていません。
ERROR_INSUFFICIENT_BUFFER
システムコールに渡されたデータ領域が小さすぎます。このエラーは、ReplySize パラメーターが、ReplyBuffer パラメーターの指すバッファーが小さすぎることを示している場合に返されます。
ERROR_INVALID_PARAMETER
いずれかのパラメーターが無効です。このエラーは、IcmpHandle パラメーターに無効なハンドルが含まれている場合に返されます。
ERROR_IO_PENDING
操作が進行中です。この値は Icmp6SendEcho2 の非同期呼び出しが成功した場合に返され、エラーを示すものではありません。
ERROR_NOT_ENOUGH_MEMORY
このコマンドを処理するのに十分なメモリがありません。
ERROR_NOT_SUPPORTED
要求はサポートされていません。このエラーは、ローカルコンピューターに IPv6 スタックが存在しない場合に返されます。
IP_BUF_TOO_SMALL
ReplySize パラメーターで指定された ReplyBuffer のサイズが小さすぎました。
Other
返されたエラーのメッセージ文字列を取得するには 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 を定義する必要があります。

Note PIO_APC_ROUTINE_DEFINEDIcmpapi.h ヘッダーファイルをインクルードする前に定義する必要があります。

Windows Vista 以降では、ApcRoutine が指すコールバック関数は、VOID 型の関数として次の構文で定義する必要があります。

typedef
VOID WINAPI
(*PIO_APC_ROUTINE) (
    IN PVOID ApcContext,
    IN PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG Reserved
    );

Windows Vista 以降では、コールバック関数に渡されるパラメーターは次のとおりです。

パラメーター 説明
IN PVOID ApcContext Icmp6SendEcho2 関数に渡された ApcContext パラメーター。このパラメーターは、コールバック関数が応答している Icmp6SendEcho2 要求をアプリケーションが識別するために使用できます。
IN PIO_STATUS_BLOCK IoStatusBlock IO_STATUS_BLOCK へのポインター。この変数には、操作の最終的な完了ステータスと情報が含まれます。応答で実際に受信したバイト数は、IO_STATUS_BLOCK 構造体の Information メンバーに返されます。

IO_STATUS_BLOCK 構造体は Wdm.h ヘッダーファイルで定義されています。

IN ULONG Reserved このパラメーターは予約されています。

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 の場合は、IcmpCreateFileIcmpSendEchoIcmpSendEcho2IcmpSendEcho2ExIcmpParseReplies の各関数を使用します。

Iphlpapi.h ヘッダーファイルのインクルードディレクティブは、Icmpapi.h ヘッダーファイルの前に配置する必要があることに注意してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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   // DWORD
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';
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 を使用してください。

関連項目

公式の関連項目
使用する型