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

IcmpParseReplies

関数
ICMPエコー応答バッファを解析し応答数を返す。
DLLIPHLPAPI.dll呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

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

DWORD IcmpParseReplies(
    void* ReplyBuffer,
    DWORD ReplySize
);

パラメーター

名前方向説明
ReplyBuffervoid*out

IcmpSendEcho2 に渡されたバッファです。このバッファは ICMP_ECHO_REPLY 構造体の配列を保持するように書き換えられ、その型は PICMP_ECHO_REPLY です。

64 ビットプラットフォームでは、このバッファは ICMP_ECHO_REPLY32 構造体の配列を保持するように書き換えられ、その型は PICMP_ECHO_REPLY32 です。

ReplySizeDWORDinReplyBuffer パラメーターが指すバッファのサイズ (バイト単位) です。

戻り値の型: DWORD

公式ドキュメント

指定された応答バッファを解析し、見つかった ICMP エコー要求への応答の数を返します。

戻り値

IcmpParseReplies 関数は、成功した場合に見つかった ICMP 応答の数を返します。エラーの場合はゼロを返します。追加のエラー情報については GetLastError を呼び出してください。

解説(Remarks)

IcmpParseReplies 関数は、以前に IcmpSendEcho に渡された応答バッファに対して使用しないでください。 IcmpSendEcho 関数は、ユーザーに制御を返す前にそのバッファを解析します。この関数は IcmpSendEcho2 とのみ併用してください。

IcmpParseReplies 関数は、Windows 2000 では Icmp.dll からエクスポートされます。Windows XP 以降では、IcmpParseReplies 関数は Iphlpapi.dll からエクスポートされます。この関数を使用する際に Windows のバージョンチェックを行うことは推奨されません。この関数を使用するアプリケーションで、Windows 2000、Windows XP、Windows Server 2003 およびそれ以降の Windows バージョン間での移植性が必要な場合は、Icmp.lib または Iphlpapi.lib ファイルのいずれにも静的にリンクしないでください。代わりに、アプリケーションは LoadLibraryGetProcAddress を呼び出して、Iphlpapi.dll 内に IcmpParseReplies が存在するかどうかを確認する必要があります。それが見つからない場合は、LoadLibraryGetProcAddress を呼び出して、Icmp.dll 内に IcmpParseReplies が存在するかどうかを確認する必要があります。

Iphlpapi.h ヘッダーファイルの include ディレクティブは、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 IcmpParseReplies(
    void* ReplyBuffer,
    DWORD ReplySize
);
[DllImport("IPHLPAPI.dll", SetLastError = true, ExactSpelling = true)]
static extern uint IcmpParseReplies(
    IntPtr ReplyBuffer,   // void* out
    uint ReplySize   // DWORD
);
<DllImport("IPHLPAPI.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function IcmpParseReplies(
    ReplyBuffer As IntPtr,   ' void* out
    ReplySize As UInteger   ' DWORD
) As UInteger
End Function
' ReplyBuffer : void* out
' ReplySize : DWORD
Declare PtrSafe Function IcmpParseReplies Lib "iphlpapi" ( _
    ByVal ReplyBuffer As LongPtr, _
    ByVal ReplySize As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

IcmpParseReplies = ctypes.windll.iphlpapi.IcmpParseReplies
IcmpParseReplies.restype = wintypes.DWORD
IcmpParseReplies.argtypes = [
    ctypes.POINTER(None),  # ReplyBuffer : void* out
    wintypes.DWORD,  # ReplySize : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('IPHLPAPI.dll')
IcmpParseReplies = Fiddle::Function.new(
  lib['IcmpParseReplies'],
  [
    Fiddle::TYPE_VOIDP,  # ReplyBuffer : void* out
    -Fiddle::TYPE_INT,  # ReplySize : DWORD
  ],
  -Fiddle::TYPE_INT)
#[link(name = "iphlpapi")]
extern "system" {
    fn IcmpParseReplies(
        ReplyBuffer: *mut (),  // void* out
        ReplySize: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("IPHLPAPI.dll", SetLastError = true)]
public static extern uint IcmpParseReplies(IntPtr ReplyBuffer, uint ReplySize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'IPHLPAPI_IcmpParseReplies' -Namespace Win32 -PassThru
# $api::IcmpParseReplies(ReplyBuffer, ReplySize)
#uselib "IPHLPAPI.dll"
#func global IcmpParseReplies "IcmpParseReplies" sptr, sptr
; IcmpParseReplies ReplyBuffer, ReplySize   ; 戻り値は stat
; ReplyBuffer : void* out -> "sptr"
; ReplySize : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "IPHLPAPI.dll"
#cfunc global IcmpParseReplies "IcmpParseReplies" sptr, int
; res = IcmpParseReplies(ReplyBuffer, ReplySize)
; ReplyBuffer : void* out -> "sptr"
; ReplySize : DWORD -> "int"
; DWORD IcmpParseReplies(void* ReplyBuffer, DWORD ReplySize)
#uselib "IPHLPAPI.dll"
#cfunc global IcmpParseReplies "IcmpParseReplies" intptr, int
; res = IcmpParseReplies(ReplyBuffer, ReplySize)
; ReplyBuffer : void* out -> "intptr"
; ReplySize : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	iphlpapi = windows.NewLazySystemDLL("IPHLPAPI.dll")
	procIcmpParseReplies = iphlpapi.NewProc("IcmpParseReplies")
)

// ReplyBuffer (void* out), ReplySize (DWORD)
r1, _, err := procIcmpParseReplies.Call(
	uintptr(ReplyBuffer),
	uintptr(ReplySize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function IcmpParseReplies(
  ReplyBuffer: Pointer;   // void* out
  ReplySize: DWORD   // DWORD
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'IcmpParseReplies';
result := DllCall("IPHLPAPI\IcmpParseReplies"
    , "Ptr", ReplyBuffer   ; void* out
    , "UInt", ReplySize   ; DWORD
    , "UInt")   ; return: DWORD
●IcmpParseReplies(ReplyBuffer, ReplySize) = DLL("IPHLPAPI.dll", "dword IcmpParseReplies(void*, dword)")
# 呼び出し: IcmpParseReplies(ReplyBuffer, ReplySize)
# ReplyBuffer : void* out -> "void*"
# ReplySize : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "iphlpapi" fn IcmpParseReplies(
    ReplyBuffer: ?*anyopaque, // void* out
    ReplySize: u32 // DWORD
) callconv(std.os.windows.WINAPI) u32;
proc IcmpParseReplies(
    ReplyBuffer: pointer,  # void* out
    ReplySize: uint32  # DWORD
): uint32 {.importc: "IcmpParseReplies", stdcall, dynlib: "IPHLPAPI.dll".}
pragma(lib, "iphlpapi");
extern(Windows)
uint IcmpParseReplies(
    void* ReplyBuffer,   // void* out
    uint ReplySize   // DWORD
);
ccall((:IcmpParseReplies, "IPHLPAPI.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, UInt32),
      ReplyBuffer, ReplySize)
# ReplyBuffer : void* out -> Ptr{Cvoid}
# ReplySize : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t IcmpParseReplies(
    void* ReplyBuffer,
    uint32_t ReplySize);
]]
local iphlpapi = ffi.load("iphlpapi")
-- iphlpapi.IcmpParseReplies(ReplyBuffer, ReplySize)
-- ReplyBuffer : void* out
-- ReplySize : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('IPHLPAPI.dll');
const IcmpParseReplies = lib.func('__stdcall', 'IcmpParseReplies', 'uint32_t', ['void *', 'uint32_t']);
// IcmpParseReplies(ReplyBuffer, ReplySize)
// ReplyBuffer : void* out -> 'void *'
// ReplySize : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("IPHLPAPI.dll", {
  IcmpParseReplies: { parameters: ["pointer", "u32"], result: "u32" },
});
// lib.symbols.IcmpParseReplies(ReplyBuffer, ReplySize)
// ReplyBuffer : void* out -> "pointer"
// ReplySize : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t IcmpParseReplies(
    void* ReplyBuffer,
    uint32_t ReplySize);
C, "IPHLPAPI.dll");
// $ffi->IcmpParseReplies(ReplyBuffer, ReplySize);
// ReplyBuffer : void* out
// ReplySize : 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 IcmpParseReplies(
        Pointer ReplyBuffer,   // void* out
        int ReplySize   // DWORD
    );
}
@[Link("iphlpapi")]
lib LibIPHLPAPI
  fun IcmpParseReplies = IcmpParseReplies(
    ReplyBuffer : Void*,   # void* out
    ReplySize : 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 IcmpParseRepliesNative = Uint32 Function(Pointer<Void>, Uint32);
typedef IcmpParseRepliesDart = int Function(Pointer<Void>, int);
final IcmpParseReplies = DynamicLibrary.open('IPHLPAPI.dll')
    .lookupFunction<IcmpParseRepliesNative, IcmpParseRepliesDart>('IcmpParseReplies');
// ReplyBuffer : void* out -> Pointer<Void>
// ReplySize : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function IcmpParseReplies(
  ReplyBuffer: Pointer;   // void* out
  ReplySize: DWORD   // DWORD
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'IcmpParseReplies';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "IcmpParseReplies"
  c_IcmpParseReplies :: Ptr () -> Word32 -> IO Word32
-- ReplyBuffer : void* out -> Ptr ()
-- ReplySize : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let icmpparsereplies =
  foreign "IcmpParseReplies"
    ((ptr void) @-> uint32_t @-> returning uint32_t)
(* ReplyBuffer : void* out -> (ptr void) *)
(* ReplySize : 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 ("IcmpParseReplies" icmp-parse-replies :convention :stdcall) :uint32
  (reply-buffer :pointer)   ; void* out
  (reply-size :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $IcmpParseReplies = Win32::API::More->new('IPHLPAPI',
    'DWORD IcmpParseReplies(LPVOID ReplyBuffer, DWORD ReplySize)');
# my $ret = $IcmpParseReplies->Call($ReplyBuffer, $ReplySize);
# ReplyBuffer : void* out -> LPVOID
# ReplySize : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目