IcmpSendEcho2Ex
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| IcmpHandle | HANDLE | in | ICMPCreateFile 関数が返すオープン済みのハンドル。 |
| Event | HANDLE | inoptional | ICMP 応答が到着するたびにシグナル状態になるイベント。このパラメーターを指定する場合は、有効なイベントオブジェクトのハンドルが必要です。このイベントオブジェクトの作成には、 CreateEvent 関数または CreateEventEx 関数を使用してください。 イベントの使用に関する詳細は、Event Objects を参照してください。 |
| ApcRoutine | PIO_APC_ROUTINE | inoptional | 呼び出し側スレッドがアラート可能状態にあり、かつ ICMP 応答が到着したときに呼び出されるルーチン。このパラメーターのデータ型を FARPROC ではなく PIO_APC_ROUTINE に強制するため、PIO_APC_ROUTINE_DEFINED を定義する必要があります。 |
| ApcContext | void* | inoptional | ICMP 応答が到着するかエラーが発生するたびに、ApcRoutine パラメーターで指定したコールバックルーチンに渡される省略可能なパラメーター。 |
| SourceAddress | DWORD | in | エコー要求を発行する IPv4 送信元アドレス。このアドレスは IPAddr 構造体の形式で指定します。 |
| DestinationAddress | DWORD | in | エコー要求の IPv4 宛先アドレス。このアドレスは IPAddr 構造体の形式で指定します。 |
| RequestData | void* | in | 要求として送信するデータを格納したバッファーへのポインター。 |
| RequestSize | WORD | in | RequestData パラメーターが指す要求データバッファーのサイズ(バイト単位)。 |
| RequestOptions | IP_OPTION_INFORMATION* | inoptional | 要求に対する IP ヘッダーオプションへのポインター。IP_OPTION_INFORMATION 構造体の形式で指定します。64 ビットプラットフォームでは、このパラメーターは IP_OPTION_INFORMATION32 構造体の形式になります。 IP ヘッダーオプションを指定する必要がない場合、このパラメーターは NULL でかまいません。 |
| ReplyBuffer | void* | out | 要求に対する応答を格納するバッファーへのポインター。制御が返ったとき、このバッファーには ICMP_ECHO_REPLY 構造体の配列と、それに続くオプションおよびデータが格納されます。バッファーは、少なくとも 1 つの ICMP_ECHO_REPLY 構造体と RequestSize バイト分のデータを格納できる大きさが必要です。 さらにこのバッファーは、追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体分の領域も格納できる大きさが必要です。 |
| ReplySize | DWORD | in | 応答バッファーに割り当てられたサイズ(バイト単位)。バッファーは、少なくとも 1 つの ICMP_ECHO_REPLY 構造体と RequestSize バイト分のデータを格納できる大きさが必要です。 さらにこのバッファーは、追加で 8 バイトのデータ(ICMP エラーメッセージのサイズ)と IO_STATUS_BLOCK 構造体分の領域も格納できる大きさが必要です。 |
| Timeout | DWORD | in | 応答を待機する時間(ミリ秒単位)。 |
戻り値の型: DWORD
公式ドキュメント
IPv4 の ICMP エコー要求を送信し、(Event または ApcRoutine が NULL 以外の場合は)直ちに制御を返すか、指定したタイムアウト経過後に制御を返します。ReplyBuffer には、応答があれば ICMP 応答が格納されます。
戻り値
同期的に呼び出された場合、IcmpSendEcho2Ex 関数は受信して ReplyBuffer に格納した応答の数を返します。戻り値が 0 の場合は、 GetLastError を呼び出して拡張エラー情報を取得してください。
非同期的に呼び出された場合、IcmpSendEcho2Ex 関数は処理が進行中であることを示す ERROR_IO_PENDING を返します。結果は、Event パラメーターで指定したイベントがシグナル状態になったとき、または ApcRoutine パラメーターのコールバック関数が呼び出されたときに、後から取得できます。
戻り値が 0 の場合は、 GetLastError を呼び出して拡張エラー情報を取得してください。
関数が失敗した場合、GetLastError が返す拡張エラーコードは、次のいずれかの値になります。
| 戻り値コード | 説明 |
|---|---|
| 関数に無効なパラメーターが渡されました。このエラーは、IcmpHandle パラメーターに無効なハンドルが含まれている場合に返されます。また、ReplySize パラメーターに ICMP_ECHO_REPLY 構造体のサイズより小さい値が指定された場合にも返されます。 | |
| 処理が進行中です。この値は、IcmpSendEcho2Ex の非同期呼び出しが成功したときに返されるもので、エラーを示すものではありません。 | |
| 処理を完了するのに十分なメモリがありません。 | |
| 要求はサポートされていません。このエラーは、ローカルコンピューターに IPv4 スタックが存在しない場合に返されます。 | |
| 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 を定義する必要があります。
ApcRoutine が指すコールバック関数は、次の構文で VOID 型の関数として定義する必要があります。
typedef
VOID WINAPI
(*PIO_APC_ROUTINE) (
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
コールバック関数に渡されるパラメーターには、次のものが含まれます。
ApcRoutine パラメーターで指定するコールバック関数は、IcmpSendEcho2Ex 関数を呼び出すアプリケーションと同じプロセス内に実装する必要があります。コールバック関数が別の DLL 内にある場合、その DLL は IcmpSendEcho2Ex 関数を呼び出す前にロードしておく必要があります。
IPv6 では、Icmp6CreateFile、Icmp6SendEcho2、Icmp6ParseReplies の各関数を使用してください。
Iphlpapi.h ヘッダーファイルのインクルードディレクティブは、Icmpapi.h ヘッダーファイルより前に配置する必要がある点に注意してください。
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 方式にも切替可。#uselib "IPHLPAPI.dll" #cfunc global IcmpSendEcho2Ex "IcmpSendEcho2Ex" sptr, sptr, sptr, sptr, int, int, sptr, int, sptr, sptr, int, int ; res = IcmpSendEcho2Ex(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, 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 : DWORD -> "int" ; DestinationAddress : DWORD -> "int" ; 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 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 方式にも切替可。; 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, intptr, intptr, int, int ; res = IcmpSendEcho2Ex(IcmpHandle, Event, ApcRoutine, ApcContext, SourceAddress, 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 : DWORD -> "int" ; DestinationAddress : DWORD -> "int" ; 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")
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 // DWORDfunction 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 を使用してください。関連項目
- f IcmpSendEcho — 指定先へICMPエコー要求を送信し応答を受信する。
- f IcmpSendEcho2 — ICMPエコー要求を同期または非同期で送信する。
- f CreateEventW — 名前付きまたは無名のイベントを作成する(Unicode版)。
- f CreateEventExW — アクセス権とフラグを指定してイベントを作成する(Unicode版)。
- f GetLastError — 呼び出しスレッドの最終エラーコードを取得する。
- f IcmpCreateFile — ICMPエコー要求送信用のハンドルを作成する。
- s ICMP_ECHO_REPLY
- s IN_ADDR
- s IP_OPTION_INFORMATION32
- f Icmp6CreateFile — ICMPv6エコー要求送信用のハンドルを作成する。
- f Icmp6ParseReplies — ICMPv6エコー応答バッファを解析し応答数を返す。
- f Icmp6SendEcho2 — IPv6でICMPv6エコー要求を送信し応答を受信する。
- f IcmpParseReplies — ICMPエコー応答バッファを解析し応答数を返す。