ReactOS 0.4.16-dev-930-gcc8ec38
ping.c File Reference
#include <stdlib.h>
#include <windef.h>
#include <winbase.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <conutils.h>
#include "resource.h"
#include <debug.h>
Include dependency graph for ping.c:

Go to the source code of this file.

Macros

#define WIN32_LEAN_AND_MEAN
 
#define WIN32_NO_STATUS
 
#define NDEBUG
 
#define SIZEOF_ICMP_ERROR   8
 
#define SIZEOF_IO_STATUS_BLOCK   8
 
#define DEFAULT_TIMEOUT   1000
 
#define MAX_SEND_SIZE   65500
 

Functions

static BOOL ParseCmdLine (int argc, PWSTR argv[])
 
static BOOL ResolveTarget (PCWSTR target)
 
static void Ping (void)
 
static void PrintStats (void)
 
static BOOL WINAPI ConsoleCtrlHandler (DWORD ControlType)
 
int wmain (int argc, WCHAR *argv[])
 

Variables

static HANDLE hIcmpFile = INVALID_HANDLE_VALUE
 
static ULONG Timeout = 4000
 
static int Family = AF_UNSPEC
 
static ULONG RequestSize = 32
 
static ULONG PingCount = 4
 
static BOOL PingForever = FALSE
 
static PADDRINFOW Target = NULL
 
static PCWSTR TargetName = NULL
 
static WCHAR Address [46]
 
static WCHAR CanonName [NI_MAXHOST]
 
static BOOL ResolveAddress = FALSE
 
static ULONG RTTMax = 0
 
static ULONG RTTMin = 0
 
static ULONG RTTTotal = 0
 
static ULONG EchosSent = 0
 
static ULONG EchosReceived = 0
 
static ULONG EchosSuccessful = 0
 
static IP_OPTION_INFORMATION IpOptions
 

Macro Definition Documentation

◆ DEFAULT_TIMEOUT

#define DEFAULT_TIMEOUT   1000

Definition at line 51 of file ping.c.

◆ MAX_SEND_SIZE

#define MAX_SEND_SIZE   65500

Definition at line 52 of file ping.c.

◆ NDEBUG

#define NDEBUG

Definition at line 46 of file ping.c.

◆ SIZEOF_ICMP_ERROR

#define SIZEOF_ICMP_ERROR   8

Definition at line 49 of file ping.c.

◆ SIZEOF_IO_STATUS_BLOCK

#define SIZEOF_IO_STATUS_BLOCK   8

Definition at line 50 of file ping.c.

◆ WIN32_LEAN_AND_MEAN

#define WIN32_LEAN_AND_MEAN

Definition at line 32 of file ping.c.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 34 of file ping.c.

Function Documentation

◆ ConsoleCtrlHandler()

static BOOL WINAPI ConsoleCtrlHandler ( DWORD  ControlType)
static

Definition at line 680 of file ping.c.

681{
682 switch (ControlType)
683 {
684 case CTRL_C_EVENT:
685 PrintStats();
687 return FALSE;
688
689 case CTRL_BREAK_EVENT:
690 PrintStats();
692 return TRUE;
693
694 case CTRL_CLOSE_EVENT:
695 PrintStats();
696 return FALSE;
697
698 default:
699 return FALSE;
700 }
701}
#define StdOut
Definition: fc.c:14
void ConResPrintf(FILE *fp, UINT nID,...)
Definition: fc.c:33
#define IDS_CTRL_BREAK
Definition: resource.h:4
#define IDS_CTRL_C
Definition: resource.h:5
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static void PrintStats(void)
Definition: ping.c:663
#define CTRL_C_EVENT
Definition: wincon.h:68
#define CTRL_BREAK_EVENT
Definition: wincon.h:69
#define CTRL_CLOSE_EVENT
Definition: wincon.h:70

Referenced by wmain().

◆ ParseCmdLine()

static BOOL ParseCmdLine ( int  argc,
PWSTR  argv[] 
)
static

Definition at line 168 of file ping.c.

169{
170 int i;
171
172 if (argc < 2)
173 {
175 return FALSE;
176 }
177
178 for (i = 1; i < argc; i++)
179 {
180 if (argv[i][0] == L'-' || argv[i][0] == L'/')
181 {
182 switch (argv[i][1])
183 {
184 case L't':
186 break;
187
188 case L'a':
190 break;
191
192 case L'n':
193 {
194 if (i + 1 < argc)
195 {
197 PingCount = wcstoul(argv[++i], NULL, 0);
198 if (PingCount == 0)
199 {
201 return FALSE;
202 }
203 }
204 else
205 {
207 return FALSE;
208 }
209 break;
210 }
211
212 case L'l':
213 {
214 if (i + 1 < argc)
215 {
216 RequestSize = wcstoul(argv[++i], NULL, 0);
218 {
220 return FALSE;
221 }
222 }
223 else
224 {
226 return FALSE;
227 }
228 break;
229 }
230
231 case L'f':
232 {
233 if (Family == AF_INET6)
234 {
236 return FALSE;
237 }
238
239 Family = AF_INET;
241 break;
242 }
243
244 case L'i':
245 {
246 if (i + 1 < argc)
247 {
248 ULONG Ttl = wcstoul(argv[++i], NULL, 0);
249
250 if ((Ttl == 0) || (Ttl > UCHAR_MAX))
251 {
253 return FALSE;
254 }
255
256 IpOptions.Ttl = (UCHAR)Ttl;
257 }
258 else
259 {
261 return FALSE;
262 }
263 break;
264 }
265
266 case L'v':
267 {
268 if (Family == AF_INET6)
269 {
271 return FALSE;
272 }
273
274 Family = AF_INET;
275
276 if (i + 1 < argc)
277 {
278 /* This option has been deprecated. Don't do anything. */
279 i++;
280 }
281 else
282 {
284 return FALSE;
285 }
286
287 break;
288 }
289
290 case L'w':
291 {
292 if (i + 1 < argc)
293 {
294 Timeout = wcstoul(argv[++i], NULL, 0);
297 }
298 else
299 {
301 return FALSE;
302 }
303 break;
304 }
305
306 case L'R':
307 {
308 if (Family == AF_INET)
309 {
311 return FALSE;
312 }
313
315
316 /* This option has been deprecated. Don't do anything. */
317 break;
318 }
319
320 case L'4':
321 {
322 if (Family == AF_INET6)
323 {
325 return FALSE;
326 }
327
328 Family = AF_INET;
329 break;
330 }
331
332 case L'6':
333 {
334 if (Family == AF_INET)
335 {
337 return FALSE;
338 }
339
341 break;
342 }
343
344 case L'?':
346 return FALSE;
347
348 default:
351 return FALSE;
352 }
353 }
354 else
355 {
356 if (TargetName != NULL)
357 {
359 return FALSE;
360 }
361
362 TargetName = argv[i];
363 }
364 }
365
366 if (TargetName == NULL)
367 {
369 return FALSE;
370 }
371
372 return TRUE;
373}
static int argc
Definition: ServiceArgs.c:12
#define IDS_USAGE
Definition: resource.h:3
#define StdErr
Definition: fc.c:15
#define IDS_BAD_VALUE
Definition: resource.h:11
#define IDS_MISSING_ADDRESS
Definition: resource.h:7
#define IDS_BAD_PARAMETER
Definition: resource.h:10
#define IDS_MISSING_VALUE
Definition: resource.h:8
#define IDS_WRONG_FAMILY
Definition: resource.h:12
#define IDS_BAD_OPTION
Definition: resource.h:9
#define NULL
Definition: types.h:112
#define AF_INET
Definition: tcpip.h:117
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
#define UCHAR_MAX
Definition: limits.h:25
#define UINT_MAX
Definition: intsafe.h:152
#define IP_FLAG_DF
Definition: ipexport.h:53
#define argv
Definition: mplay32.c:18
#define L(x)
Definition: ntvdm.h:50
static ULONG Timeout
Definition: ping.c:61
static BOOL PingForever
Definition: ping.c:65
static BOOL ResolveAddress
Definition: ping.c:70
static ULONG RequestSize
Definition: ping.c:63
static IP_OPTION_INFORMATION IpOptions
Definition: ping.c:79
static PCWSTR TargetName
Definition: ping.c:67
#define DEFAULT_TIMEOUT
Definition: ping.c:51
#define MAX_SEND_SIZE
Definition: ping.c:52
static ULONG PingCount
Definition: ping.c:64
static int Family
Definition: ping.c:62
unsigned char Flags
Definition: ipexport.h:35
unsigned char Ttl
Definition: ipexport.h:33
uint32_t ULONG
Definition: typedefs.h:59
#define AF_INET6
Definition: winsock.h:369
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by wmain().

◆ Ping()

static void Ping ( void  )
static

Definition at line 419 of file ping.c.

420{
422 PVOID SendBuffer = NULL;
423 DWORD ReplySize = 0;
425
426 if (RequestSize != 0)
427 {
428 SendBuffer = malloc(RequestSize);
429 if (SendBuffer == NULL)
430 {
432 exit(1);
433 }
434
435 /* Windows ping utility fills the optional data field with
436 * ASCII characters from 'a' to 'w', wrapping back around
437 * until SendBuffer is full. */
438 for (ULONG i = 0; i < RequestSize; i++)
439 ((PUCHAR)SendBuffer)[i] = (UCHAR)('a' + (i % ('w' - 'a' + 1)));
440 }
441
442 if (Family == AF_INET6)
443 {
444 ReplySize += sizeof(ICMPV6_ECHO_REPLY);
445 }
446 else
447 {
448#ifdef _WIN64
449 ReplySize += sizeof(ICMP_ECHO_REPLY32);
450#else
451 ReplySize += sizeof(ICMP_ECHO_REPLY);
452#endif
453 }
454
456
457 ReplyBuffer = malloc(ReplySize);
458 if (ReplyBuffer == NULL)
459 {
461 free(SendBuffer);
462 exit(1);
463 }
464
465 ZeroMemory(ReplyBuffer, ReplySize);
466
467 EchosSent++;
468
469 if (Family == AF_INET6)
470 {
471 struct sockaddr_in6 Source;
472
473 ZeroMemory(&Source, sizeof(Source));
474 Source.sin6_family = AF_INET6;
475
477 &Source,
478 (struct sockaddr_in6 *)Target->ai_addr,
479 SendBuffer, (USHORT)RequestSize, &IpOptions,
480 ReplyBuffer, ReplySize, Timeout);
481 }
482 else
483 {
485 ((PSOCKADDR_IN)Target->ai_addr)->sin_addr.s_addr,
486 SendBuffer, (USHORT)RequestSize, &IpOptions,
487 ReplyBuffer, ReplySize, Timeout);
488 }
489
490 /* TODO: Compare ReplyBuffer data to SendBuffer. */
491 free(SendBuffer);
492
493 if (Status == 0)
494 {
496 switch (Status)
497 {
498 case IP_REQ_TIMED_OUT:
500 break;
501
502 default:
504 break;
505 }
506 }
507 else
508 {
509 SOCKADDR_IN6 SockAddrIn6;
510 SOCKADDR_IN SockAddrIn;
511 PSOCKADDR SockAddr;
513
515
516 ZeroMemory(&SockAddrIn, sizeof(SockAddrIn));
517 ZeroMemory(&SockAddrIn6, sizeof(SockAddrIn6));
518
519 if (Family == AF_INET6)
520 {
521 PICMPV6_ECHO_REPLY pEchoReply;
522 PIPV6_ADDRESS_EX Ipv6Addr;
523
524 pEchoReply = (PICMPV6_ECHO_REPLY)ReplyBuffer;
525
526 Ipv6Addr = (PIPV6_ADDRESS_EX)&pEchoReply->Address;
527 SockAddrIn6.sin6_family = AF_INET6;
528 CopyMemory(SockAddrIn6.sin6_addr.u.Word, Ipv6Addr->sin6_addr, sizeof(SockAddrIn6.sin6_addr));
529 //SockAddrIn6.sin6_addr = Ipv6Addr->sin6_addr;
530 SockAddr = (PSOCKADDR)&SockAddrIn6;
531 Size = sizeof(SOCKADDR_IN6);
532
533 GetNameInfoW(SockAddr,
534 Size,
535 Address,
537 NULL,
538 0,
540
542
543 switch (pEchoReply->Status)
544 {
545 case IP_SUCCESS:
546 {
548
549 if (pEchoReply->RoundTripTime == 0)
551 else
553
554 if (pEchoReply->RoundTripTime < RTTMin || RTTMin == 0)
555 RTTMin = pEchoReply->RoundTripTime;
556
557 if (pEchoReply->RoundTripTime > RTTMax || RTTMax == 0)
558 RTTMax = pEchoReply->RoundTripTime;
559
560 ConPuts(StdOut, L"\n");
561
562 RTTTotal += pEchoReply->RoundTripTime;
563 break;
564 }
565
568 break;
569
572 break;
573
576 break;
577
578 default:
580 break;
581 }
582 }
583 else
584 {
585#ifdef _WIN64
586 PICMP_ECHO_REPLY32 pEchoReply;
587#else
588 PICMP_ECHO_REPLY pEchoReply;
589#endif
590 IPAddr *IP4Addr;
591
592#ifdef _WIN64
593 pEchoReply = (PICMP_ECHO_REPLY32)ReplyBuffer;
594#else
595 pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
596#endif
597
598 IP4Addr = (IPAddr *)&pEchoReply->Address;
599 SockAddrIn.sin_family = AF_INET;
600 SockAddrIn.sin_addr.S_un.S_addr = *IP4Addr;
601 SockAddr = (PSOCKADDR)&SockAddrIn;
602 Size = sizeof(SOCKADDR_IN);
603
604 GetNameInfoW(SockAddr,
605 Size,
606 Address,
608 NULL,
609 0,
611
613
614 switch (pEchoReply->Status)
615 {
616 case IP_SUCCESS:
617 {
619
620 ConResPrintf(StdOut, IDS_REPLY_BYTES, pEchoReply->DataSize);
621
622 if (pEchoReply->RoundTripTime == 0)
624 else
625 ConResPrintf(StdOut, IDS_REPLY_TIME_MS, pEchoReply->RoundTripTime);
626
627 ConResPrintf(StdOut, IDS_REPLY_TTL, pEchoReply->Options.Ttl);
628
629 if (pEchoReply->RoundTripTime < RTTMin || RTTMin == 0)
630 RTTMin = pEchoReply->RoundTripTime;
631
632 if (pEchoReply->RoundTripTime > RTTMax || RTTMax == 0)
633 RTTMax = pEchoReply->RoundTripTime;
634
635 RTTTotal += pEchoReply->RoundTripTime;
636 break;
637 }
638
641 break;
642
645 break;
646
649 break;
650
651 default:
652 ConResPrintf(StdOut, IDS_REPLY_STATUS, pEchoReply->Status);
653 break;
654 }
655 }
656 }
657
659}
INT WSAAPI GetNameInfoW(IN CONST SOCKADDR *pSockaddr, IN socklen_t SockaddrLength, OUT PWCHAR pNodeBuffer, IN DWORD NodeBufferSize, OUT PWCHAR pServiceBuffer, IN DWORD ServiceBufferSize, IN INT Flags)
Definition: addrinfo.c:873
void ConPuts(FILE *fp, LPCWSTR psz)
Definition: fc.c:16
#define IDS_TTL_EXPIRED
Definition: resource.h:27
#define IDS_REPLY_TIME_0MS
Definition: resource.h:21
#define IDS_DEST_HOST_UNREACHABLE
Definition: resource.h:24
#define IDS_REQUEST_TIMED_OUT
Definition: resource.h:26
#define IDS_TRANSMIT_FAILED
Definition: resource.h:28
#define IDS_REPLY_STATUS
Definition: resource.h:23
#define IDS_NO_RESOURCES
Definition: resource.h:6
#define IDS_DEST_NET_UNREACHABLE
Definition: resource.h:25
#define IDS_REPLY_TTL
Definition: resource.h:22
#define IDS_REPLY_BYTES
Definition: resource.h:19
#define IDS_REPLY_FROM
Definition: resource.h:18
#define IDS_REPLY_TIME_MS
Definition: resource.h:20
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
DWORD WINAPI IcmpSendEcho2(_In_ HANDLE IcmpHandle, _In_opt_ HANDLE Event, _In_opt_ PIO_APC_ROUTINE ApcRoutine, _In_opt_ PVOID ApcContext, _In_ IPAddr DestinationAddress, _In_ LPVOID RequestData, _In_ WORD RequestSize, _In_opt_ PIP_OPTION_INFORMATION RequestOptions, _Out_ LPVOID ReplyBuffer, _In_ DWORD ReplySize, _In_ DWORD Timeout)
Definition: icmp.c:285
DWORD WINAPI Icmp6SendEcho2(_In_ HANDLE IcmpHandle, _In_opt_ HANDLE Event, _In_opt_ PIO_APC_ROUTINE ApcRoutine, _In_opt_ PVOID ApcContext, _In_ struct sockaddr_in6 *SourceAddress, _In_ struct sockaddr_in6 *DestinationAddress, _In_ LPVOID RequestData, _In_ WORD RequestSize, _In_ PIP_OPTION_INFORMATION RequestOptions, _Out_ LPVOID ReplyBuffer, _In_ DWORD ReplySize, _In_ DWORD Timeout)
Definition: icmp.c:77
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_ PFLT_PORT _In_ ULONG _Out_writes_bytes_opt_ ReplyLength PVOID ReplyBuffer
Definition: fltkernel.h:1902
Status
Definition: gdiplustypes.h:25
#define IP_DEST_NET_UNREACHABLE
Definition: ipexport.h:115
ICMPV6_ECHO_REPLY_LH ICMPV6_ECHO_REPLY
Definition: ipexport.h:194
#define IP_DEST_HOST_UNREACHABLE
Definition: ipexport.h:116
struct _IPV6_ADDRESS_EX * PIPV6_ADDRESS_EX
struct icmp_echo_reply * PICMP_ECHO_REPLY
struct icmp_echo_reply ICMP_ECHO_REPLY
#define IP_REQ_TIMED_OUT
Definition: ipexport.h:123
#define IP_TTL_EXPIRED_TRANSIT
Definition: ipexport.h:126
#define IP_SUCCESS
Definition: ipexport.h:113
ICMPV6_ECHO_REPLY_LH * PICMPV6_ECHO_REPLY
Definition: ipexport.h:195
int socklen_t
Definition: tcp.c:35
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
unsigned short USHORT
Definition: pedump.c:61
ULONG IPAddr
Definition: pfhook.h:35
#define SIZEOF_ICMP_ERROR
Definition: ping.c:49
static WCHAR Address[46]
Definition: ping.c:68
#define SIZEOF_IO_STATUS_BLOCK
Definition: ping.c:50
static ULONG RTTMin
Definition: ping.c:73
static ULONG EchosSent
Definition: ping.c:75
static ULONG RTTMax
Definition: ping.c:72
static HANDLE hIcmpFile
Definition: ping.c:60
static ULONG RTTTotal
Definition: ping.c:74
static ULONG EchosSuccessful
Definition: ping.c:77
static ULONG EchosReceived
Definition: ping.c:76
#define exit(n)
Definition: config.h:202
USHORT sin6_addr[8]
Definition: ipexport.h:173
IPV6_ADDRESS_EX Address
Definition: ipexport.h:189
unsigned int RoundTripTime
Definition: ipexport.h:191
USHORT Word[8]
Definition: in6addr.h:6
union in6_addr::@3081 u
ADDRESS_FAMILY sin6_family
Definition: ws2ipdef.h:179
IN6_ADDR sin6_addr
Definition: ws2ipdef.h:182
struct in_addr sin_addr
Definition: winsock.h:512
short sin_family
Definition: winsock.h:510
unsigned char * PUCHAR
Definition: typedefs.h:53
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
#define ZeroMemory
Definition: winbase.h:1743
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CopyMemory
Definition: winbase.h:1741
struct sockaddr_in SOCKADDR_IN
Definition: winsock.h:487
struct sockaddr * PSOCKADDR
Definition: winsock.h:485
#define NI_NUMERICHOST
Definition: ws2def.h:354
#define NI_MAXHOST
Definition: ws2def.h:359
SOCKADDR_IN6_LH SOCKADDR_IN6
Definition: ws2ipdef.h:199

Referenced by RunTraceRoute(), and wmain().

◆ PrintStats()

static void PrintStats ( void  )
static

Definition at line 663 of file ping.c.

664{
665 ULONG EchosLost = EchosSent - EchosReceived;
666 ULONG PercentLost = (ULONG)((EchosLost / (double)EchosSent) * 100.0);
667
669
670 if (EchosSuccessful > 0)
671 {
672 ULONG RTTAverage = RTTTotal / EchosSuccessful;
674 }
675}
#define IDS_APPROXIMATE_RTT
Definition: resource.h:30
#define IDS_STATISTICS
Definition: resource.h:29

Referenced by ConsoleCtrlHandler(), and wmain().

◆ ResolveTarget()

static BOOL ResolveTarget ( PCWSTR  target)
static

Definition at line 377 of file ping.c.

378{
380 int Status;
381
382 ZeroMemory(&hints, sizeof(hints));
383 hints.ai_family = Family;
384 hints.ai_flags = AI_NUMERICHOST;
385
387 if (Status != 0)
388 {
389 hints.ai_flags = AI_CANONNAME;
390
392 if (Status != 0)
393 {
395 return FALSE;
396 }
397
398 wcsncpy(CanonName, Target->ai_canonname, wcslen(Target->ai_canonname));
399 }
400 else if (ResolveAddress)
401 {
402 Status = GetNameInfoW(Target->ai_addr, Target->ai_addrlen,
404 NULL, 0,
406 if (Status != 0)
407 {
408 DPRINT("GetNameInfoW failed: %d\n", WSAGetLastError());
409 }
410 }
411
412 Family = Target->ai_family;
413
414 return TRUE;
415}
INT WSAAPI GetAddrInfoW(IN PCWSTR pszNodeName, IN PCWSTR pszServiceName, IN const ADDRINFOW *ptHints, OUT PADDRINFOW *pptResult)
Definition: addrinfo.c:509
#define IDS_UNKNOWN_HOST
Definition: resource.h:13
wcsncpy
GLenum target
Definition: glext.h:7315
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static WCHAR CanonName[NI_MAXHOST]
Definition: ping.c:69
#define DPRINT
Definition: sndvol32.h:73
#define _countof(array)
Definition: sndvol32.h:70
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
int PASCAL FAR WSAGetLastError(void)
Definition: dllmain.c:112
#define NI_NAMEREQD
Definition: ws2def.h:355
#define AI_NUMERICHOST
Definition: ws2def.h:295
#define AI_CANONNAME
Definition: ws2def.h:294

◆ wmain()

int wmain ( int  argc,
WCHAR argv[] 
)

Definition at line 82 of file ping.c.

83{
84 WSADATA wsaData;
85 ULONG i;
86 DWORD StrLen = 46;
87 int Status;
88
89 /* Initialize the Console Standard Streams */
91
92 IpOptions.Ttl = 128;
93
94 if (!ParseCmdLine(argc, argv))
95 return 1;
96
98 {
99 DPRINT("Failed to set control handler: %lu\n", GetLastError());
100 return 1;
101 }
102
103 Status = WSAStartup(MAKEWORD(2, 2), &wsaData);
104 if (Status != 0)
105 {
107 return 1;
108 }
109
111 {
112 WSACleanup();
113 return 1;
114 }
115
116 if (WSAAddressToStringW(Target->ai_addr, (DWORD)Target->ai_addrlen, NULL, Address, &StrLen) != 0)
117 {
118 DPRINT("WSAAddressToStringW failed: %d\n", WSAGetLastError());
120 WSACleanup();
121 return 1;
122 }
123
124 if (Family == AF_INET6)
126 else
128
129
131 {
132 DPRINT("IcmpCreateFile failed: %lu\n", GetLastError());
134 WSACleanup();
135 return 1;
136 }
137
138 if (*CanonName)
140 else
142
144
145 Ping();
146
147 i = 1;
148 while (i < PingCount)
149 {
150 Sleep(1000);
151 Ping();
152
153 if (!PingForever)
154 i++;
155 }
156
157 PrintStats();
158
161 WSACleanup();
162
163 return 0;
164}
#define FreeAddrInfoW(a)
Definition: addrinfo.c:21
#define ConInitStdStreams()
Definition: fc.c:13
#define IDS_WINSOCK_FAIL
Definition: resource.h:31
#define IDS_PINGING_HOSTNAME
Definition: resource.h:15
#define IDS_PING_SIZE
Definition: resource.h:17
#define IDS_PINGING_ADDRESS
Definition: resource.h:14
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
BOOL WINAPI IcmpCloseHandle(_In_ HANDLE IcmpHandle)
Definition: icmp.c:202
HANDLE WINAPI Icmp6CreateFile(void)
Definition: icmp.c:15
HANDLE WINAPI IcmpCreateFile(void)
Definition: icmp.c:219
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2109
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
static void Ping(void)
Definition: ping.c:419
static BOOL WINAPI ConsoleCtrlHandler(DWORD ControlType)
Definition: ping.c:680
static BOOL ParseCmdLine(int argc, PWSTR argv[])
Definition: ping.c:168
INT WSAAPI WSAAddressToStringW(IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength)
Definition: rnr.c:128
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
static bool ResolveTarget()
Definition: tracert.cpp:176
#define MAKEWORD(a, b)
Definition: typedefs.h:248
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60

Variable Documentation

◆ Address

WCHAR Address[46]
static

Definition at line 68 of file ping.c.

Referenced by __invlpg(), _IRQL_requires_max_(), _MiAddressToPde(), _MiAddressToPte(), _Struct_size_bytes_(), _Success_(), _When_(), A2S(), acpi_create_volatile_registry_tables(), AcpiCheckAddressRange(), AcpiEvAddressSpaceDispatch(), AcpiEvCreateGpeBlock(), AcpiEvInstallGpeHandler(), AcpiExDataTableSpaceHandler(), AcpiExPciConfigSpaceHandler(), AcpiExSystemIoSpaceHandler(), AcpiExSystemMemorySpaceHandler(), AcpiHwGetAccessBitWidth(), AcpiHwRead(), AcpiHwReadPort(), AcpiHwValidateIoRequest(), AcpiHwValidateRegister(), AcpiHwWrite(), AcpiHwWritePort(), AcpiInstallGpeHandler(), AcpiInstallGpeRawHandler(), AcpiInstallPhysicalTable(), AcpiInstallSciHandler(), AcpiOsMapMemory(), AcpiOsReadMemory(), AcpiOsReadPort(), AcpiOsWriteMemory(), AcpiOsWritePort(), AcpiRemoveGpeHandler(), AcpiRemoveSciHandler(), AcpiTbAcquireTempTable(), AcpiTbInitGenericAddress(), AcpiTbInitTableDescriptor(), AcpiTbInstallAndLoadTable(), AcpiTbInstallStandardTable(), AcpiTbOverrideTable(), AcpiTbParseRootTable(), AcpiTbPrintTableHeader(), AcpiUtAddAddressRange(), AcpiUtCheckAddressRange(), addIPAddress(), AddIPAddress(), AddrBuildAddress(), AddrGetAddress(), AddrIsUnspecified(), AddrSearchFirst(), AfdBind(), AfdConnect(), AfdPacketSocketWriteData(), AfdSendTo(), AlignUp(), ARPTransmit(), AttachToConsoleInternal(), BlMmAllocatePhysicalPages(), BlMmFreePhysicalPages(), CdProcessToc(), CdTocSerial(), CheckForCurrentHostname(), co_IntSetWindowLongPtr(), ComPortTest1(), ComPortTest2(), ConvertStabs(), CopyPacketToBuffer(), CpDoesPortExist(), CpEnableFifo(), CpInitialize(), CpuExceptionFilter(), CreateUmaDescriptor(), CsrProbeForRead(), CsrProbeForWrite(), DcCopyPacket(), DcTransmitPacket(), DECLARE_INTERFACE_(), DhcpStaticRefreshParams(), DispTdiQueryInformation(), Dns_Free(), Dns_Ip4AddressToReverseName_W(), Dns_Ip4ReverseNameToAddress_W(), Dns_Ip4StringToAddress_A(), Dns_Ip4StringToAddress_W(), Dns_Ip6StringToAddress_A(), Dns_Ip6StringToAddress_W(), Dns_StringToAddressEx(), Dns_StringToAddressW(), DnsAddr_BuildFromAtm(), DnsAddr_BuildFromIp4(), DnsAddr_BuildFromIp6(), DnsAddrArray_AddIp4(), DosBootsectorInitialize(), DosLoadDriver(), DosLoadExecutable(), doSymSearch(), DxDdCreateD3DBuffer(), E1000ReadEeprom(), E1000ReadUlong(), E1000WriteIoUlong(), E1000WriteUlong(), EmsReadMemory(), EmsWriteMemory(), EmulatorReadIo(), EmulatorReadMemory(), EmulatorWriteIo(), EmulatorWriteMemory(), EngSecureMem(), EngSecureMemForRead(), EthernetAddressType(), Ext2ReadDisk(), Ext2WriteDisk(), Fast486FpuLoadEnvironment(), Fast486FpuSaveEnvironment(), Fast486MemReadCallback(), Fast486MemWriteCallback(), FatMapUserBuffer(), FileOpenAddress(), find_and_print_offset(), find_offset(), FindEntry(), FindOnLinkInterface(), FsRtlAllocatePool(), FsRtlAllocatePoolWithQuota(), FsRtlAllocatePoolWithQuotaTag(), FsRtlAllocatePoolWithTag(), FxpIsAddressKnownToWdf(), GetInterfaceIPv4Address(), GetNameInfoW(), HackSecureVirtualMemory(), HalpAssignPCISlotResources(), HalpGetCmosData(), HalpIsValidPCIDevice(), HalpScatterGatherAdapterControl(), HalpSetCmosData(), HasPrefix(), HexDump(), HidClass_ReadCompleteIrp(), HvGetCellSize(), I2CRepStart(), I2CStart(), InbvPortEnableFifo(), InbvPortInitialize(), InfoTdiSetArptableMIB(), InfoTdiSetRoute(), InitRomRange(), intDdCreateSurfaceOrBuffer(), IntGetSetClassLongPtr(), IoMapTransfer(), IPv4NToHl(), IsAligned(), IsLocalSymbol(), KdbpCmdBackTrace(), KdbpCmdBreakPoint(), KdbpCmdBreakPointList(), KdbpCmdDisassembleX(), KdbpCmdMod(), KdbpDisassemble(), KdbpGetBreakPointInfo(), KdbpGetInstLength(), KdbpInsertBreakPoint(), KdbpIsBreakPointOurs(), KdbpOverwriteInstruction(), KdbpSymFindModule(), KdbpSymSearchModuleList(), KdbSymPrintAddress(), KdpAddBreakpoint(), KdpCopyMemoryChunks(), KdpDeleteBreakpointRange(), KdpLowRestoreBreakpoint(), KdpLowWriteContent(), KdSetOwedBreakpoints(), KeArmInvalidateTlbEntry(), KeInvalidateTlbEntry(), KeRegisterInterruptHandler(), KeZeroPages(), KiDataAbortHandler(), KiDispatchException0Args(), KiDispatchException1Args(), KiDispatchException2Args(), KiDispatchExceptionFromTrapFrame(), KiMarkPageAsReadOnly(), KiPrefetchAbortHandler(), LanAdapterInfo(), LdrFindEntryForAddress(), LdrpGetShimEngineFunction(), LdrProcessRelocationBlock(), LdrProcessRelocationBlockLongLong(), LdrRelocateImageWithBias(), Local_Ip4AddresstoString(), Local_Ip6AddresstoString(), MemInstallFastMemoryHook(), MemRemoveFastMemoryHook(), MergeStabsAndCoffs(), MGetVdmPointer(), MI_IS_PHYSICAL_ADDRESS(), MiAddressToPdi(), MiAddressToPpe(), MiAddressToPti(), MiAddressToPxe(), MiAddressToPxi(), MiBuildPfnDatabaseFromPageTables(), MiCheckForUserStackOverflow(), MiCompleteProtoPteFault(), MiDecrementPageTableReferences(), MiDispatchFault(), MiEthernetCrc(), MiFlushTlb(), MiFlushTlbIpiRoutine(), MiGetPageEntryForProcess(), MiGetPageTableForProcess(), MiIncrementPageTableReferences(), MiInsertInWorkingSetList(), MiIsPageTablePresent(), MiIsPdeForAddressValid(), MiIsUserPde(), MiIsUserPte(), MiLookupDataTableEntry(), MiQueryMemoryBasicInformation(), MiRemoveFromWorkingSetList(), MiResolveDemandZeroFault(), MiResolveProtoPteFault(), MiSnapThunk(), MiUnmapPageInHyperSpace(), MmAccessFault(), MmAccessFaultSectionView(), MmAlterViewAttributes(), MmArmAccessFault(), MmCreatePageFileMapping(), MmCreatePhysicalMapping(), MmCreateVirtualMapping(), MmCreateVirtualMappingInternal(), MmCreateVirtualMappingUnsafe(), MmCreateVirtualMappingUnsafeEx(), MmDbgCopyMemory(), MmDeletePageFileMapping(), MmDeleteRmap(), MmDeleteVirtualMapping(), MmFindRegion(), MmFreeCacheSectionPage(), MmFreeMemoryArea(), MmFreePageTable(), MmFreeSectionPage(), MmGetFileNameForAddress(), MmGetPageEntryForProcess(), MmGetPageEntryForProcessForPAE(), MmGetPageFileMapping(), MmGetPageNumberFromAddress(), MmGetPageProtect(), MmGetPageTableForProcess(), MmGetPageTableForProcessForPAE(), MmGetPfnForProcess(), MmGetPhysicalAddress(), MmInsertRmap(), MmIsDirtyPage(), MmIsDisabledPage(), MmIsPagePresent(), MmIsPageSwapEntry(), MmIsSessionAddress(), MmNotPresentFault(), MmNotPresentFaultSectionView(), MmpAccessFault(), MmPageOutCacheSection(), MmPageOutPhysicalAddress(), MmPapFreePages(), MmPapFreePhysicalPages(), MmPaReleaseSelfMapPages(), MmpPageOutPhysicalAddress(), MmProbeAndLockPages(), MmQuerySectionView(), MmSecureVirtualMemory(), MmSetCleanPage(), MmSetDirtyBit(), MmSetDirtyPage(), MmSetPageProtect(), MmTrimUserMemory(), ModPow2(), NBAddNeighbor(), NBFindOrCreateNeighbor(), NBLocateNeighbor(), NBResetNeighborTimeout(), NewAddrInfo(), NICTestAddress(), NtSetInformationThread(), NvNetApplyPacketFilter(), NvNetCopyPacket(), NvNetQueryTcpIpHeaders(), NvNetTransmitPacket32(), NvNetTransmitPacket64(), Ping(), PrintHopInfo(), PrintOID(), PrintStats(), ProbeForRead(), ProbeForWrite(), Query_Main(), ReadByte(), ReadDoubleWord(), ReadfromSMBus(), ReadPage(), ReadWord(), RemoveFromWsList(), rsym_parse(), RtlIpv4AddressToStringExA(), RtlIpv4AddressToStringExW(), RtlIpv4StringToAddressExA(), RtlIpv4StringToAddressExW(), RtlIpv6AddressToStringExA(), RtlIpv6AddressToStringExW(), RtlIpv6StringToAddressExA(), RtlIpv6StringToAddressExW(), RtlpFindAndCommitPages(), RtlpInsertUnCommittedPages(), ScsiPortConvertPhysicalAddressToUlong(), ScsiPortConvertUlongToPhysicalAddress(), Sim32pGetVDMPointer(), SMBusWriteByte(), SRomReadSRom(), START_TEST(), StorPortConvertPhysicalAddressToUlong(), StorPortConvertUlongToPhysicalAddress(), StuffStdHandle(), SymFromAddr(), SymFromAddrW(), SymGetSymFromAddr(), SymGetSymFromAddr64(), SymSearch(), SymSearchW(), TCPGetSockAddress(), TdiBuildConnectionInfo(), TdiBuildConnectionInfoInPlace(), TdiOpenAddressFile(), TdiOpenTransport(), TdiQueryAddress(), TdiReceiveDatagram(), TdiReceiveThread(), TdiSendDatagram(), TestBind(), TiCreateFileObject(), TokenRingAddressType(), UmaDescReallocate(), UmaDescRelease(), UmaDescReserve(), UmaMgrInitialize(), UnlockBuffers(), USBSTOR_HandleDeviceControl(), FxCmResList::ValidateAndClearMapping(), FxCmResList::ValidatePortAddressRange(), FxCmResList::ValidateRegisterSystemBaseAddress(), VDDAllocMem(), VDDDeInstallMemoryHook(), VDDFreeMem(), VDDInstallMemoryHook(), VgaReadMemory(), VgaTranslateAddress(), VgaUpdateFramebuffer(), VgaWriteMemory(), ViComputeAddress(), VidBiosVideoService(), ViFillInTrackData(), WDF_DMA_SYSTEM_PROFILE_CONFIG_INIT(), WinLdrEnableFifo(), WinLdrPortInitialize(), wmain(), Write(), WriteAddress(), WriteByte(), WriteDoubleWord(), WritePage(), WriteToSMBus(), WriteWord(), WSAAsyncGetHostByAddr(), WSNoteSuccessfulHostentLookup(), x86BiosReadMemory(), x86BiosWriteMemory(), x86MemRead(), x86MemWrite(), XmsBopProcedure(), and XmsLock().

◆ CanonName

WCHAR CanonName[NI_MAXHOST]
static

Definition at line 69 of file ping.c.

Referenced by ResolveTarget(), ScmConvertToBootPathName(), and wmain().

◆ EchosReceived

ULONG EchosReceived = 0
static

Definition at line 76 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ EchosSent

ULONG EchosSent = 0
static

Definition at line 75 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ EchosSuccessful

ULONG EchosSuccessful = 0
static

Definition at line 77 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ Family

◆ hIcmpFile

HANDLE hIcmpFile = INVALID_HANDLE_VALUE
static

Definition at line 60 of file ping.c.

Referenced by Ping(), and wmain().

◆ IpOptions

IP_OPTION_INFORMATION IpOptions
static

Definition at line 79 of file ping.c.

Referenced by ParseCmdLine(), Ping(), and wmain().

◆ PingCount

ULONG PingCount = 4
static

Definition at line 64 of file ping.c.

Referenced by ParseCmdLine(), and wmain().

◆ PingForever

BOOL PingForever = FALSE
static

Definition at line 65 of file ping.c.

Referenced by ParseCmdLine(), and wmain().

◆ RequestSize

◆ ResolveAddress

BOOL ResolveAddress = FALSE
static

Definition at line 70 of file ping.c.

Referenced by ParseCmdLine(), and ResolveTarget().

◆ RTTMax

ULONG RTTMax = 0
static

Definition at line 72 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ RTTMin

ULONG RTTMin = 0
static

Definition at line 73 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ RTTTotal

ULONG RTTTotal = 0
static

Definition at line 74 of file ping.c.

Referenced by Ping(), and PrintStats().

◆ Target

Definition at line 66 of file ping.c.

◆ TargetName

◆ Timeout

ULONG Timeout = 4000
static

Definition at line 61 of file ping.c.

Referenced by __drv_when(), FxCREvent::_Acquires_lock_(), _IRQL_requires_max_(), AcpiAcquireGlobalLock(), AcpiAcquireMutex(), AcpiEvAcquireGlobalLock(), AcpiExAcquireMutexObject(), AcpiExSystemWaitMutex(), AcpiExSystemWaitSemaphore(), AcpiOsAcquireMutex(), AcpiOsWaitSemaphore(), AtapWaitForNotBusy(), BaseFormatTimeOut(), BatteryClassIoctl(), BmpGetSelectedBootEntry(), CmpArmDelayedCloseTimer(), CmpDelayDerefKeyControlBlock(), co_MsqSendMessage(), ConSrvConsoleCtrlEventTimeout(), CScopedMutex::CScopedMutex(), CsrCaptureTimeout(), ddraw7_EvaluateMode(), DeviceInstallThread(), DoRebootCommand(), DoStopService(), EnableUserModePnpManager(), FxCREvent::EnterCRAndWaitAndLeave(), ExpWaitForResource(), ExpWorkerThreadBalanceManager(), ExpWorkerThreadEntryPoint(), Ext2bhReaperThread(), Ext2FcbReaperThread(), Ext2McbReaperThread(), Ext2Sleep(), ExTimedWaitForUnblockPushLock(), FlushConsoleInputBuffer(), GetMailslotInfo(), GetNtTimeout(), HDA_SendVerbs(), i8042MouDpcRoutine(), Icmp6SendEcho2(), IcmpSendEcho(), IcmpSendEcho2(), implicit_handle(), InstallScreenSaverW(), InternalWake(), IopRestartLogWorker(), KeRemoveQueue(), KeWaitForMultipleObjects(), KeWaitForSingleObject(), KmtEnsureServiceState(), KmtUserModeCallback(), LdrpInit(), LoadScreenSaverParameters(), LpcpDeletePort(), main(), MiInitBalancerThread(), MsfsRead(), NdisIPnPStartDevice(), NdisMSetPeriodicTimer(), NdisMSetTimer(), NdisSetTimer(), NdisWaitEvent(), NotifyTopLevelWindow(), NpCreateFcb(), NpWaitPipe(), NtRemoveIoCompletion(), NtReplyWaitReceivePortEx(), NtUserWaitForInputIdle(), NtWaitForDebugEvent(), ParseCmdLine(), PeekConsoleInput(), Phase1InitializationDiscard(), Ping(), ProgressCountdown(), PS2ControllerWait(), RasSecurityDialogReceive(), ReadMidiUartByte(), RpcCancelThreadEx(), RpcMgmtSetCancelTimeout(), RpcMgmtSetComTimeout(), RtlpInitializeThreadPool(), RtlpIoWorkerThreadProc(), RtlpStartWorkerThread(), RtlpWorkerThreadProc(), RWDetermineMediaType(), SbDsp4SetInputRate(), SbDsp4SetOutputRate(), SbDsp4WriteRate(), SbDspDisableSpeaker(), SbDspEnableSpeaker(), SbDspGetVersion(), SbDspIsSpeakerEnabled(), SbDspRead(), SbDspReset(), SbDspWaitToRead(), SbDspWaitToWrite(), SbDspWrite(), ScreenSaverThreadMain(), SetMailslotInfo(), SetRecoveryTimeout(), SetTimeout(), SleepConditionVariableCS(), SleepConditionVariableSRW(), SmpApiLoop(), SmpLoadSubSystem(), SmpLoadSubSystemsForMuSession(), StartThread(), FxRequestBase::StartTimer(), TCPDisconnect(), TcpipWaitForSingleObject(), TdiSendThread(), TestCreateNamedPipe(), TestFastMutexConcurrent(), TestGuardedMutexConcurrent(), TestResourceWithThreads(), USBH_SyncResetPort(), UserpMessageBox(), UserServerHardError(), VideoPortWaitForSingleObject(), MxEvent::WaitFor(), WaitForControllerInterrupt(), WaitForDebugEvent(), WaitForKeyboard(), WaitForMidiUartStatus(), WaitForRemoteDatabaseSemaphore(), WaitForWork(), WaitNoPendingInstallEvents(), WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(), WdfWaitLockAcquire(), WlxSetTimeout(), WorkerThread(), WriteMidiUartByte(), WriteMidiUartMulti(), WSPAccept(), WSPSelect(), WTSSendMessageA(), and WTSSendMessageW().