ReactOS  0.4.12-dev-18-gf469aca
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.

Referenced by ParseCmdLine().

◆ MAX_SEND_SIZE

#define MAX_SEND_SIZE   65500

Definition at line 52 of file ping.c.

Referenced by ParseCmdLine().

◆ 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.

Referenced by Ping().

◆ SIZEOF_IO_STATUS_BLOCK

#define SIZEOF_IO_STATUS_BLOCK   8

Definition at line 50 of file ping.c.

Referenced by Ping().

◆ 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 656 of file ping.c.

Referenced by wmain().

657 {
658  switch (ControlType)
659  {
660  case CTRL_C_EVENT:
661  PrintStats();
663  return FALSE;
664 
665  case CTRL_BREAK_EVENT:
666  PrintStats();
668  return TRUE;
669 
670  case CTRL_CLOSE_EVENT:
671  PrintStats();
672  return FALSE;
673 
674  default:
675  return FALSE;
676  }
677 }
#define TRUE
Definition: types.h:120
#define CTRL_BREAK_EVENT
Definition: wincon.h:66
#define CTRL_CLOSE_EVENT
Definition: wincon.h:67
#define CTRL_C_EVENT
Definition: wincon.h:65
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
static void PrintStats(void)
Definition: ping.c:639
#define IDS_CTRL_C
Definition: resource.h:5
#define StdOut
Definition: stream.h:76
#define IDS_CTRL_BREAK
Definition: resource.h:4

◆ ParseCmdLine()

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

Definition at line 168 of file ping.c.

Referenced by wmain().

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':
185  PingForever = TRUE;
186  break;
187 
188  case L'a':
190  break;
191 
192  case L'n':
193  {
194  if (i + 1 < argc)
195  {
196  PingForever = FALSE;
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);
295  if (Timeout < DEFAULT_TIMEOUT)
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 
314  Family = AF_INET6;
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 
340  Family = AF_INET6;
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 TRUE
Definition: types.h:120
#define IP_FLAG_DF
Definition: ipexport.h:53
static ULONG RequestSize
Definition: ping.c:63
static ULONG PingCount
Definition: ping.c:64
#define IDS_WRONG_FAMILY
Definition: resource.h:12
#define IDS_USAGE
Definition: resource.h:3
#define MAX_SEND_SIZE
Definition: ping.c:52
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
static char ** argv
Definition: ServiceArgs.c:11
GLenum GLclampf GLint i
Definition: glfuncs.h:14
static int Family
Definition: ping.c:62
smooth NULL
Definition: ftsmooth.c:416
#define IDS_MISSING_ADDRESS
Definition: resource.h:7
#define AF_INET6
Definition: winsock.h:369
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
#define StdErr
Definition: stream.h:77
unsigned char Ttl
Definition: ipexport.h:33
unsigned char UCHAR
Definition: xmlstorage.h:181
static const WCHAR L[]
Definition: oid.c:1087
#define IDS_BAD_VALUE
Definition: resource.h:11
unsigned char Flags
Definition: ipexport.h:35
static IP_OPTION_INFORMATION IpOptions
Definition: ping.c:79
#define IDS_BAD_PARAMETER
Definition: resource.h:10
#define UINT_MAX
Definition: limits.h:41
#define IDS_MISSING_VALUE
Definition: resource.h:8
static ULONG Timeout
Definition: ping.c:61
#define UCHAR_MAX
Definition: limits.h:25
static BOOL ResolveAddress
Definition: ping.c:70
#define StdOut
Definition: stream.h:76
unsigned int ULONG
Definition: retypes.h:1
#define AF_INET
Definition: tcpip.h:117
#define IDS_BAD_OPTION
Definition: resource.h:9
static BOOL PingForever
Definition: ping.c:65
#define DEFAULT_TIMEOUT
Definition: ping.c:51
static PCWSTR TargetName
Definition: ping.c:67

◆ Ping()

static void Ping ( void  )
static

Definition at line 419 of file ping.c.

Referenced by RunTraceRoute(), and wmain().

420 {
422  PVOID SendBuffer = NULL;
423  DWORD ReplySize = 0;
424  DWORD Status;
425 
426  SendBuffer = malloc(RequestSize);
427  if (SendBuffer == NULL)
428  {
430  exit(1);
431  }
432 
433  ZeroMemory(SendBuffer, RequestSize);
434 
435  if (Family == AF_INET6)
436  ReplySize += sizeof(ICMPV6_ECHO_REPLY);
437  else
438  ReplySize += sizeof(ICMP_ECHO_REPLY);
439 
441 
442  ReplyBuffer = malloc(ReplySize);
443  if (ReplyBuffer == NULL)
444  {
446  free(SendBuffer);
447  exit(1);
448  }
449 
450  ZeroMemory(ReplyBuffer, ReplySize);
451 
452  EchosSent++;
453 
454  if (Family == AF_INET6)
455  {
456  struct sockaddr_in6 Source;
457 
458  ZeroMemory(&Source, sizeof(Source));
459  Source.sin6_family = AF_INET6;
460 
461  Status = Icmp6SendEcho2(hIcmpFile, NULL, NULL, NULL,
462  &Source,
463  (struct sockaddr_in6 *)Target->ai_addr,
464  SendBuffer, (USHORT)RequestSize, &IpOptions,
465  ReplyBuffer, ReplySize, Timeout);
466  }
467  else
468  {
469  Status = IcmpSendEcho2(hIcmpFile, NULL, NULL, NULL,
470  ((PSOCKADDR_IN)Target->ai_addr)->sin_addr.s_addr,
471  SendBuffer, (USHORT)RequestSize, &IpOptions,
472  ReplyBuffer, ReplySize, Timeout);
473  }
474 
475  free(SendBuffer);
476 
477  if (Status == 0)
478  {
479  Status = GetLastError();
480  switch (Status)
481  {
482  case IP_REQ_TIMED_OUT:
484  break;
485 
486  default:
488  break;
489  }
490  }
491  else
492  {
493  SOCKADDR_IN6 SockAddrIn6;
494  SOCKADDR_IN SockAddrIn;
495  PSOCKADDR SockAddr;
496  socklen_t Size;
497 
498  EchosReceived++;
499 
500  ZeroMemory(&SockAddrIn, sizeof(SockAddrIn));
501  ZeroMemory(&SockAddrIn6, sizeof(SockAddrIn6));
502 
503  if (Family == AF_INET6)
504  {
505  PICMPV6_ECHO_REPLY pEchoReply;
506  PIPV6_ADDRESS_EX Ipv6Addr;
507 
508  pEchoReply = (PICMPV6_ECHO_REPLY)ReplyBuffer;
509 
510  Ipv6Addr = (PIPV6_ADDRESS_EX)&pEchoReply->Address;
511  SockAddrIn6.sin6_family = AF_INET6;
512  CopyMemory(SockAddrIn6.sin6_addr.u.Word, Ipv6Addr->sin6_addr, sizeof(SockAddrIn6.sin6_addr));
513  //SockAddrIn6.sin6_addr = Ipv6Addr->sin6_addr;
514  SockAddr = (PSOCKADDR)&SockAddrIn6;
515  Size = sizeof(SOCKADDR_IN6);
516 
517  GetNameInfoW(SockAddr,
518  Size,
519  Address,
520  NI_MAXHOST,
521  NULL,
522  0,
524 
526 
527  switch (pEchoReply->Status)
528  {
529  case IP_SUCCESS:
530  {
531  EchosSuccessful++;
532 
533  if (pEchoReply->RoundTripTime == 0)
535  else
537 
538  if (pEchoReply->RoundTripTime < RTTMin || RTTMin == 0)
539  RTTMin = pEchoReply->RoundTripTime;
540 
541  if (pEchoReply->RoundTripTime > RTTMax || RTTMax == 0)
542  RTTMax = pEchoReply->RoundTripTime;
543 
544  ConPuts(StdOut, L"\n");
545 
546  RTTTotal += pEchoReply->RoundTripTime;
547  break;
548  }
549 
552  break;
553 
556  break;
557 
560  break;
561 
562  default:
564  break;
565  }
566  }
567  else
568  {
569  PICMP_ECHO_REPLY pEchoReply;
570  IPAddr *IP4Addr;
571 
572  pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
573 
574  IP4Addr = (IPAddr *)&pEchoReply->Address;
575  SockAddrIn.sin_family = AF_INET;
576  SockAddrIn.sin_addr.S_un.S_addr = *IP4Addr;
577  SockAddr = (PSOCKADDR)&SockAddrIn;
578  Size = sizeof(SOCKADDR_IN);
579 
580  GetNameInfoW(SockAddr,
581  Size,
582  Address,
583  NI_MAXHOST,
584  NULL,
585  0,
587 
589 
590  switch (pEchoReply->Status)
591  {
592  case IP_SUCCESS:
593  {
594  EchosSuccessful++;
595 
597 
598  if (pEchoReply->RoundTripTime == 0)
600  else
602 
603  ConResPrintf(StdOut, IDS_REPLY_TTL, pEchoReply->Options.Ttl);
604 
605  if (pEchoReply->RoundTripTime < RTTMin || RTTMin == 0)
606  RTTMin = pEchoReply->RoundTripTime;
607 
608  if (pEchoReply->RoundTripTime > RTTMax || RTTMax == 0)
609  RTTMax = pEchoReply->RoundTripTime;
610 
611  RTTTotal += pEchoReply->RoundTripTime;
612  break;
613  }
614 
617  break;
618 
621  break;
622 
625  break;
626 
627  default:
629  break;
630  }
631  }
632  }
633 
634  free(ReplyBuffer);
635 }
#define IDS_REQUEST_TIMED_OUT
Definition: resource.h:26
static ULONG RequestSize
Definition: ping.c:63
struct _IPV6_ADDRESS_EX * PIPV6_ADDRESS_EX
#define NI_NUMERICHOST
Definition: ws2def.h:354
ADDRESS_FAMILY sin6_family
Definition: ws2ipdef.h:179
#define IDS_REPLY_TIME_0MS
Definition: resource.h:21
struct icmp_echo_reply * PICMP_ECHO_REPLY
Definition: ipexport.h:80
#define free
Definition: debug_ros.c:5
unsigned short DataSize
Definition: ipexport.h:72
static ULONG EchosSuccessful
Definition: ping.c:77
#define IDS_DEST_NET_UNREACHABLE
Definition: resource.h:25
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
static ULONG RTTMax
Definition: ping.c:72
struct sockaddr * PSOCKADDR
Definition: winsock.h:485
#define IP_TTL_EXPIRED_TRANSIT
Definition: ipexport.h:115
static HANDLE hIcmpFile
Definition: ping.c:60
USHORT Word[8]
Definition: in6addr.h:6
static PADDRINFOW Target
Definition: ping.c:66
#define IDS_REPLY_STATUS
Definition: resource.h:23
IPAddr Address
Definition: ipexport.h:69
static ULONG EchosSent
Definition: ping.c:75
static int Family
Definition: ping.c:62
#define IDS_REPLY_TIME_MS
Definition: resource.h:20
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
#define AF_INET6
Definition: winsock.h:369
ULONG Status
Definition: ipexport.h:70
static ULONG EchosReceived
Definition: ping.c:76
#define IDS_REPLY_TTL
Definition: resource.h:22
ULONG IPAddr
Definition: pfhook.h:35
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
#define IDS_DEST_HOST_UNREACHABLE
Definition: resource.h:24
static ULONG RTTTotal
Definition: ping.c:74
#define IDS_TTL_EXPIRED
Definition: resource.h:27
IN6_ADDR sin6_addr
Definition: ws2ipdef.h:182
#define IP_REQ_TIMED_OUT
Definition: ipexport.h:112
ICMPV6_ECHO_REPLY_LH * PICMPV6_ECHO_REPLY
Definition: ipexport.h:174
#define IP_DEST_NET_UNREACHABLE
Definition: ipexport.h:104
#define CopyMemory
Definition: winbase.h:1633
unsigned long DWORD
Definition: ntddk_ex.h:95
int socklen_t
Definition: tcp.c:35
#define StdErr
Definition: stream.h:77
#define NI_MAXHOST
Definition: ws2def.h:359
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
ICMPV6_ECHO_REPLY_LH ICMPV6_ECHO_REPLY
Definition: ipexport.h:173
_Must_inspect_result_ _In_ PFLT_PORT _In_ ULONG _Out_writes_bytes_opt_ ReplyLength PVOID ReplyBuffer
Definition: fltkernel.h:1903
IPV6_ADDRESS_EX Address
Definition: ipexport.h:168
static const WCHAR L[]
Definition: oid.c:1087
static ULONG RTTMin
Definition: ping.c:73
ULONG RoundTripTime
Definition: ipexport.h:71
#define IDS_TRANSMIT_FAILED
Definition: resource.h:28
static IP_OPTION_INFORMATION IpOptions
Definition: ping.c:79
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
unsigned int RoundTripTime
Definition: ipexport.h:170
Status
Definition: gdiplustypes.h:24
struct in_addr sin_addr
Definition: winsock.h:512
DWORD WINAPI IcmpSendEcho2(HANDLE IcmpHandle, HANDLE Event, FARPROC ApcRoutine, PVOID ApcContext, IPAddr DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout)
static ULONG Timeout
Definition: ping.c:61
#define IDS_REPLY_BYTES
Definition: resource.h:19
#define SIZEOF_IO_STATUS_BLOCK
Definition: ping.c:50
#define SIZEOF_ICMP_ERROR
Definition: ping.c:49
unsigned short USHORT
Definition: pedump.c:61
#define IDS_REPLY_FROM
Definition: resource.h:18
struct sockaddr_in SOCKADDR_IN
Definition: winsock.h:487
INT ConPuts(IN PCON_STREAM Stream, IN LPWSTR szStr)
Definition: outstream.c:427
struct sockaddr * ai_addr
Definition: ws2def.h:682
SOCKADDR_IN6_LH SOCKADDR_IN6
Definition: ws2ipdef.h:199
#define StdOut
Definition: stream.h:76
struct icmp_echo_reply ICMP_ECHO_REPLY
Definition: ipexport.h:80
#define AF_INET
Definition: tcpip.h:117
#define IP_SUCCESS
Definition: ticonsts.h:58
#define malloc
Definition: debug_ros.c:4
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3149
struct ip_option_information Options
Definition: ipexport.h:75
void exit(int exitcode)
Definition: _exit.c:33
#define IP_DEST_HOST_UNREACHABLE
Definition: ipexport.h:105
short sin_family
Definition: winsock.h:510
DWORD WINAPI Icmp6SendEcho2(HANDLE IcmpHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, struct sockaddr_in6 *SourceAddress, struct sockaddr_in6 *DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout)
Definition: icmp.c:162
USHORT sin6_addr[8]
Definition: ipexport.h:162
#define IDS_NO_RESOURCES
Definition: resource.h:6
union in6_addr::@2862 u

◆ PrintStats()

static void PrintStats ( void  )
static

Definition at line 639 of file ping.c.

Referenced by ConsoleCtrlHandler(), and wmain().

640 {
641  ULONG EchosLost = EchosSent - EchosReceived;
642  ULONG PercentLost = (ULONG)((EchosLost / (double)EchosSent) * 100.0);
643 
644  ConResPrintf(StdOut, IDS_STATISTICS, Address, EchosSent, EchosReceived, EchosLost, PercentLost);
645 
646  if (EchosSuccessful > 0)
647  {
648  ULONG RTTAverage = RTTTotal / EchosSuccessful;
650  }
651 }
#define IDS_APPROXIMATE_RTT
Definition: resource.h:30
static ULONG EchosSuccessful
Definition: ping.c:77
static ULONG RTTMax
Definition: ping.c:72
static ULONG EchosSent
Definition: ping.c:75
#define IDS_STATISTICS
Definition: resource.h:29
static WCHAR Address[46]
Definition: ping.c:68
static ULONG EchosReceived
Definition: ping.c:76
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
static ULONG RTTTotal
Definition: ping.c:74
static ULONG RTTMin
Definition: ping.c:73
#define StdOut
Definition: stream.h:76
unsigned int ULONG
Definition: retypes.h:1

◆ ResolveTarget()

static BOOL ResolveTarget ( PCWSTR  target)
static

Definition at line 377 of file ping.c.

Referenced by wmain().

378 {
380  int Status;
381 
382  ZeroMemory(&hints, sizeof(hints));
383  hints.ai_family = Family;
384  hints.ai_flags = AI_NUMERICHOST;
385 
386  Status = GetAddrInfoW(target, NULL, &hints, &Target);
387  if (Status != 0)
388  {
389  hints.ai_flags = AI_CANONNAME;
390 
391  Status = GetAddrInfoW(target, NULL, &hints, &Target);
392  if (Status != 0)
393  {
395  return FALSE;
396  }
397 
399  }
400  else if (ResolveAddress)
401  {
404  NULL, 0,
405  NI_NAMEREQD);
406  if (Status != 0)
407  {
408  DPRINT("GetNameInfoW failed: %d\n", WSAGetLastError());
409  }
410  }
411 
413 
414  return TRUE;
415 }
static WCHAR CanonName[NI_MAXHOST]
Definition: ping.c:69
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
#define NI_NAMEREQD
Definition: ws2def.h:355
#define TRUE
Definition: types.h:120
#define AI_CANONNAME
Definition: ws2def.h:294
#define _countof(array)
Definition: fontsub.cpp:30
#define ZeroMemory
Definition: winbase.h:1635
static PADDRINFOW Target
Definition: ping.c:66
static int Family
Definition: ping.c:62
INT WSAAPI GetAddrInfoW(IN PCWSTR pszNodeName, IN PCWSTR pszServiceName, IN const ADDRINFOW *ptHints, OUT PADDRINFOW *pptResult)
Definition: addrinfo.c:509
int ai_family
Definition: ws2def.h:677
size_t ai_addrlen
Definition: ws2def.h:680
smooth NULL
Definition: ftsmooth.c:416
void DPRINT(...)
Definition: polytest.cpp:61
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
#define IDS_UNKNOWN_HOST
Definition: resource.h:13
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
Status
Definition: gdiplustypes.h:24
#define AI_NUMERICHOST
Definition: ws2def.h:295
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
int ai_flags
Definition: ws2def.h:676
static BOOL ResolveAddress
Definition: ping.c:70
struct sockaddr * ai_addr
Definition: ws2def.h:682
#define StdOut
Definition: stream.h:76
PWSTR ai_canonname
Definition: ws2def.h:681
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

◆ 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 
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 }
static WCHAR CanonName[NI_MAXHOST]
Definition: ping.c:69
static int argc
Definition: ServiceArgs.c:12
#define IDS_PING_SIZE
Definition: resource.h:17
#define TRUE
Definition: types.h:120
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:736
static ULONG RequestSize
Definition: ping.c:63
INT WSAAPI WSAAddressToStringW(IN LPSOCKADDR lpsaAddress, IN DWORD dwAddressLength, IN LPWSAPROTOCOL_INFOW lpProtocolInfo, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength)
Definition: rnr.c:128
#define MAKEWORD(a, b)
Definition: typedefs.h:247
static BOOL ResolveTarget(PCWSTR target)
Definition: ping.c:377
static ULONG PingCount
Definition: ping.c:64
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define IDS_PINGING_ADDRESS
Definition: resource.h:14
static BOOL ParseCmdLine(int argc, PWSTR argv[])
Definition: ping.c:168
static HANDLE hIcmpFile
Definition: ping.c:60
static char ** argv
Definition: ServiceArgs.c:11
static PADDRINFOW Target
Definition: ping.c:66
static BOOL WINAPI ConsoleCtrlHandler(DWORD ControlType)
Definition: ping.c:656
static void Ping(void)
Definition: ping.c:419
GLenum GLclampf GLint i
Definition: glfuncs.h:14
#define ConInitStdStreams()
Definition: stream.h:122
static int Family
Definition: ping.c:62
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2111
size_t ai_addrlen
Definition: ws2def.h:680
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
#define AF_INET6
Definition: winsock.h:369
void DPRINT(...)
Definition: polytest.cpp:61
HANDLE WINAPI Icmp6CreateFile(VOID)
Definition: icmp.c:114
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
static void PrintStats(void)
Definition: ping.c:639
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
unsigned long DWORD
Definition: ntddk_ex.h:95
#define StdErr
Definition: stream.h:77
unsigned char Ttl
Definition: ipexport.h:33
static IP_OPTION_INFORMATION IpOptions
Definition: ping.c:79
Status
Definition: gdiplustypes.h:24
BOOL WINAPI IcmpCloseHandle(HANDLE IcmpHandle)
Definition: icmp.c:243
#define IDS_PINGING_HOSTNAME
Definition: resource.h:15
struct sockaddr * ai_addr
Definition: ws2def.h:682
WINSOCK_API_LINKAGE VOID WSAAPI FreeAddrInfoW(_In_opt_ PADDRINFOW pAddrInfo)
#define StdOut
Definition: stream.h:76
unsigned int ULONG
Definition: retypes.h:1
HANDLE WINAPI IcmpCreateFile(VOID)
Definition: icmp.c:188
static BOOL PingForever
Definition: ping.c:65
static PCWSTR TargetName
Definition: ping.c:67
#define IDS_WINSOCK_FAIL
Definition: resource.h:31

Variable Documentation

◆ Address

WCHAR Address[46]
static

Definition at line 68 of file ping.c.

Referenced by _IRQL_requires_max_(), _Struct_size_bytes_(), acpi_create_volatile_registry_tables(), AcpiEvAddressSpaceDispatch(), AcpiEvCreateGpeBlock(), AcpiEvInstallGpeHandler(), AcpiExPciConfigSpaceHandler(), AcpiExSystemMemorySpaceHandler(), AcpiHwRead(), AcpiHwWrite(), AcpiInstallSciHandler(), AcpiOsMapMemory(), AcpiOsReadMemory(), AcpiTbInitTableDescriptor(), AcpiTbOverrideTable(), AcpiTbParseRootTable(), AcpiUtAddAddressRange(), addIPAddress(), AddrSearchFirst(), AfdPacketSocketWriteData(), AlignUp(), AttachToConsoleInternal(), CUSBRequest::BuildIsochronousEndpoint(), CUSBRequest::BuildQueueHead(), CdFileTrackMode(), CdProcessToc(), CdTocSerial(), CheckForCurrentHostname(), cleanup_gcc_exe(), ConvertStabs(), CopyPacketToBuffer(), CpInitialize(), CpuExceptionFilter(), CreateUmaDescriptor(), CsrProbeForRead(), CsrProbeForWrite(), DECLARE_INTERFACE_(), DhcpStaticRefreshParams(), DispTdiQueryInformation(), DnsAddr_BuildFromAtm(), DnsAddr_BuildFromIp4(), DnsAddr_BuildFromIp6(), DnsQuery_W(), DosBootsectorInitialize(), DosLoadDriver(), DosLoadExecutable(), doSymSearch(), EmulatorReadIo(), EmulatorReadMemory(), EmulatorWriteIo(), ExAllocatePoolWithQuotaTag(), Ext2ReadDisk(), Ext2WriteDisk(), FatMapUserBuffer(), find_and_print_offset(), find_offset(), FindEntry(), FindEntryInHosts(), FsRtlAllocatePool(), FsRtlAllocatePoolWithQuota(), FsRtlAllocatePoolWithQuotaTag(), FsRtlAllocatePoolWithTag(), GetNameInfoW(), CUSBHardwareDevice::GlobalReset(), GspLoadHwBreakpoint(), GspMem2Hex(), GspReadMemSafe(), GspSetHwBreakpoint(), GspSetRegistersInTrapFrame(), GspSetSwBreakpoint(), GspWriteMem(), HalpAssignPCISlotResources(), HalpGetCmosData(), HalpIsValidPCIDevice(), HalpScatterGatherAdapterControl(), HalpSetCmosData(), HidClass_ReadCompleteIrp(), InbvPortEnableFifo(), InbvPortInitialize(), InfoTdiSetArptableMIB(), InfoTdiSetRoute(), CUSBRequest::InitDescriptor(), InitRomRange(), IoMapTransfer(), KdbpCmdBackTrace(), KdbpCmdBreakPoint(), KdbpCmdBreakPointList(), KdbpCmdDisassembleX(), KdbpCmdMod(), KdbpGetBreakPointInfo(), KdbpInsertBreakPoint(), KdbpIsBreakPointOurs(), KdbpSymFindModule(), KdpAddBreakpoint(), KdpDeleteBreakpointRange(), KdpGdbEnterDebuggerException(), KdpLowRestoreBreakpoint(), KdpLowWriteContent(), KdSetOwedBreakpoints(), KeRegisterInterruptHandler(), KiDataAbortHandler(), KiPrefetchAbortHandler(), KiSetTebBase(), LanAdapterInfo(), LdrpGetShimEngineFunction(), LdrRelocateImageWithBias(), MergeStabsAndCoffs(), MiBalancerThread(), MiBuildPfnDatabaseFromPageTables(), MiCheckVirtualAddress(), MiIsMemoryTypeInvisible(), MiQueryMemoryBasicInformation(), MmAlterViewAttributes(), MmCreateVirtualMappingInternal(), MmCreateVirtualMappingUnsafe(), MmDbgCopyMemory(), MmDeleteProcessAddressSpace(), MmDeleteVirtualMapping(), MmFreeMemoryArea(), MmGetPageProtect(), MmInsertRmap(), MmIsDirtyPage(), MmIsPagePresent(), MmNotPresentFault(), MmPageOutPhysicalAddress(), MmpPageOutPhysicalAddress(), MmProbeAndLockPages(), MmSecureVirtualMemory(), NBAddNeighbor(), NewAddrInfo(), NtSetInformationThread(), Ping(), PrintHopInfo(), PrintStats(), ProtectToPTE(), CPortWaveRTStreamInit::QueryInterface(), CDmaChannelInit::QueryInterface(), rsym_parse(), RtlpFindAndCommitPages(), RtlpInsertUnCommittedPages(), ScsiPortConvertUlongToPhysicalAddress(), seterror(), START_TEST(), CUSBRequest::STDMETHODIMP_(), StorPortConvertUlongToPhysicalAddress(), TdiOpenAddressFile(), TdiOpenTransport(), TdiReceiveThread(), test_address_list_query(), TiCreateFileObject(), UmaDescReallocate(), UmaDescRelease(), UmaDescReserve(), UmaMgrInitialize(), USBSTOR_HandleDeviceControl(), VDDDeInstallMemoryHook(), VDDInstallMemoryHook(), VgaUpdateFramebuffer(), VidBiosVideoService(), WinLdrEnableFifo(), WinLdrPortInitialize(), wmain(), Write(), WSNoteSuccessfulHostentLookup(), x86BiosReadMemory(), x86BiosWriteMemory(), and XmsBopProcedure().

◆ CanonName

WCHAR CanonName[NI_MAXHOST]
static

Definition at line 69 of file ping.c.

Referenced by ResolveTarget(), 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

int Family = AF_UNSPEC
static

Definition at line 62 of file ping.c.

Referenced by GetAdapterOrderMap(), ParseCmdLine(), Ping(), ResolveTarget(), wmain(), and WsNcMatchProtocols().

◆ hIcmpFile

HANDLE hIcmpFile = INVALID_HANDLE_VALUE
static

Definition at line 60 of file ping.c.

◆ IpOptions

IP_OPTION_INFORMATION IpOptions
static

Definition at line 79 of file ping.c.

◆ 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

ULONG RequestSize = 32
static

Definition at line 63 of file ping.c.

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

◆ 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

PADDRINFOW Target = NULL
static

Definition at line 66 of file ping.c.

◆ TargetName

PCWSTR TargetName = NULL
static

Definition at line 67 of file ping.c.

Referenced by ParseCmdLine(), and wmain().

◆ Timeout

ULONG Timeout = 4000
static

Definition at line 61 of file ping.c.

Referenced by _IRQL_requires_max_(), AdapterControl(), BaseFormatTimeOut(), BatteryClassIoctl(), BmpGetSelectedBootEntry(), CmpArmDelayedCloseTimer(), CmpDelayDerefKeyControlBlock(), co_MsqSendMessage(), CsrCaptureTimeout(), DoRebootCommand(), DoStopService(), ExpInitializeKeyedEvent(), ExpWaitForResource(), ExpWorkerThreadBalanceManager(), ExpWorkerThreadEntryPoint(), Ext2bhReaperThread(), Ext2FcbReaperThread(), Ext2McbReaperThread(), Ext2Sleep(), FlushConsoleInputBuffer(), GetMailslotInfo(), GetNextJobTimeout(), CUSBHardwareDevice::GlobalReset(), i8042MouDpcRoutine(), implicit_handle(), CUSBHardwareDevice::InitializeController(), InternalWake(), IopRestartLogWorker(), IsConsoleMode(), KeRemoveQueue(), KeWaitForMultipleObjects(), KeWaitForSingleObject(), KmtEnsureServiceState(), KmtUserModeCallback(), LdrpInit(), LpcpDeletePort(), main(), MsfsRead(), NdisIPnPStartDevice(), NdisMSetPeriodicTimer(), NdisMSetTimer(), NdisSetTimer(), NdisWaitEvent(), NotifyTopLevelWindow(), NpCompleteDeferredIrps(), NpCreateFcb(), NtRemoveIoCompletion(), NtReplyWaitReceivePortEx(), NtUserWaitForInputIdle(), NtWaitForDebugEvent(), ParseCmdLine(), PeekConsoleInput(), Phase1InitializationDiscard(), Ping(), ProgressCountdown(), PS2ControllerWait(), CUSBHardwareDevice::ResetController(), RtlpInitializeThreadPool(), RtlpIoWorkerThreadProc(), RtlpStartWorkerThread(), RtlpWorkerThreadProc(), RWDetermineMediaType(), SbDspReset(), SbDspWaitToRead(), SbDspWaitToWrite(), ScreenSaverThreadMain(), SetMailslotInfo(), SmpApiLoop(), SmpLoadSubSystem(), SmpLoadSubSystemsForMuSession(), CUSBHardwareDevice::StartController(), TCPDisconnect(), TdiSendThread(), TestCreateNamedPipe(), TestFastMutexConcurrent(), TestGuardedMutexConcurrent(), TestResourceWithThreads(), USBH_SyncResetPort(), UserServerHardError(), VideoPortWaitForSingleObject(), WaitForDebugEvent(), WaitForKeyboard(), WaitForMidiUartStatus(), WaitForRemoteDatabaseSemaphore(), WaitForWork(), WlxSetTimeout(), WorkerThread(), and WSPSelect().