summaryrefslogtreecommitdiff
path: root/ping/icmp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ping/icmp.cpp')
-rw-r--r--ping/icmp.cpp76
1 files changed, 47 insertions, 29 deletions
diff --git a/ping/icmp.cpp b/ping/icmp.cpp
index 356cc34..4dab823 100644
--- a/ping/icmp.cpp
+++ b/ping/icmp.cpp
@@ -1,21 +1,33 @@
#include "common.h"
#include "icmp.h"
-ICMP ICMP::instance;
+char data[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGGHHH";
+#define EXTRA (12)
+ICMP *ICMP::instance = 0;
ICMP::ICMP():
timeout(2000),
functions_loaded(false)
{
- hDLL = LoadLibrary("ICMP.DLL");
- if(!hDLL) return;
-
- pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile");
- pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle");
- pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho");
- if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0)) {
- return;
+ hDLL = LoadLibrary("IPHLPAPI.DLL");
+ if(hDLL) {
+ pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile");
+ pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle");
+ pIcmpSendEcho2 = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho2");
}
+ if (hDLL == 0 || pIcmpCreateFile == 0 || pIcmpCloseHandle == 0 || pIcmpSendEcho2 == 0) {
+ hDLL = LoadLibrary("ICMP.DLL");
+ if(hDLL) {
+ pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile");
+ pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle");
+ pIcmpSendEcho2 = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho2");
+ }
+ if (hDLL == 0 || pIcmpCreateFile == 0 || pIcmpCloseHandle == 0 || pIcmpSendEcho2 == 0)
+ return;
+ else
+ DBWriteContactSettingString(0, PLUG, "PingLib", "ICMP.DLL"); // for debugging
+ } else
+ DBWriteContactSettingString(0, PLUG, "PingLib", "IPHLPAPI.DLL"); // for debugging
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
@@ -30,6 +42,7 @@ ICMP::ICMP():
return;
}
+ buff = new char[sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA];
functions_loaded = true;
}
@@ -41,33 +54,25 @@ void ICMP::stop() {
}
ICMP::~ICMP() {
- if(hIP) pIcmpCloseHandle(hIP);
+ if(hIP) stop();
WSACleanup();
if(hDLL)
FreeLibrary(hDLL);
+ delete[] buff;
}
-bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) {
+bool ICMP::ping(char *host, ICMP_ECHO_REPLY &reply) {
if(!functions_loaded) return false;
- DWORD address;
- struct in_addr dest;
+ unsigned long address;
HOSTENT *rec;
IP_OPTION_INFORMATION ipoi;
- hIP = pIcmpCreateFile();
- if (hIP == INVALID_HANDLE_VALUE) {
- return false;
- }
-
-
- dest.s_addr = inet_addr(host);
- if (dest.s_addr == INADDR_NONE) {
+ address = inet_addr(host);
+ if (address == INADDR_NONE) {
rec = gethostbyname(host);
- if(rec) address = *(DWORD *)(*rec->h_addr_list);
+ if(rec) address = *(unsigned long *)(*rec->h_addr_list);
else return false;
- } else {
- address = dest.s_addr;
}
ipoi.Ttl = 255;
@@ -78,12 +83,25 @@ bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) {
reply.Status = 0;
- pIcmpSendEcho(hIP, address, (void *)"PINGPONG", 8, &ipoi, &reply, sizeof(reply), timeout);
-
- if(hIP) {
- pIcmpCloseHandle(hIP);
- hIP = 0;
+ //pIcmpSendEcho2(hIP, 0, 0, 0, address, data, sizeof(data), &ipoi, buff, sizeof(ICMP_ECHO_REPLY) + sizeof(data), timeout);
+ if(pIcmpSendEcho2(hIP, 0, 0, 0, address, data, sizeof(data), 0, buff, sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA, timeout) == 0) {
+ char winmsg[512], msg[1024];
+ FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, winmsg, 512, 0);
+ mir_snprintf(msg, 1024, "Ping error: %s\nICMP_ECHO_REPLY: %d\ndata: %d\ngiven: %d", winmsg, sizeof(ICMP_ECHO_REPLY), sizeof(data), sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA);
+ PUShowMessage(msg, SM_NOTIFY);
+ return false;
}
+ memcpy(&reply, buff, sizeof(ICMP_ECHO_REPLY));
return (reply.Status == 0);
+}
+
+ICMP *ICMP::get_instance() {
+ if(!instance)
+ instance = new ICMP();
+ return instance;
+}
+
+void ICMP::cleanup() {
+ if(instance) delete instance;
} \ No newline at end of file