summaryrefslogtreecommitdiff
path: root/ping/icmp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ping/icmp.cpp')
-rw-r--r--ping/icmp.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/ping/icmp.cpp b/ping/icmp.cpp
new file mode 100644
index 0000000..356cc34
--- /dev/null
+++ b/ping/icmp.cpp
@@ -0,0 +1,89 @@
+#include "common.h"
+#include "icmp.h"
+
+ICMP ICMP::instance;
+
+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;
+ }
+
+ WSAData wsaData;
+ if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
+ WSACleanup();
+ FreeLibrary((HMODULE)hDLL);
+ return;
+ }
+
+ hIP = pIcmpCreateFile();
+ if (hIP == INVALID_HANDLE_VALUE) {
+ pIcmpCloseHandle(hIP);
+ return;
+ }
+
+ functions_loaded = true;
+}
+
+void ICMP::stop() {
+ if(hIP) {
+ pIcmpCloseHandle(hIP);
+ hIP = 0;
+ }
+}
+
+ICMP::~ICMP() {
+ if(hIP) pIcmpCloseHandle(hIP);
+ WSACleanup();
+ if(hDLL)
+ FreeLibrary(hDLL);
+}
+
+bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) {
+ if(!functions_loaded) return false;
+
+ DWORD address;
+ struct in_addr dest;
+ 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) {
+ rec = gethostbyname(host);
+ if(rec) address = *(DWORD *)(*rec->h_addr_list);
+ else return false;
+ } else {
+ address = dest.s_addr;
+ }
+
+ ipoi.Ttl = 255;
+ ipoi.Tos = 0;
+ ipoi.Flags = 0;
+ ipoi.OptionsSize = 0;
+ ipoi.OptionsData = 0;
+
+ reply.Status = 0;
+
+ pIcmpSendEcho(hIP, address, (void *)"PINGPONG", 8, &ipoi, &reply, sizeof(reply), timeout);
+
+ if(hIP) {
+ pIcmpCloseHandle(hIP);
+ hIP = 0;
+ }
+
+ return (reply.Status == 0);
+} \ No newline at end of file