123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- {******************************************************************************}
- { }
- { ICMP Echo API interface Unit for Object Pascal }
- { }
- { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
- { Corporation. All Rights Reserved. }
- { }
- { The original file is: icmpapi.h, released Feb 2003. The original Pascal }
- { code is: IcmpApi.pas, released December 2003. The initial developer of the }
- { Pascal code is Marcel van Brakel (brakelm att chello dott nl). }
- { }
- { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
- { Marcel van Brakel. All Rights Reserved. }
- { }
- { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
- { }
- { You may retrieve the latest version of this file at the Project JEDI }
- { APILIB home page, located at http://jedi-apilib.sourceforge.net }
- { }
- { The contents of this file are used with permission, subject to the Mozilla }
- { Public License Version 1.1 (the "License"); you may not use this file except }
- { in compliance with the License. You may obtain a copy of the License at }
- { http://www.mozilla.org/MPL/MPL-1.1.html }
- { }
- { Software distributed under the License is distributed on an "AS IS" basis, }
- { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
- { the specific language governing rights and limitations under the License. }
- { }
- { Alternatively, the contents of this file may be used under the terms of the }
- { GNU Lesser General Public License (the "LGPL License"), in which case the }
- { provisions of the LGPL License are applicable instead of those above. }
- { If you wish to allow use of your version of this file only under the terms }
- { of the LGPL License and not to allow others to use your version of this file }
- { under the MPL, indicate your decision by deleting the provisions above and }
- { replace them with the notice and other provisions required by the LGPL }
- { License. If you do not delete the provisions above, a recipient may use }
- { your version of this file under either the MPL or the LGPL License. }
- { }
- { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
- { }
- {******************************************************************************}
- unit JwaIcmpApi;
- {$WEAKPACKAGEUNIT}
- {$HPPEMIT ''}
- {$HPPEMIT '#include "icmpapi.h"'}
- {$HPPEMIT ''}
- {$I jediapilib.inc}
- interface
- uses
- JwaWinType, JwaIpExport, JwaNative, JwaWS2tcpip;
- // Declarations for the Win32 ICMP Echo request API.
- //
- // Exported Routines.
- //
- //++
- //
- // Routine Name:
- //
- // IcmpCreateFile
- //
- // Routine Description:
- //
- // Opens a handle on which ICMP Echo Requests can be issued.
- //
- // Arguments:
- //
- // None.
- //
- // Return Value:
- //
- // An open file handle or INVALID_HANDLE_VALUE. Extended error information
- // is available by calling GetLastError().
- //
- //--
- function IcmpCreateFile: HANDLE; stdcall;
- {$EXTERNALSYM IcmpCreateFile}
- //++
- //
- // Routine Name:
- //
- // Icmp6CreateFile
- //
- // Routine Description:
- //
- // Opens a handle on which ICMPv6 Echo Requests can be issued.
- //
- // Arguments:
- //
- // None.
- //
- // Return Value:
- //
- // An open file handle or INVALID_HANDLE_VALUE. Extended error information
- // is available by calling GetLastError().
- //
- //--
- function Icmp6CreateFile: HANDLE; stdcall;
- {$EXTERNALSYM Icmp6CreateFile}
- //++
- //
- // Routine Name:
- //
- // IcmpCloseHandle
- //
- // Routine Description:
- //
- // Closes a handle opened by ICMPOpenFile.
- //
- // Arguments:
- //
- // IcmpHandle - The handle to close.
- //
- // Return Value:
- //
- // TRUE if the handle was closed successfully, otherwise FALSE. Extended
- // error information is available by calling GetLastError().
- //
- //--
- function IcmpCloseHandle(IcmpHandle: HANDLE): BOOL; stdcall;
- {$EXTERNALSYM IcmpCloseHandle}
- //++
- //
- // Routine Name:
- //
- // IcmpSendEcho
- //
- // Routine Description:
- //
- // Sends an ICMP Echo request and returns any replies. The
- // call returns when the timeout has expired or the reply buffer
- // is filled.
- //
- // Arguments:
- //
- // IcmpHandle - An open handle returned by ICMPCreateFile.
- //
- // DestinationAddress - The destination of the echo request.
- //
- // RequestData - A buffer containing the data to send in the
- // request.
- //
- // RequestSize - The number of bytes in the request data buffer.
- //
- // RequestOptions - Pointer to the IP header options for the request.
- // May be NULL.
- //
- // ReplyBuffer - A buffer to hold any replies to the request.
- // 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 - The size in bytes of the reply buffer.
- //
- // Timeout - The time in milliseconds to wait for replies.
- //
- // Return Value:
- //
- // Returns the number of ICMP_ECHO_REPLY structures stored in ReplyBuffer.
- // The status of each reply is contained in the structure. If the return
- // value is zero, extended error information is available via
- // GetLastError().
- //
- //--
- function IcmpSendEcho(
- IcmpHandle: HANDLE;
- DestinationAddress: IpAddr;
- RequestData: LPVOID;
- RequestSize: WORD;
- RequestOptions: PIP_OPTION_INFORMATION;
- ReplyBuffer: LPVOID;
- ReplySize: DWORD;
- Timeout: DWORD): DWORD; stdcall;
- {$EXTERNALSYM IcmpSendEcho}
- //++
- //
- // Routine Description:
- //
- // Sends an ICMP Echo request and the call returns either immediately
- // (if Event or ApcRoutine is NonNULL) or returns after the specified
- // timeout. The ReplyBuffer contains the ICMP responses, if any.
- //
- // Arguments:
- //
- // IcmpHandle - An open handle returned by ICMPCreateFile.
- //
- // Event - This is the event to be signalled whenever an IcmpResponse
- // comes in.
- //
- // ApcRoutine - This routine would be called when the calling thread
- // is in an alertable thread and an ICMP reply comes in.
- //
- // ApcContext - This optional parameter is given to the ApcRoutine when
- // this call succeeds.
- //
- // DestinationAddress - The destination of the echo request.
- //
- // RequestData - A buffer containing the data to send in the
- // request.
- //
- // RequestSize - The number of bytes in the request data buffer.
- //
- // RequestOptions - Pointer to the IP header options for the request.
- // May be NULL.
- //
- // ReplyBuffer - A buffer to hold any replies to the request.
- // On return, the buffer will contain an array of
- // ICMP_ECHO_REPLY structures followed by options
- // and data. The buffer must be large enough to
- // hold at least one ICMP_ECHO_REPLY structure.
- // It should be large enough to also hold
- // 8 more bytes of data - this is the size of
- // an ICMP error message.
- //
- // ReplySize - The size in bytes of the reply buffer.
- //
- // Timeout - The time in milliseconds to wait for replies.
- // This is NOT used if ApcRoutine is not NULL or if Event
- // is not NULL.
- //
- // Return Value:
- //
- // Returns the number of replies received and stored in ReplyBuffer. If
- // the return value is zero, extended error information is available
- // via GetLastError().
- //
- // Remarks:
- //
- // On NT platforms,
- // If used Asynchronously (either ApcRoutine or Event is specified), then
- // ReplyBuffer and ReplySize are still needed. This is where the response
- // comes in.
- // ICMP Response data is copied to the ReplyBuffer provided, and the caller of
- // this function has to parse it asynchronously. The function IcmpParseReply
- // is provided for this purpose.
- //
- // On non-NT platforms,
- // Event, ApcRoutine and ApcContext are IGNORED.
- //
- //--
- function IcmpSendEcho2(
- IcmpHandle: HANDLE;
- Event: HANDLE;
- ApcRoutine: PIO_APC_ROUTINE;
- ApcContext: PVOID;
- DestinationAddress: IpAddr;
- RequestData: LPVOID;
- RequestSize: WORD;
- RequestOptions: PIP_OPTION_INFORMATION;
- ReplyBuffer: LPVOID;
- ReplySize: DWORD;
- Timeout: DWORD): DWORD; stdcall;
- function Icmp6SendEcho2(
- IcmpHandle: HANDLE;
- Event: HANDLE;
- ApcRoutine: PIO_APC_ROUTINE;
- ApcContext: PVOID;
- SourceAddress: Psockaddr_in6;
- DestinationAddress: Psockaddr_in6;
- RequestData,
- RequestSize: WORD;
- RequestOptions: PIP_OPTION_INFORMATION;
- ReplyBuffer: LPVOID;
- ReplySize: DWORD;
- Timeout: DWORD): DWORD; stdcall;
- //++
- //
- // Routine Description:
- //
- // Parses the reply buffer provided and returns the number of ICMP responses found.
- //
- // Arguments:
- //
- // ReplyBuffer - This must be the same buffer that was passed to IcmpSendEcho2
- // This is rewritten to hold an array of ICMP_ECHO_REPLY structures.
- // (i.e. the type is PICMP_ECHO_REPLY).
- //
- // ReplySize - This must be the size of the above buffer.
- //
- // Return Value:
- // Returns the number of ICMP responses found. If there is an errors, return value is
- // zero. The error can be determined by a call to GetLastError.
- //
- // Remarks:
- // This function SHOULD NOT BE USED on a reply buffer that was passed to SendIcmpEcho.
- // SendIcmpEcho actually parses the buffer before returning back to the user. This function
- // is meant to be used only with SendIcmpEcho2.
- //--
- function IcmpParseReplies(ReplyBuffer: LPVOID; ReplySize: DWORD): DWORD; stdcall;
- {$EXTERNALSYM IcmpParseReplies}
- function Icmp6ParseReplies(ReplyBuffer: LPVOID; ReplySize: DWORD): DWORD; stdcall;
- {$EXTERNALSYM Icmp6ParseReplies}
- implementation
- const
- icmplib = 'iphlpapi.dll';
- {$IFDEF DYNAMIC_LINK}
- var
- _IcmpCreateFile: Pointer;
- function IcmpCreateFile;
- begin
- GetProcedureAddress(_IcmpCreateFile, icmplib, 'IcmpCreateFile');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_IcmpCreateFile]
- end;
- end;
- var
- _Icmp6CreateFile: Pointer;
- function Icmp6CreateFile;
- begin
- GetProcedureAddress(_Icmp6CreateFile, icmplib, 'Icmp6CreateFile');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_Icmp6CreateFile]
- end;
- end;
- var
- _IcmpCloseHandle: Pointer;
- function IcmpCloseHandle;
- begin
- GetProcedureAddress(_IcmpCloseHandle, icmplib, 'IcmpCloseHandle');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_IcmpCloseHandle]
- end;
- end;
- var
- _IcmpSendEcho: Pointer;
- function IcmpSendEcho;
- begin
- GetProcedureAddress(_IcmpSendEcho, icmplib, 'IcmpSendEcho');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_IcmpSendEcho]
- end;
- end;
- var
- _IcmpSendEcho2: Pointer;
- function IcmpSendEcho2;
- begin
- GetProcedureAddress(_IcmpSendEcho2, icmplib, 'IcmpSendEcho2');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_IcmpSendEcho2]
- end;
- end;
- var
- _Icmp6SendEcho2: Pointer;
- function Icmp6SendEcho2;
- begin
- GetProcedureAddress(_Icmp6SendEcho2, icmplib, 'Icmp6SendEcho2');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_Icmp6SendEcho2]
- end;
- end;
- var
- _IcmpParseReplies: Pointer;
- function IcmpParseReplies;
- begin
- GetProcedureAddress(_IcmpParseReplies, icmplib, 'IcmpParseReplies');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_IcmpParseReplies]
- end;
- end;
- var
- _Icmp6ParseReplies: Pointer;
- function Icmp6ParseReplies;
- begin
- GetProcedureAddress(_Icmp6ParseReplies, icmplib, 'Icmp6ParseReplies');
- asm
- MOV ESP, EBP
- POP EBP
- JMP [_Icmp6ParseReplies]
- end;
- end;
- {$ELSE}
- function IcmpCreateFile; external icmplib name 'IcmpCreateFile';
- function Icmp6CreateFile; external icmplib name 'Icmp6CreateFile';
- function IcmpCloseHandle; external icmplib name 'IcmpCloseHandle';
- function IcmpSendEcho; external icmplib name 'IcmpSendEcho';
- function IcmpSendEcho2; external icmplib name 'IcmpSendEcho2';
- function Icmp6SendEcho2; external icmplib name 'Icmp6SendEcho2';
- function IcmpParseReplies; external icmplib name 'IcmpParseReplies';
- function Icmp6ParseReplies; external icmplib name 'Icmp6ParseReplies';
- {$ENDIF DYNAMIC_LINK}
- end.
|