ReactOS  0.4.11-dev-946-g431643b
ping.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Tim Crawford
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22 /*
23  * PROJECT: ReactOS Ping Command
24  * LICENSE: MIT
25  * FILE: base/applications/network/ping/ping.c
26  * PURPOSE: Network test utility
27  * PROGRAMMERS: Tim Crawford <crawfxrd@gmail.com>
28  */
29 
30 #include <stdlib.h>
31 
32 #define WIN32_LEAN_AND_MEAN
33 
34 #define WIN32_NO_STATUS
35 #include <windef.h>
36 #include <winbase.h>
37 #include <winsock2.h>
38 #include <ws2tcpip.h>
39 #include <iphlpapi.h>
40 #include <icmpapi.h>
41 
42 #include <conutils.h>
43 
44 #include "resource.h"
45 
46 #define NDEBUG
47 #include <debug.h>
48 
49 #define SIZEOF_ICMP_ERROR 8
50 #define SIZEOF_IO_STATUS_BLOCK 8
51 #define DEFAULT_TIMEOUT 1000
52 #define MAX_SEND_SIZE 65500
53 
54 static BOOL ParseCmdLine(int argc, PWSTR argv[]);
56 static void Ping(void);
57 static void PrintStats(void);
58 static BOOL WINAPI ConsoleCtrlHandler(DWORD ControlType);
59 
61 static ULONG Timeout = 4000;
62 static int Family = AF_UNSPEC;
63 static ULONG RequestSize = 32;
64 static ULONG PingCount = 4;
68 static WCHAR Address[46];
71 
72 static ULONG RTTMax = 0;
73 static ULONG RTTMin = 0;
74 static ULONG RTTTotal = 0;
75 static ULONG EchosSent = 0;
76 static ULONG EchosReceived = 0;
78 
80 
81 int
82 wmain(int argc, WCHAR *argv[])
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());
119  FreeAddrInfoW(Target);
120  WSACleanup();
121  return 1;
122  }
123 
124  if (Family == AF_INET6)
125  hIcmpFile = Icmp6CreateFile();
126  else
127  hIcmpFile = IcmpCreateFile();
128 
129 
130  if (hIcmpFile == INVALID_HANDLE_VALUE)
131  {
132  DPRINT("IcmpCreateFile failed: %lu\n", GetLastError());
133  FreeAddrInfoW(Target);
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 
159  IcmpCloseHandle(hIcmpFile);
160  FreeAddrInfoW(Target);
161  WSACleanup();
162 
163  return 0;
164 }
165 
166 static
167 BOOL
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  {
200  ConResPrintf(StdErr, IDS_BAD_VALUE, argv[i - 1], 1, UINT_MAX);
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  {
219  ConResPrintf(StdErr, IDS_BAD_VALUE, argv[i - 1], 0, MAX_SEND_SIZE);
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  {
235  ConResPrintf(StdErr, IDS_WRONG_FAMILY, argv[i], L"IPv4");
236  return FALSE;
237  }
238 
239  Family = AF_INET;
240  IpOptions.Flags |= IP_FLAG_DF;
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  {
252  ConResPrintf(StdErr, IDS_BAD_VALUE, argv[i - 1], 1, UCHAR_MAX);
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  {
270  ConResPrintf(StdErr, IDS_WRONG_FAMILY, argv[i], L"IPv4");
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  {
310  ConResPrintf(StdErr, IDS_WRONG_FAMILY, argv[i], L"IPv6");
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  {
324  ConResPrintf(StdErr, IDS_WRONG_FAMILY, argv[i], L"IPv4");
325  return FALSE;
326  }
327 
328  Family = AF_INET;
329  break;
330  }
331 
332  case L'6':
333  {
334  if (Family == AF_INET)
335  {
336  ConResPrintf(StdErr, IDS_WRONG_FAMILY, argv[i], L"IPv6");
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 }
374 
375 static
376 BOOL
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 
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,
405  NI_NAMEREQD);
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 }
416 
417 static
418 void
419 Ping(void)
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 }
636 
637 static
638 void
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 }
652 
653 static
654 BOOL
655 WINAPI
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 }
static WCHAR CanonName[NI_MAXHOST]
Definition: ping.c:69
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
static int argc
Definition: ServiceArgs.c:12
#define IDS_PING_SIZE
Definition: resource.h:17
#define IDS_REQUEST_TIMED_OUT
Definition: resource.h:26
#define NI_NAMEREQD
Definition: ws2def.h:355
#define TRUE
Definition: types.h:120
int wmain(int argc, WCHAR *argv[])
Definition: ping.c:82
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:736
#define IP_FLAG_DF
Definition: ipexport.h:53
#define CTRL_BREAK_EVENT
Definition: wincon.h:66
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
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 IDS_REPLY_TIME_0MS
Definition: resource.h:21
#define AI_CANONNAME
Definition: ws2def.h:294
#define MAKEWORD(a, b)
Definition: typedefs.h:247
#define IDS_APPROXIMATE_RTT
Definition: resource.h:30
#define CTRL_CLOSE_EVENT
Definition: wincon.h:67
static BOOL ResolveTarget(PCWSTR target)
Definition: ping.c:377
__wchar_t WCHAR
Definition: xmlstorage.h:180
struct icmp_echo_reply * PICMP_ECHO_REPLY
Definition: ipexport.h:80
uint16_t * PWSTR
Definition: typedefs.h:54
#define _countof(array)
Definition: fontsub.cpp:30
#define free
Definition: debug_ros.c:5
static ULONG PingCount
Definition: ping.c:64
unsigned short DataSize
Definition: ipexport.h:72
#define IDS_WRONG_FAMILY
Definition: resource.h:12
static ULONG EchosSuccessful
Definition: ping.c:77
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60
#define CTRL_C_EVENT
Definition: wincon.h:65
#define IDS_DEST_NET_UNREACHABLE
Definition: resource.h:25
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
static ULONG RTTMax
Definition: ping.c:72
#define IDS_USAGE
Definition: resource.h:3
struct sockaddr * PSOCKADDR
Definition: winsock.h:485
#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)
#define IDS_PINGING_ADDRESS
Definition: resource.h:14
#define IP_TTL_EXPIRED_TRANSIT
Definition: ipexport.h:115
static BOOL ParseCmdLine(int argc, PWSTR argv[])
Definition: ping.c:168
static HANDLE hIcmpFile
Definition: ping.c:60
USHORT Word[8]
Definition: in6addr.h:6
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
#define IDS_REPLY_STATUS
Definition: resource.h:23
IPAddr Address
Definition: ipexport.h:69
GLenum GLclampf GLint i
Definition: glfuncs.h:14
static ULONG EchosSent
Definition: ping.c:75
#define ConInitStdStreams()
Definition: stream.h:122
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
#define IDS_REPLY_TIME_MS
Definition: resource.h:20
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2111
size_t ai_addrlen
Definition: ws2def.h:680
#define IDS_STATISTICS
Definition: resource.h:29
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 IDS_MISSING_ADDRESS
Definition: resource.h:7
#define AF_INET6
Definition: winsock.h:369
ULONG Status
Definition: ipexport.h:70
void DPRINT(...)
Definition: polytest.cpp:61
static ULONG EchosReceived
Definition: ping.c:76
#define IDS_REPLY_TTL
Definition: resource.h:22
#define AF_UNSPEC
Definition: winsock.h:344
ULONG IPAddr
Definition: pfhook.h:35
HANDLE WINAPI Icmp6CreateFile(VOID)
Definition: icmp.c:114
INT __cdecl ConResPrintf(IN PCON_STREAM Stream, IN UINT uID,...)
Definition: outstream.c:781
#define IDS_DEST_HOST_UNREACHABLE
Definition: resource.h:24
static void PrintStats(void)
Definition: ping.c:639
static ULONG RTTTotal
Definition: ping.c:74
#define IDS_TTL_EXPIRED
Definition: resource.h:27
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
unsigned int BOOL
Definition: ntddk_ex.h:94
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 IDS_CTRL_C
Definition: resource.h:5
#define IDS_UNKNOWN_HOST
Definition: resource.h:13
#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
unsigned char Ttl
Definition: ipexport.h:33
ICMPV6_ECHO_REPLY_LH ICMPV6_ECHO_REPLY
Definition: ipexport.h:173
unsigned char UCHAR
Definition: xmlstorage.h:181
_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
#define IDS_BAD_VALUE
Definition: resource.h:11
ULONG RoundTripTime
Definition: ipexport.h:71
unsigned char Flags
Definition: ipexport.h:35
#define IDS_TRANSMIT_FAILED
Definition: resource.h:28
static IP_OPTION_INFORMATION IpOptions
Definition: ping.c:79
#define IDS_BAD_PARAMETER
Definition: resource.h:10
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
unsigned int RoundTripTime
Definition: ipexport.h:170
#define WINAPI
Definition: msvc.h:20
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)
#define UINT_MAX
Definition: limits.h:41
#define AI_NUMERICHOST
Definition: ws2def.h:295
#define IDS_MISSING_VALUE
Definition: resource.h:8
static ULONG Timeout
Definition: ping.c:61
#define IDS_REPLY_BYTES
Definition: resource.h:19
_CRTIMP wchar_t *__cdecl wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count)
#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
#define UCHAR_MAX
Definition: limits.h:25
BOOL WINAPI IcmpCloseHandle(HANDLE IcmpHandle)
Definition: icmp.c:243
struct sockaddr_in SOCKADDR_IN
Definition: winsock.h:487
int ai_flags
Definition: ws2def.h:676
#define IDS_PINGING_HOSTNAME
Definition: resource.h:15
static BOOL ResolveAddress
Definition: ping.c:70
INT ConPuts(IN PCON_STREAM Stream, IN LPWSTR szStr)
Definition: outstream.c:427
struct sockaddr * ai_addr
Definition: ws2def.h:682
WINSOCK_API_LINKAGE VOID WSAAPI FreeAddrInfoW(_In_opt_ PADDRINFOW pAddrInfo)
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
unsigned int ULONG
Definition: retypes.h:1
#define AF_INET
Definition: tcpip.h:117
HANDLE WINAPI IcmpCreateFile(VOID)
Definition: icmp.c:188
#define IP_SUCCESS
Definition: ticonsts.h:58
#define malloc
Definition: debug_ros.c:4
struct ip_option_information Options
Definition: ipexport.h:75
#define IDS_BAD_OPTION
Definition: resource.h:9
static BOOL PingForever
Definition: ping.c:65
const uint16_t * PCWSTR
Definition: typedefs.h:55
PWSTR ai_canonname
Definition: ws2def.h:681
void exit(int exitcode)
Definition: _exit.c:33
#define IDS_CTRL_BREAK
Definition: resource.h:4
#define IP_DEST_HOST_UNREACHABLE
Definition: ipexport.h:105
#define DEFAULT_TIMEOUT
Definition: ping.c:51
static PCWSTR TargetName
Definition: ping.c:67
short sin_family
Definition: winsock.h:510
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define IDS_WINSOCK_FAIL
Definition: resource.h:31
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