[BlueLeaf1336]> PROBLEMS> PingShooter>

PingShooter - using ICMP.DLL

historyTOP

2004/01/21:作成(icmp_dll.pasのコメントの超訳中...)

icmp_dll.pasTOP

2004/01/21

How to Ping a machine using the ICMP.DLL APIをパクリます。ついでに必要そうな箇所を日本語に訳します。

//---------------------------------------------------------------------
//         icmp_dll.pas  part of Ping Demo
//-----------------------------------------------------------------
//  DISCLAIMER:
//      This software is provided 'as-is', without any express or
//      implied warranty.  In no event will the author be held liable
//      for any damages arising from the use of this software.
//-----------------------------------------------------------------
//  DESCRIPTION:
//      This is a basic representation of what is contained in
//      the Win32 API file ICMP.DLL.  This file is based on a
//      USENET post by Mike Cariotoglou (full information follows).
//
//      For my purposes, I extended Ticmp_echo_reply and called this
//      extension TsmICMP_Echo_Reply.  The reason for this is to allow
//      a simple way of providing a reply buffer.  While there are
//      certainly more robust ways of accomplishing this, this does get
//      the job done.
//---------------------------------------------------------------------
//  REFERENCES:
//      USENET Post By:  Mike Cariotoglou (mike@REMOVETHIS.singular.gr)
//             Subject:  "Re: PING and DELPHI"
//           Newsgroup:  borland.public.delphi.internet
//                Date:  1999/05/18  (May 18, 1999) 
//---------------------------------------------------------------------

unit icmp_dll;

interface

uses windows;

Const

//
// IP API から戻される IP_STATUS コード
//
   IP_STATUS_BASE                 = 11000;
   IP_SUCCESS                     = 0;
   IP_BUF_TOO_SMALL               = (IP_STATUS_BASE + 1);
   IP_DEST_NET_UNREACHABLE        = (IP_STATUS_BASE + 2);
   IP_DEST_HOST_UNREACHABLE       = (IP_STATUS_BASE + 3);
   IP_DEST_PROT_UNREACHABLE       = (IP_STATUS_BASE + 4);
   IP_DEST_PORT_UNREACHABLE       = (IP_STATUS_BASE + 5);
   IP_NO_RESOURCES                = (IP_STATUS_BASE + 6);
   IP_BAD_OPTION                  = (IP_STATUS_BASE + 7);
   IP_HW_ERROR                    = (IP_STATUS_BASE + 8);
   IP_PACKET_TOO_BIG              = (IP_STATUS_BASE + 9);
   IP_REQ_TIMED_OUT               = (IP_STATUS_BASE + 10);
   IP_BAD_REQ                     = (IP_STATUS_BASE + 11);
   IP_BAD_ROUTE                   = (IP_STATUS_BASE + 12);
   IP_TTL_EXPIRED_TRANSIT         = (IP_STATUS_BASE + 13);
   IP_TTL_EXPIRED_REASSEM         = (IP_STATUS_BASE + 14);
   IP_PARAM_PROBLEM               = (IP_STATUS_BASE + 15);
   IP_SOURCE_QUENCH               = (IP_STATUS_BASE + 16);
   IP_OPTION_TOO_BIG              = (IP_STATUS_BASE + 17);
   IP_BAD_DESTINATION             = (IP_STATUS_BASE + 18);
//
// The next group are status codes passed up on status indications to
// transport layer protocols.
//
   IP_ADDR_DELETED                = (IP_STATUS_BASE + 19);
   IP_SPEC_MTU_CHANGE             = (IP_STATUS_BASE + 20);
   IP_MTU_CHANGE                  = (IP_STATUS_BASE + 21);
   IP_UNLOAD                      = (IP_STATUS_BASE + 22);
   IP_GENERAL_FAILURE             = (IP_STATUS_BASE + 50);
   MAX_IP_STATUS                  = IP_GENERAL_FAILURE;
   IP_PENDING                     = (IP_STATUS_BASE + 255);

//
// Values used in the IP header Flags field.
//
   IP_FLAG_DF                     = $2;     //  このパケットを fragment しちゃ駄目

//
// Supported IP Option Types.
//
// ip_option_information 構造体の OptionsData フィールドで使用されるオプションの定義
// それぞれの完全な意味については RFC 791 を参照
//
   IP_OPT_EOL                     = 0;      //  End of list option
   IP_OPT_NOP                     = 1;      //  No operation
   IP_OPT_SECURITY                = $82;    //  Security option
   IP_OPT_LSRR                    = $83;    //  Loose source route
   IP_OPT_SSRR                    = $89;    //  Strict source route
   IP_OPT_RR                      = $7;     //  Record route
   IP_OPT_TS                      = $44;    //  Timestamp
   IP_OPT_SID                     = $88;    //  Stream ID (廃止)

   MAX_OPT_SIZE                   = 40;     //  IP オプションの最大バイト長

Type

 TIPAddr=integer;     // IPアドレス
 TIPMask=integer;     // サブネットマスク
 TIP_STATUS=Integer;  // IP API の戻り値の Status code

//
// ip_option_information構造体はIPパケットのヘッダに含まれるオプションを記述する。
// TTL, TOS, Flagsの値はヘッダの特別なフィールドを格納する。OptionsDataは標準の
// IPヘッダに続くオプション領域に格納される。
// With the exception of source route options, this data must be in the
// format to be transmitted on the wire as specified in RFC 791. A source
// route option should contain the full route - first hop thru final
// destination - in the route data. The first hop will be pulled out of the
// data and the option will be reformatted accordingly. Otherwise, the route
// option should be formatted as specified in RFC 791.
//
POption_Information=^TOption_Information;
TOption_Information=record
                     Ttl:byte;             // Time To Live
                     Tos:byte;             // Type Of Service
                     Flags:byte;           // IPヘッダフラグ
                     OptionsSize:byte;     // オプションデータのバイトサイズ
                     OptionsData:pointer;  // オプションデータのポインタ
                    end;

// The icmp_echo_reply structure describes the data returned in response
// to an echo request.
//
Picmp_echo_reply=^Ticmp_echo_reply;
Ticmp_echo_reply=record
                    Address:TipAddr;                // 応答アドレス
                    Status:integer;                 // 応答IP_STATUS
                    RoundTripTime:integer;          // RTT(ミリ秒)
                    DataSize:word;                  // 応答データバイトサイズ
                    Reserved:word;                  // システムが予約
                    Data:pointer;                   // 応答データへのポインタ
                    Options:Toption_Information;    // 応答オプション
                 end;
TsmICMP_Echo_Reply=record
                    Address:TipAddr;                // 応答アドレス
                    Status:integer;                 // 応答IP_STATUS
                    RoundTripTime:integer;          // RTT(ミリ秒)
                    DataSize:word;                  // 応答データバイトサイズ
                    Reserved:word;                  // システムが予約
                    DataPtr:pointer;                // 応答データへのポインタ
                    Options:Toption_Information;    // 応答オプション
                    Data: array[0..255] of Char;
                 end;

//++
//
// 関数名:
//     IcmpCreateFile
//
// 説明:
//     ICMP Echo 要求を発行できるハンドルを開く
//
// 引数:
//     なし
//
// 戻り値:
//     ハンドルかINVALID_HANDLE_VALUEか。エラー情報はGetLastError()で。
//--
function IcmpCreateFile:Thandle; StdCall;

//
// 関数名:
//     IcmpCloseHandle
// 説明:
//     ICMPOpenFileで開いたハンドルを閉じる
//
// 引数:
//     IcmpHandle  - 閉じたいハンドル
//
// 戻り値:
//     成功したらTRUE失敗ならFALSE。エラー情報はGetLastError()で。
//--
function IcmpCloseHandle(H:Thandle):Bool; StdCall;

//
// 関数名:
//     IcmpSendEcho
//
// 説明:
//     ICMP Echo 要求を送り何らかの応答を戻す。タイムアウトが発生するか
//     応答バッファが埋められたら呼び出し元に処理を戻す
//
// 引数:
//     IcmpHandle           - ICMPCreateFileの戻り値のハンドル
//     DestinationAddress   - echo要求の送り先
//     RequestData          - 送信要求データバッファ
//     RequestSize          - 要求データバッファのバイト数
//     RequestOptions       - 要求IPヘッダオプションのポインタ(NULLかも)
//     ReplyBuffer          - 要求への何らかの応答を保持するバッファ
//                            On return, the buffer will contain an array of
//                            ICMP_ECHO_REPLY structures followed by the
//                            options and data for the replies. The buffer
//                            should be large enough to hold at least one
//                            ICMP_ECHO_REPLY structure plus
//                            MAX(RequestSize, 8) bytes of data since an ICMP
//                            error message contains 8 bytes of data.
//     ReplySize            - 応答バッファのバイトサイズ
//     Timeout              - 応答を待つ時間(ミリ秒)
//
// 戻り値:
//     ReplyBufferに含まれるICMP_ECHO_REPLY構造体の数を戻す。
//     それぞれの応答ステータスは構造体中に含まれる。zeroが戻された場合は
//     GetLastError()で。
//--
Function IcmpSendEcho(IcmpHandle:Thandle;
                      DestinationAddress:TipAddr;
                      RequestData:pointer;
                      RequestSize:word;
                      RequestOptions:POption_Information;
                      ReplyBuffer:pointer;
                      ReplySize:integer;
                      Timeout:integer):Integer; stdcall;

Implementation

function IcmpCreateFile;  external 'Icmp.Dll';
function IcmpCloseHandle; external 'Icmp.Dll';
Function IcmpSendEcho;    external 'Icmp.Dll';

end.

sampleTOP

(まだです...)

EOFTOP