-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWinMTRNet.h
More file actions
114 lines (99 loc) · 3.14 KB
/
Copy pathWinMTRNet.h
File metadata and controls
114 lines (99 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//*****************************************************************************
// FILE: WinMTRNet.h
//
//
// DESCRIPTION:
//
//
// NOTES:
//
//
//*****************************************************************************
#ifndef WINMTRNET_H_
#define WINMTRNET_H_
class WinMTRDialog;
typedef IP_OPTION_INFORMATION IPINFO, *PIPINFO, FAR* LPIPINFO;
#ifdef _WIN64
typedef ICMP_ECHO_REPLY32 ICMPECHO, *PICMPECHO, FAR* LPICMPECHO;
#else
typedef ICMP_ECHO_REPLY ICMPECHO, *PICMPECHO, FAR* LPICMPECHO;
#endif // _WIN64
#define ECHO_REPLY_TIMEOUT 1000
struct s_nethost {
union {
sockaddr_in addr;
sockaddr_in6 addr6;
};
int xmit; // number of PING packets sent
int returned; // number of ICMP echo replies received
unsigned long total; // total time
int last; // last time
int best; // best time
int worst; // worst time
char name[255];
char asn[64];
};
//*****************************************************************************
// CLASS: WinMTRNet
//
//
//*****************************************************************************
class WinMTRNet
{
typedef FARPROC PIO_APC_ROUTINE;//not the best way to do it, but works ;) (we do not use it anyway)
//IPv4
typedef HANDLE(WINAPI* LPFNICMPCREATEFILE)(VOID);
typedef BOOL (WINAPI* LPFNICMPCLOSEHANDLE)(HANDLE);
typedef DWORD (WINAPI* LPFNICMPSENDECHO2)(HANDLE IcmpHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,in_addr DestinationAddress,LPVOID RequestData,WORD RequestSize,PIP_OPTION_INFORMATION RequestOptions,LPVOID ReplyBuffer,DWORD ReplySize,DWORD Timeout);
//IPv6
typedef HANDLE(WINAPI* LPFNICMP6CREATEFILE)(VOID);
typedef BOOL (WINAPI* LPFNICMP6CLOSEHANDLE)(HANDLE);
typedef DWORD (WINAPI* LPFNICMP6SENDECHO2)(HANDLE IcmpHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,sockaddr_in6* SourceAddress,sockaddr_in6* DestinationAddress,LPVOID RequestData,WORD RequestSize,PIP_OPTION_INFORMATION RequestOptions,LPVOID ReplyBuffer,DWORD ReplySize,DWORD Timeout);
public:
WinMTRNet(WinMTRDialog* wp);
~WinMTRNet();
void DoTrace(sockaddr* sockaddr);
void ResetHops();
void StopTrace();
sockaddr* GetAddr(int at);
int GetName(int at, char* n);
int GetASN(int at, char* n);
int GetBest(int at);
int GetWorst(int at);
int GetAvg(int at);
int GetPercent(int at);
int GetLast(int at);
int GetReturned(int at);
int GetXmit(int at);
int GetMax();
void SetAddr(int at, u_long addr);
void SetAddr6(int at, IPV6_ADDRESS_EX addrex);
void SetName(int at, char* n);
void SetASN(int at, const char* n);
void SetErrorName(int at,DWORD errnum);
void UpdateRTT(int at, int rtt);
void AddReturned(int at);
void AddXmit(int at);
WinMTRDialog* wmtrdlg;
union {
in_addr last_remote_addr;
in6_addr last_remote_addr6;
};
bool hasIPv6;
bool tracing;
bool initialized;
HANDLE hICMP;
HANDLE hICMP6;
//IPv4
LPFNICMPCREATEFILE lpfnIcmpCreateFile;
LPFNICMPCLOSEHANDLE lpfnIcmpCloseHandle;
LPFNICMPSENDECHO2 lpfnIcmpSendEcho2;
//IPv6
LPFNICMP6CREATEFILE lpfnIcmp6CreateFile;
LPFNICMP6SENDECHO2 lpfnIcmp6SendEcho2;
private:
HINSTANCE hICMP_DLL;
struct s_nethost host[MaxHost];
HANDLE ghMutex;
};
#endif // ifndef WINMTRNET_H_