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

IcmpSendEcho2Ex

関数
送信元アドレスを指定してICMPエコー要求を送信する。
DLLIPHLPAPI.dll呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

// IPHLPAPI.dll
#include <windows.h>

DWORD IcmpSendEcho2Ex(
    HANDLE IcmpHandle,
    HANDLE Event,   // optional
    PIO_APC_ROUTINE ApcRoutine,   // optional
    void* ApcContext,   // optional
    DWORD SourceAddress,
    DWORD DestinationAddress,
    void* RequestData,
    WORD RequestSize,
    IP_OPTION_INFORMATION* RequestOptions,   // optional
    void* ReplyBuffer,
    DWORD ReplySize,
    DWORD Timeout
);

パラメーター

名前方向説明
IcmpHandleHANDLEinICMPCreateFile 関数が返すオープン済みのハンドル。
EventHANDLEinoptional

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

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

ApcRoutinePIO_APC_ROUTINEinoptional呼び出し側スレッドがアラート可能状態にあり、かつ ICMP 応答が到着したときに呼び出されるルーチン。このパラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE に強制するため、PIO_APC_ROUTINE_DEFINED を定義する必要があります。
ApcContextvoid*inoptionalICMP 応答が到着するかエラーが発生するたびに、ApcRoutine パラメーターで指定したコールバックルーチンに渡される省略可能なパラメーター。
SourceAddressDWORDinエコー要求を発行する IPv4 送信元アドレス。このアドレスは IPAddr 構造体の形式で指定します。
DestinationAddressDWORDinエコー要求の IPv4 宛先アドレス。このアドレスは IPAddr 構造体の形式で指定します。
RequestDatavoid*in要求として送信するデータを格納したバッファーへのポインター。
RequestSizeWORDinRequestData パラメーターが指す要求データバッファーのサイズ(バイト単位)。
RequestOptionsIP_OPTION_INFORMATION*inoptional

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

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

ReplyBuffervoid*out

要求に対する応答を格納するバッファーへのポインター。制御が返ったとき、このバッファーには ICMP_ECHO_REPLY 構造体の配列と、それに続くオプションおよびデータが格納されます。バッファーは、少なくとも 1 つの ICMP_ECHO_REPLY 構造体と RequestSize バイト分のデータを格納できる大きさが必要です。

さらにこのバッファーは、追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体分の領域も格納できる大きさが必要です。

ReplySizeDWORDin

応答バッファーに割り当てられたサイズ(バイト単位)。バッファーは、少なくとも 1 つの ICMP_ECHO_REPLY 構造体と RequestSize バイト分のデータを格納できる大きさが必要です。

さらにこのバッファーは、追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体分の領域も格納できる大きさが必要です。

TimeoutDWORDin応答を待機する時間(ミリ秒単位)。

戻り値の型: DWORD

公式ドキュメント

IPv4 の ICMP エコー要求を送信し、(Event または ApcRoutine が NULL 以外の場合は)直ちに制御を返すか、指定したタイムアウト経過後に制御を返します。ReplyBuffer には、応答があれば ICMP 応答が格納されます。

戻り値

同期的に呼び出された場合、IcmpSendEcho2Ex 関数は受信して ReplyBuffer に格納した応答の数を返します。戻り値が 0 の場合は、 GetLastError を呼び出して拡張エラー情報を取得してください。

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

戻り値が 0 の場合は、 GetLastError を呼び出して拡張エラー情報を取得してください。

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

戻り値コード 説明
ERROR_INVALID_PARAMETER
関数に無効なパラメーターが渡されました。このエラーは、IcmpHandle パラメーターに無効なハンドルが含まれている場合に返されます。また、ReplySize パラメーターに ICMP_ECHO_REPLY 構造体のサイズより小さい値が指定された場合にも返されます。
ERROR_IO_PENDING
処理が進行中です。この値は、IcmpSendEcho2Ex の非同期呼び出しが成功したときに返されるもので、エラーを示すものではありません。
ERROR_NOT_ENOUGH_MEMORY
処理を完了するのに十分なメモリがありません。
ERROR_NOT_SUPPORTED
要求はサポートされていません。このエラーは、ローカルコンピューターに IPv4 スタックが存在しない場合に返されます。
IP_BUF_TOO_SMALL
ReplySize パラメーターで指定した ReplyBuffer のサイズが小さすぎました。
その他
返されたエラーのメッセージ文字列を取得するには、 FormatMessage を使用してください。

解説(Remarks)

IcmpSendEcho2Ex 関数は、Windows Server 2008 以降で利用できます。

IcmpSendEcho2Ex 関数は、IcmpSendEcho2 関数の拡張版で、ICMP 要求を発行する IPv4 送信元アドレスを指定できるようにしたものです。IcmpSendEcho2Ex 関数は、コンピューターに複数のネットワークインターフェイスがある場合に役立ちます。

IcmpSendEcho2Ex 関数は、ApcRoutine パラメーターと Event パラメーターが NULL の場合、同期的に呼び出されます。同期的に呼び出された場合、戻り値には Timeout パラメーターで指定した時間だけ待機した後に受信して ReplyBuffer に格納された応答の数が含まれます。戻り値が 0 の場合は、 GetLastError を呼び出して拡張エラー情報を取得してください。

IcmpSendEcho2Ex 関数は、ApcRoutine パラメーターまたは Event パラメーターのいずれかが指定された場合、非同期的に呼び出されます。非同期的に呼び出された場合、応答を受け取るために ReplyBuffer パラメーターと ReplySize パラメーターが必要です。ICMP 応答データは指定された ReplyBuffer にコピーされ、(Event パラメーターが指定されている場合は)アプリケーションにシグナルが送られるか、(ApcRoutine パラメーターが指定されている場合は)コールバック関数が呼び出されます。アプリケーションは、IcmpParseReplies 関数を使用して、ReplyBuffer パラメーターが指すデータを解析する必要があります。

Event パラメーターが指定された場合、IcmpSendEcho2Ex 関数は非同期的に呼び出されます。Event パラメーターで指定したイベントは、ICMP 応答が到着するたびにシグナル状態になります。このイベントオブジェクトの作成には、 CreateEvent 関数を使用してください。

ApcRoutine パラメーターが指定された場合、IcmpSendEcho2Ex 関数は非同期的に呼び出されます。ApcRoutine パラメーターは、ユーザー定義のコールバック関数を指している必要があります。ApcRoutine パラメーターで指定したコールバック関数は、ICMP 応答が到着するたびに呼び出されます。ApcRoutine パラメーターで指定したコールバック関数の呼び出しは、直列化されます。

Event パラメーターと ApcRoutine パラメーターの両方が指定された場合、Event パラメーターで指定したイベントは ICMP 応答が到着するたびにシグナル状態になりますが、ApcRoutine パラメーターで指定したコールバック関数は無視されます。

ApcRoutine パラメーターを使用して IcmpSendEcho2Ex 関数を非同期的に呼び出すアプリケーションは、ApcRoutine パラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE に強制するため、PIO_APC_ROUTINE_DEFINED を定義する必要があります。

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

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

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

コールバック関数に渡されるパラメーターには、次のものが含まれます。

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

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

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

ApcRoutine パラメーターで指定するコールバック関数は、IcmpSendEcho2Ex 関数を呼び出すアプリケーションと同じプロセス内に実装する必要があります。コールバック関数が別の DLL 内にある場合、その DLL は IcmpSendEcho2Ex 関数を呼び出す前にロードしておく必要があります。

IPv6 では、Icmp6CreateFileIcmp6SendEcho2Icmp6ParseReplies の各関数を使用してください。

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 IcmpSendEcho2Ex(
    HANDLE IcmpHandle,
    HANDLE Event,   // optional
    PIO_APC_ROUTINE ApcRoutine,   // optional
    void* ApcContext,   // optional
    DWORD SourceAddress,
    DWORD 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 IcmpSendEcho2Ex(
    IntPtr IcmpHandle,   // HANDLE
    IntPtr Event,   // HANDLE optional
    IntPtr ApcRoutine,   // PIO_APC_ROUTINE optional
    IntPtr ApcContext,   // void* optional
    uint SourceAddress,   // DWORD
    uint DestinationAddress,   // DWORD
    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 IcmpSendEcho2Ex(
    IcmpHandle As IntPtr,   ' HANDLE
    [Event] As IntPtr,   ' HANDLE optional
    ApcRoutine As IntPtr,   ' PIO_APC_ROUTINE optional
    ApcContext As IntPtr,   ' void* optional
    SourceAddress As UInteger,   ' DWORD
    DestinationAddress As UInteger,   ' DWORD
    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 : DWORD
' DestinationAddress : DWORD
' RequestData : void*
' RequestSize : WORD
' RequestOptions : IP_OPTION_INFORMATION* optional
' ReplyBuffer : void* out
' ReplySize : DWORD
' Timeout : DWORD
Declare PtrSafe Function IcmpSendEcho2Ex Lib "iphlpapi" ( _
    ByVal IcmpHandle As LongPtr, _
    ByVal Event As LongPtr, _
    ByVal ApcRoutine As LongPtr, _
    ByVal ApcContext As LongPtr, _
    ByVal SourceAddress As Long, _
    ByVal DestinationAddress As Long, _
    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

IcmpSendEcho2Ex = ctypes.windll.iphlpapi.IcmpSendEcho2Ex
IcmpSendEcho2Ex.restype = wintypes.DWORD
IcmpSendEcho2Ex.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
    wintypes.DWORD,  # SourceAddress : DWORD
    wintypes.DWORD,  # DestinationAddress : DWORD
    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')
IcmpSendEcho2Ex = Fiddle::Function.new(
  lib['IcmpSendEcho2Ex'],
  [
    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_INT,  # SourceAddress : DWORD
    -Fiddle::TYPE_INT,  # DestinationAddress : DWORD
    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 IcmpSendEcho2Ex(
        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: u32,  // DWORD
        DestinationAddress: u32,  // DWORD
        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 IcmpSendEcho2Ex(IntPtr IcmpHandle, IntPtr Event, IntPtr ApcRoutine, IntPtr ApcContext, uint SourceAddress, uint DestinationAddress, IntPtr RequestData, ushort RequestSize, IntPtr RequestOptions, IntPtr ReplyBuffer, uint ReplySize, uint Timeout);
"@
$api = Add-Type -MemberDefinition $sig -Name 'IPHLPAPI_IcmpSendEcho2Ex' -Namespace Win32 -PassThru
# $api::IcmpSendEcho2Ex(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout)
#uselib "IPHLPAPI.dll"
#func global IcmpSendEcho2Ex "IcmpSendEcho2Ex" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; IcmpSendEcho2Ex IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, 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 : DWORD -> "sptr"
; DestinationAddress : DWORD -> "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 IcmpSendEcho2Ex "IcmpSendEcho2Ex" sptr, sptr, sptr, sptr, int, int, sptr, int, var, sptr, int, int
; res = IcmpSendEcho2Ex(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 : DWORD -> "int"
; DestinationAddress : DWORD -> "int"
; 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 IcmpSendEcho2Ex(HANDLE IcmpHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, void* ApcContext, DWORD SourceAddress, DWORD DestinationAddress, void* RequestData, WORD RequestSize, IP_OPTION_INFORMATION* RequestOptions, void* ReplyBuffer, DWORD ReplySize, DWORD Timeout)
#uselib "IPHLPAPI.dll"
#cfunc global IcmpSendEcho2Ex "IcmpSendEcho2Ex" intptr, intptr, intptr, intptr, int, int, intptr, int, var, intptr, int, int
; res = IcmpSendEcho2Ex(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 : DWORD -> "int"
; DestinationAddress : DWORD -> "int"
; 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")
	procIcmpSendEcho2Ex = iphlpapi.NewProc("IcmpSendEcho2Ex")
)

// IcmpHandle (HANDLE), Event (HANDLE optional), ApcRoutine (PIO_APC_ROUTINE optional), ApcContext (void* optional), SourceAddress (DWORD), DestinationAddress (DWORD), RequestData (void*), RequestSize (WORD), RequestOptions (IP_OPTION_INFORMATION* optional), ReplyBuffer (void* out), ReplySize (DWORD), Timeout (DWORD)
r1, _, err := procIcmpSendEcho2Ex.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 IcmpSendEcho2Ex(
  IcmpHandle: THandle;   // HANDLE
  Event: THandle;   // HANDLE optional
  ApcRoutine: Pointer;   // PIO_APC_ROUTINE optional
  ApcContext: Pointer;   // void* optional
  SourceAddress: DWORD;   // DWORD
  DestinationAddress: DWORD;   // DWORD
  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 'IcmpSendEcho2Ex';
result := DllCall("IPHLPAPI\IcmpSendEcho2Ex"
    , "Ptr", IcmpHandle   ; HANDLE
    , "Ptr", Event   ; HANDLE optional
    , "Ptr", ApcRoutine   ; PIO_APC_ROUTINE optional
    , "Ptr", ApcContext   ; void* optional
    , "UInt", SourceAddress   ; DWORD
    , "UInt", DestinationAddress   ; DWORD
    , "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
●IcmpSendEcho2Ex(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, DestinationAddress, RequestData, RequestSize, RequestOptions, ReplyBuffer, ReplySize, Timeout) = DLL("IPHLPAPI.dll", "dword IcmpSendEcho2Ex(void*, void*, void*, void*, dword, dword, void*, int, void*, void*, dword, dword)")
# 呼び出し: IcmpSendEcho2Ex(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 : DWORD -> "dword"
# DestinationAddress : DWORD -> "dword"
# 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 IcmpSendEcho2Ex(
    IcmpHandle: ?*anyopaque, // HANDLE
    Event: ?*anyopaque, // HANDLE optional
    ApcRoutine: ?*anyopaque, // PIO_APC_ROUTINE optional
    ApcContext: ?*anyopaque, // void* optional
    SourceAddress: u32, // DWORD
    DestinationAddress: u32, // DWORD
    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 IcmpSendEcho2Ex(
    IcmpHandle: pointer,  # HANDLE
    Event: pointer,  # HANDLE optional
    ApcRoutine: pointer,  # PIO_APC_ROUTINE optional
    ApcContext: pointer,  # void* optional
    SourceAddress: uint32,  # DWORD
    DestinationAddress: uint32,  # DWORD
    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: "IcmpSendEcho2Ex", stdcall, dynlib: "IPHLPAPI.dll".}
pragma(lib, "iphlpapi");
extern(Windows)
uint IcmpSendEcho2Ex(
    void* IcmpHandle,   // HANDLE
    void* Event,   // HANDLE optional
    void* ApcRoutine,   // PIO_APC_ROUTINE optional
    void* ApcContext,   // void* optional
    uint SourceAddress,   // DWORD
    uint DestinationAddress,   // DWORD
    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((:IcmpSendEcho2Ex, "IPHLPAPI.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, UInt32, UInt32, 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 : DWORD -> UInt32
# DestinationAddress : DWORD -> UInt32
# 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 IcmpSendEcho2Ex(
    void* IcmpHandle,
    void* Event,
    void* ApcRoutine,
    void* ApcContext,
    uint32_t SourceAddress,
    uint32_t DestinationAddress,
    void* RequestData,
    uint16_t RequestSize,
    void* RequestOptions,
    void* ReplyBuffer,
    uint32_t ReplySize,
    uint32_t Timeout);
]]
local iphlpapi = ffi.load("iphlpapi")
-- iphlpapi.IcmpSendEcho2Ex(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 : DWORD
-- DestinationAddress : DWORD
-- 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 IcmpSendEcho2Ex = lib.func('__stdcall', 'IcmpSendEcho2Ex', 'uint32_t', ['void *', 'void *', 'void *', 'void *', 'uint32_t', 'uint32_t', 'void *', 'uint16_t', 'void *', 'void *', 'uint32_t', 'uint32_t']);
// IcmpSendEcho2Ex(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 : DWORD -> 'uint32_t'
// DestinationAddress : DWORD -> 'uint32_t'
// 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", {
  IcmpSendEcho2Ex: { parameters: ["pointer", "pointer", "pointer", "pointer", "u32", "u32", "pointer", "u16", "pointer", "pointer", "u32", "u32"], result: "u32" },
});
// lib.symbols.IcmpSendEcho2Ex(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 : DWORD -> "u32"
// DestinationAddress : DWORD -> "u32"
// 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 IcmpSendEcho2Ex(
    void* IcmpHandle,
    void* Event,
    void* ApcRoutine,
    void* ApcContext,
    uint32_t SourceAddress,
    uint32_t DestinationAddress,
    void* RequestData,
    uint16_t RequestSize,
    void* RequestOptions,
    void* ReplyBuffer,
    uint32_t ReplySize,
    uint32_t Timeout);
C, "IPHLPAPI.dll");
// $ffi->IcmpSendEcho2Ex(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 : DWORD
// DestinationAddress : DWORD
// 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 IcmpSendEcho2Ex(
        Pointer IcmpHandle,   // HANDLE
        Pointer Event,   // HANDLE optional
        Callback ApcRoutine,   // PIO_APC_ROUTINE optional
        Pointer ApcContext,   // void* optional
        int SourceAddress,   // DWORD
        int DestinationAddress,   // DWORD
        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 IcmpSendEcho2Ex = IcmpSendEcho2Ex(
    IcmpHandle : Void*,   # HANDLE
    Event : Void*,   # HANDLE optional
    ApcRoutine : Void*,   # PIO_APC_ROUTINE optional
    ApcContext : Void*,   # void* optional
    SourceAddress : UInt32,   # DWORD
    DestinationAddress : UInt32,   # DWORD
    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 IcmpSendEcho2ExNative = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Uint32, Pointer<Void>, Uint16, Pointer<Void>, Pointer<Void>, Uint32, Uint32);
typedef IcmpSendEcho2ExDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, Pointer<Void>, int, Pointer<Void>, Pointer<Void>, int, int);
final IcmpSendEcho2Ex = DynamicLibrary.open('IPHLPAPI.dll')
    .lookupFunction<IcmpSendEcho2ExNative, IcmpSendEcho2ExDart>('IcmpSendEcho2Ex');
// IcmpHandle : HANDLE -> Pointer<Void>
// Event : HANDLE optional -> Pointer<Void>
// ApcRoutine : PIO_APC_ROUTINE optional -> Pointer<Void>
// ApcContext : void* optional -> Pointer<Void>
// SourceAddress : DWORD -> Uint32
// DestinationAddress : DWORD -> Uint32
// 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 IcmpSendEcho2Ex(
  IcmpHandle: THandle;   // HANDLE
  Event: THandle;   // HANDLE optional
  ApcRoutine: Pointer;   // PIO_APC_ROUTINE optional
  ApcContext: Pointer;   // void* optional
  SourceAddress: DWORD;   // DWORD
  DestinationAddress: DWORD;   // DWORD
  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 'IcmpSendEcho2Ex';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "IcmpSendEcho2Ex"
  c_IcmpSendEcho2Ex :: Ptr () -> Ptr () -> Ptr () -> Ptr () -> Word32 -> Word32 -> 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 : DWORD -> Word32
-- DestinationAddress : DWORD -> Word32
-- 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 icmpsendecho2ex =
  foreign "IcmpSendEcho2Ex"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> (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 : DWORD -> uint32_t *)
(* DestinationAddress : DWORD -> uint32_t *)
(* 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 ("IcmpSendEcho2Ex" icmp-send-echo2-ex :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 :uint32)   ; DWORD
  (destination-address :uint32)   ; DWORD
  (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 $IcmpSendEcho2Ex = Win32::API::More->new('IPHLPAPI',
    'DWORD IcmpSendEcho2Ex(HANDLE IcmpHandle, HANDLE Event, LPVOID ApcRoutine, LPVOID ApcContext, DWORD SourceAddress, DWORD DestinationAddress, LPVOID RequestData, WORD RequestSize, LPVOID RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout)');
# my $ret = $IcmpSendEcho2Ex->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 : DWORD -> DWORD
# DestinationAddress : DWORD -> DWORD
# 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 を使用してください。

関連項目

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