From 6832ae589dea7f2ec0a35e326e6438d6d0e8a601 Mon Sep 17 00:00:00 2001 From: angryziber Date: Tue, 24 Jul 2007 21:33:44 +0000 Subject: [PATCH] * WindowsPinger now works * LibraryLoader class introduced: now used by RawSocket and WindowsPinger * JNI libraries are now always loaded from the classpath (or the jar file): lib dirs added to the classpath in eclipse project git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@176 375186e5-ef17-0410-b0b6-91563547dcda --- .classpath | 11 +- .settings/org.eclipse.core.runtime.prefs | 3 +- build.xml | 5 +- ext/rocksaw/lib/tmp.jar | Bin 349 -> 0 bytes .../org/savarese/rocksaw/net/RawSocket.java | 45 +------- ext/winping/jni/WindowsPinger.c | 93 ---------------- ext/winping/lib/winping.dll | Bin 0 -> 24064 bytes ext/winping/{jni => src}/Makefile | 13 ++- ext/winping/src/WindowsPinger.c | 103 ++++++++++++++++++ ext/winping/{jni => src}/WindowsPinger.h | 9 ++ resources/Labels.txt | 1 + src/net/azib/ipscan/core/LibraryLoader.java | 64 +++++++++++ src/net/azib/ipscan/core/net/ICMPPinger.java | 2 +- .../ipscan/core/net/PingerRegistryImpl.java | 7 +- .../azib/ipscan/core/net/WindowsPinger.java | 43 ++++++-- 15 files changed, 242 insertions(+), 157 deletions(-) delete mode 100755 ext/rocksaw/lib/tmp.jar delete mode 100755 ext/winping/jni/WindowsPinger.c create mode 100644 ext/winping/lib/winping.dll rename ext/winping/{jni => src}/Makefile (65%) create mode 100755 ext/winping/src/WindowsPinger.c rename ext/winping/{jni => src}/WindowsPinger.h (82%) create mode 100644 src/net/azib/ipscan/core/LibraryLoader.java diff --git a/.classpath b/.classpath index 72e90083..184317e4 100755 --- a/.classpath +++ b/.classpath @@ -5,17 +5,14 @@ + + - - - - - - - + + diff --git a/.settings/org.eclipse.core.runtime.prefs b/.settings/org.eclipse.core.runtime.prefs index d321418f..03c92a61 100644 --- a/.settings/org.eclipse.core.runtime.prefs +++ b/.settings/org.eclipse.core.runtime.prefs @@ -1,3 +1,4 @@ -#Thu Jan 04 10:25:32 EET 2007 +#Tue Jul 24 22:19:33 EEST 2007 eclipse.preferences.version=1 +instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true line.separator=\n diff --git a/build.xml b/build.xml index 97dab312..21eca2be 100755 --- a/build.xml +++ b/build.xml @@ -125,7 +125,8 @@ - + + @@ -198,7 +199,7 @@ - + diff --git a/ext/rocksaw/lib/tmp.jar b/ext/rocksaw/lib/tmp.jar deleted file mode 100755 index a21876420c616e80608f67f9a9fe7e780c9ca024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmWIWW@h1H00H0f+eTmpl;C7wVeoYgan$wnbJPEKih&^jt~7S1uJJBEpFVG(QVA@my#HC~R2S PKzf*funS1<1#uVvFx^C7 diff --git a/ext/rocksaw/src/java/org/savarese/rocksaw/net/RawSocket.java b/ext/rocksaw/src/java/org/savarese/rocksaw/net/RawSocket.java index 7da14268..3c57ed05 100755 --- a/ext/rocksaw/src/java/org/savarese/rocksaw/net/RawSocket.java +++ b/ext/rocksaw/src/java/org/savarese/rocksaw/net/RawSocket.java @@ -19,14 +19,13 @@ package org.savarese.rocksaw.net; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InterruptedIOException; -import java.io.OutputStream; import java.net.InetAddress; import java.net.SocketException; +import net.azib.ipscan.core.LibraryLoader; + /** *

The RawSocket class provides a strictly utilitarian API for * performing I/O with raw sockets. The API is currently crude, but @@ -79,8 +78,8 @@ public class RawSocket { native static void __RockSawShutdown(); static { - // modified to reuse SWT's loading of jni libs from jar file - loadLibrary("rocksaw"); + // modified to load jni libs from jar file + LibraryLoader.loadLibrary("rocksaw"); if(__RockSawStartup() != 0) throw new UnsatisfiedLinkError(__getErrorMessage()); @@ -151,41 +150,7 @@ public class RawSocket { setUseSelectTimeout(false); } - - private static void loadLibrary(String library) { - String filename = System.mapLibraryName(library); - String fullFilename = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + filename; - try { - System.load(fullFilename); - } - catch (UnsatisfiedLinkError e) { - try { - // try to extract - InputStream is = RawSocket.class.getClassLoader().getResourceAsStream(filename); - byte[] buffer = new byte[4096]; - OutputStream os = new FileOutputStream(fullFilename); - int read; - while ((read = is.read(buffer)) != -1) { - os.write(buffer, 0, read); - } - os.close(); - is.close(); - if (!net.azib.ipscan.config.Platform.WINDOWS) { - // TODO: change this to new File(fullFilename).setExecutable(true) in case of Java 1.6 - try { - Runtime.getRuntime ().exec (new String []{"chmod", "755", fullFilename}).waitFor(); - } catch (Throwable t) {} - } - System.load(fullFilename); - } - catch (IOException ioe) { - throw new RuntimeException("Unable to extract native library: " + library, ioe); - } - } - - } - -/** + /** * Tests if the socket has been opened. * * @return True if the socket is open. diff --git a/ext/winping/jni/WindowsPinger.c b/ext/winping/jni/WindowsPinger.c deleted file mode 100755 index 80f7eaea..00000000 --- a/ext/winping/jni/WindowsPinger.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2007 Anton Keks - */ - -#include - -#include "WindowsPinger.h" - -FARPROC IcmpCreateFile; - -typedef BOOL (FAR WINAPI *TIcmpCloseHandle)(HANDLE IcmpHandle); -TIcmpCloseHandle IcmpCloseHandle; - -typedef DWORD (FAR WINAPI *TIcmpSendEcho)( - HANDLE IcmpHandle, /* handle returned from IcmpCreateFile() */ - u_long DestAddress, /* destination IP address (in network order) */ - LPVOID RequestData, /* pointer to buffer to send */ - WORD RequestSize, /* length of data in buffer */ - LPIPINFO RequestOptns, /* see Note 2 */ - LPVOID ReplyBuffer, /* see Note 1 */ - DWORD ReplySize, /* length of reply (must allow at least 1 reply) */ - DWORD Timeout /* time in milliseconds to wait for reply */ -); -TIcmpSendEcho IcmpSendEcho; - -/* - * Class: net_azib_ipscan_core_net_WindowsPinger - * Method: nativeIcmpCreateFile - */ -JNIEXPORT jint JNICALL -Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpCreateFile -(JNIEnv *env, jclass cls) -{ - HMODULE hICMP = LoadLibrary("icmp.dll"); - if (!hICMP) { - // newer versions of Windows should include this one instead - hICMP = LoadLibrary("iphlpapi.dll"); - } - if (!hICMP) { - return -1; - } - IcmpCreateFile = (FARPROC)GetProcAddress(hICMP, "IcmpCreateFile"); - IcmpCloseHandle = (TIcmpCloseHandle)GetProcAddress(hICMP, "IcmpCloseHandle"); - IcmpSendEcho = (TIcmpSendEcho)GetProcAddress(hICMP, "IcmpSendEcho"); - - return IcmpCreateFile(); -} - -/* - * Class: net_azib_ipscan_core_net_WindowsPinger - * Method: nativeIcmpCloseHandle - */ -JNIEXPORT jint JNICALL -Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpCloseHandle -(JNIEnv *env, jclass cls, jint handle) -{ - return IcmpCloseHandle(handle); -} - -/* - * Class: net_azib_ipscan_core_net_WindowsPinger - * Method: nativeIcmpSendEcho - */ -JNIEXPORT jint JNICALL -Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpSendEcho -(JNIEnv *env, jclass cls, jint handle, - jbyteArray address, jbyteArray pingData, jbyteArray replyData, jint timeout) -{ - DWORD replyCount; - IPINFO IPInfo; - jbyte *addrBuf, *pingDataBuf, replyDataBuf; - jclass replyClass; - jfieldID fid; - - IPInfo.Ttl = 128; - IPInfo.Tos = 0; - IPInfo.Flags = 0; - IPInfo.OptionsSize = 0; - IPInfo.OptionsData = NULL; - - addrBuf = env->GetByteArrayElements(env, address, NULL); - pingDataBuf = env->GetByteArrayElements(env, pingData, NULL); - replyDataBuf = env->GetByteArrayElements(env, replyData, NULL); - - replyCount = IcmpSendEcho(handle, (DWORD)*addrBuf, pingDataBuf, env->GetArrayLength(pingData) * sizeof(jbyte), - &IPInfo, replyDataBuf, env->GetArrayLength(replyData), timeout); - - env->ReleaseByteArrayElements(env, address, addrBuf, JNI_ABORT); - env->ReleaseByteArrayElements(env, pingData, pingDataBuf, JNI_ABORT); - env->ReleaseByteArrayElements(env, replyData, replyDataBuf, NULL); - - return replyCount; -} diff --git a/ext/winping/lib/winping.dll b/ext/winping/lib/winping.dll new file mode 100644 index 0000000000000000000000000000000000000000..0ecd2c5781ee8db98925b586a335ed63caf6f707 GIT binary patch literal 24064 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 + +#include "WindowsPinger.h" + + +FARPROC IcmpCreateFile = NULL; + +typedef BOOL (FAR WINAPI *TIcmpCloseHandle)(HANDLE IcmpHandle); +TIcmpCloseHandle IcmpCloseHandle = NULL; + +typedef DWORD (FAR WINAPI *TIcmpSendEcho)( + HANDLE IcmpHandle, /* handle returned from IcmpCreateFile() */ + u_long DestAddress, /* destination IP address (in network order) */ + LPVOID RequestData, /* pointer to buffer to send */ + WORD RequestSize, /* length of data in buffer */ + LPVOID RequestOptns, /* see Note 2 */ + LPVOID ReplyBuffer, /* see Note 1 */ + DWORD ReplySize, /* length of reply (must allow at least 1 reply) */ + DWORD Timeout /* time in milliseconds to wait for reply */ +); +TIcmpSendEcho IcmpSendEcho = NULL; + +/* + * Class: net_azib_ipscan_core_net_WindowsPinger + * Method: nativeIcmpCreateFile + */ +JNIEXPORT jint JNICALL +Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpCreateFile +(JNIEnv *env, jclass cls) +{ + // Initialize dlls on first use + if (IcmpCreateFile == NULL) { + HMODULE hICMP = LoadLibrary("icmp.dll"); + if (!hICMP) { + // newer versions of Windows should include this one instead + hICMP = LoadLibrary("iphlpapi.dll"); + } + + if (!hICMP) { + return -1; + } + + IcmpCreateFile = (FARPROC) GetProcAddress(hICMP, "IcmpCreateFile"); + IcmpCloseHandle = (TIcmpCloseHandle) GetProcAddress(hICMP, "IcmpCloseHandle"); + IcmpSendEcho = (TIcmpSendEcho) GetProcAddress(hICMP, "IcmpSendEcho"); + } + + return IcmpCreateFile(); +} + +/* + * Class: net_azib_ipscan_core_net_WindowsPinger + * Method: nativeIcmpCloseHandle + */ +JNIEXPORT void JNICALL +Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpCloseHandle +(JNIEnv *env, jclass cls, jint handle) +{ + return IcmpCloseHandle((HANDLE)handle); +} + +/* + * Class: net_azib_ipscan_core_net_WindowsPinger + * Method: nativeIcmpSendEcho + */ + +JNIEXPORT jint JNICALL +Java_net_azib_ipscan_core_net_WindowsPinger_nativeIcmpSendEcho +(JNIEnv *env, jclass cls, jint handle, jbyteArray address, jbyteArray pingData, jbyteArray replyData, jint timeout) +{ + DWORD replyCount; + jbyte *addrBuf, *pingDataBuf, *replyDataBuf; + jint pingDataLen, replyDataLen; + jclass replyClass; + jfieldID fid; + u_long ip; + + addrBuf = (*env)->GetByteArrayElements(env, address, NULL); + pingDataBuf = (*env)->GetByteArrayElements(env, pingData, NULL); + replyDataBuf = (*env)->GetByteArrayElements(env, replyData, NULL); + + pingDataLen = (*env)->GetArrayLength(env, pingData); + replyDataLen = (*env)->GetArrayLength(env, replyData); + + ip = *((u_long*)addrBuf); + replyCount = IcmpSendEcho((HANDLE)handle, ip, pingDataBuf, pingDataLen, + NULL, replyDataBuf, replyDataLen, timeout); + + (*env)->ReleaseByteArrayElements(env, address, addrBuf, JNI_ABORT); + (*env)->ReleaseByteArrayElements(env, pingData, pingDataBuf, JNI_ABORT); + (*env)->ReleaseByteArrayElements(env, replyData, replyDataBuf, 0); + + return replyCount; +} diff --git a/ext/winping/jni/WindowsPinger.h b/ext/winping/src/WindowsPinger.h similarity index 82% rename from ext/winping/jni/WindowsPinger.h rename to ext/winping/src/WindowsPinger.h index a920f8af..6925c333 100644 --- a/ext/winping/jni/WindowsPinger.h +++ b/ext/winping/src/WindowsPinger.h @@ -1,3 +1,12 @@ +/* + * This file is a part of Angry IP Scanner source code, + * see http://www.azib.net/ for more information. + * Licensed under GPLv2. + * + * Windows JNI pinger using Microsoft's ICMP.DLL + * Author: Anton Keks + */ + #include /* Header for class net_azib_ipscan_core_net_WindowsPinger */ diff --git a/resources/Labels.txt b/resources/Labels.txt index 64db1133..b7ac351d 100755 --- a/resources/Labels.txt +++ b/resources/Labels.txt @@ -134,6 +134,7 @@ list.alive.img=images/list/alive.png list.addinfo.img=images/list/addinfo.png pinger.icmp=ICMP Echo pinger.icmp2=ICMP Echo (Alternative) +pinger.windows=Windows ICMP.DLL pinger.udp=UDP packet pinger.tcp=TCP port probe opener.web=Web Browser diff --git a/src/net/azib/ipscan/core/LibraryLoader.java b/src/net/azib/ipscan/core/LibraryLoader.java new file mode 100644 index 00000000..ae9e72e9 --- /dev/null +++ b/src/net/azib/ipscan/core/LibraryLoader.java @@ -0,0 +1,64 @@ +/** + * This file is a part of Angry IP Scanner source code, + * see http://www.azib.net/ for more information. + * Licensed under GPLv2. + */ + +package net.azib.ipscan.core; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Utility class for loading of JNI libraries from jar files. + * + * @author Anton Keks + */ +public class LibraryLoader { + + /** + * Loads native library from the jar file (storing it in the temp dir) + * @param library JNI library name + */ + public static void loadLibrary(String library) { + String filename = System.mapLibraryName(library); + String fullFilename = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + filename; + try { + // try to load from the temp dir (in case it is already there) + System.load(fullFilename); + } + catch (UnsatisfiedLinkError err2) { + try { + // try to extract from the jar + InputStream is = LibraryLoader.class.getClassLoader().getResourceAsStream(filename); + if (is == null) { + throw new IOException(filename + " not found in the jar file (classpath)"); + } + byte[] buffer = new byte[4096]; + OutputStream os = new FileOutputStream(fullFilename); + int read; + while ((read = is.read(buffer)) != -1) { + os.write(buffer, 0, read); + } + os.close(); + is.close(); + if (!net.azib.ipscan.config.Platform.WINDOWS) { + // TODO: change this to new File(fullFilename).setExecutable(true) in case of + // Java 1.6 + try { + Runtime.getRuntime().exec(new String[] { "chmod", "755", fullFilename }).waitFor(); + } + catch (Throwable t) { + } + } + System.load(fullFilename); + } + catch (IOException ioe) { + throw new RuntimeException("Unable to extract native library: " + library, ioe); + } + } + } + +} diff --git a/src/net/azib/ipscan/core/net/ICMPPinger.java b/src/net/azib/ipscan/core/net/ICMPPinger.java index 6e73718d..54cbccc6 100644 --- a/src/net/azib/ipscan/core/net/ICMPPinger.java +++ b/src/net/azib/ipscan/core/net/ICMPPinger.java @@ -25,7 +25,7 @@ import org.savarese.vserv.tcpip.OctetConverter; */ public class ICMPPinger implements Pinger { - static final Logger LOG = Logger.getLogger(ICMPPinger.class.getName()); + private static final Logger LOG = Logger.getLogger(ICMPPinger.class.getName()); private int timeout; diff --git a/src/net/azib/ipscan/core/net/PingerRegistryImpl.java b/src/net/azib/ipscan/core/net/PingerRegistryImpl.java index 02dee4c0..09dc6494 100755 --- a/src/net/azib/ipscan/core/net/PingerRegistryImpl.java +++ b/src/net/azib/ipscan/core/net/PingerRegistryImpl.java @@ -14,12 +14,13 @@ import java.util.logging.Level; import java.util.logging.Logger; import net.azib.ipscan.config.GlobalConfig; +import net.azib.ipscan.config.Platform; import net.azib.ipscan.fetchers.FetcherException; /** * PingerRegistryImpl * - * @author Anton Keks Keks + * @author Anton Keks */ public class PingerRegistryImpl implements PingerRegistry { @@ -34,6 +35,10 @@ public class PingerRegistryImpl implements PingerRegistry { this.globalConfig = globalConfig; pingers = new LinkedHashMap>(); + if (Platform.WINDOWS) { + // this will be the preferred choice for Windows users + pingers.put("pinger.windows", WindowsPinger.class); + } pingers.put("pinger.icmp", ICMPSharedPinger.class); pingers.put("pinger.icmp2", ICMPPinger.class); pingers.put("pinger.udp", UDPPinger.class); diff --git a/src/net/azib/ipscan/core/net/WindowsPinger.java b/src/net/azib/ipscan/core/net/WindowsPinger.java index d2de107a..09eb0d2e 100644 --- a/src/net/azib/ipscan/core/net/WindowsPinger.java +++ b/src/net/azib/ipscan/core/net/WindowsPinger.java @@ -8,10 +8,13 @@ package net.azib.ipscan.core.net; import java.io.IOException; import java.net.InetAddress; +import net.azib.ipscan.core.LibraryLoader; + /** * Windows-only pinger that uses Microsoft's ICMP.DLL for its job. + *

* This pinger exists to provide adequate pinging to Windows users, - * because Microsoft has removed raw socket support from consumer + * because Microsoft has removed Raw Socket support from consumer * versions of Windows since XP SP2. * * @author Anton Keks @@ -19,12 +22,13 @@ import java.net.InetAddress; public class WindowsPinger implements Pinger { private int timeout; + private boolean libraryLoaded; public WindowsPinger(int timeout) { this.timeout = timeout; - } - - public void close() throws IOException { + if (!libraryLoaded) { + LibraryLoader.loadLibrary("winping"); + } } public PingResult ping(InetAddress address, int count) throws IOException { @@ -34,15 +38,22 @@ public class WindowsPinger implements Pinger { byte[] replyData = new byte[56 + 100]; int handle = nativeIcmpCreateFile(); + if (handle < 0) { + throw new IOException("Unable to create Windows native ICMP handle"); + } + try { // send a bunch of packets for (int i = 1; i <= count; i++) { if (nativeIcmpSendEcho(handle, address.getAddress(), pingData, replyData, timeout) > 0) { - /*if (replyData.status == 11000) { - result.addReply(replyData.roundTripTime); - result.setTTL(replyData.ttl); - }*/ + int status = replyData[4] + (replyData[5]<<8) + (replyData[6]<<16) + (replyData[7]<<24); + if (status == 0) { + int roundTripTime = replyData[8] + (replyData[9]<<8) + (replyData[10]<<16) + (replyData[11]<<24); + int timeToLive = replyData[20] & 0xFF; + result.addReply(roundTripTime); + result.setTTL(timeToLive); + } } } } @@ -53,9 +64,25 @@ public class WindowsPinger implements Pinger { return result; } + /** + * Wrapper for Microsoft's + * {@linkplain http://msdn2.microsoft.com/en-US/library/aa366045.aspx IcmpCreateFile} + */ private native static int nativeIcmpCreateFile(); + /** + * Wrapper for Microsoft's + * {@linkplain http://msdn2.microsoft.com/EN-US/library/aa366050.aspx IcmpSendEcho} + */ private native static int nativeIcmpSendEcho(int handle, byte[] address, byte[] pingData, byte[] replyData, int timeout); + /** + * Wrapper for Microsoft's IcmpCreateFile: + * {@linkplain http://msdn2.microsoft.com/en-us/library/Aa366043.aspx IcmpCloseHandle} + */ private native static void nativeIcmpCloseHandle(int handle); + + public void close() throws IOException { + // not needed in this pinger + } }