diff --git a/pom.xml b/pom.xml
index d6e4b32..ad8ffdd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,16 +56,16 @@
deploy
true
-
- deploy.bat
- package.bat
- clean.bat
-
-
-
-
-
-
+
+
+
+
+
+
+ deploy.bat
+ package.bat
+ clean.bat
+
diff --git a/src/main/java/org/parabot/Landing.java b/src/main/java/org/parabot/Landing.java
index 346c1ac..33668d8 100644
--- a/src/main/java/org/parabot/Landing.java
+++ b/src/main/java/org/parabot/Landing.java
@@ -1,6 +1,5 @@
package org.parabot;
-import com.sun.deploy.util.WinRegistry;
import org.parabot.core.Configuration;
import org.parabot.core.Core;
import org.parabot.core.Directories;
@@ -31,13 +30,10 @@ public final class Landing {
private static void removeKeys(){
try{
- boolean value = WinRegistry.deleteKey(
+ WinRegistry.deleteKey(
WinRegistry.HKEY_CURRENT_USER,
"Software\\JavaSoft\\Prefs"
);
- if (value) {
- System.err.println("Ikov key removed");
- }
}catch (Exception ignored){
}
diff --git a/src/main/java/org/parabot/WinRegistry.java b/src/main/java/org/parabot/WinRegistry.java
new file mode 100644
index 0000000..50091cd
--- /dev/null
+++ b/src/main/java/org/parabot/WinRegistry.java
@@ -0,0 +1,390 @@
+package org.parabot;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.prefs.Preferences;
+
+public class WinRegistry {
+ public static final int HKEY_CURRENT_USER = 0x80000001;
+ public static final int HKEY_LOCAL_MACHINE = 0x80000002;
+ public static final int REG_SUCCESS = 0;
+ public static final int REG_NOTFOUND = 2;
+ public static final int REG_ACCESSDENIED = 5;
+
+ private static final int KEY_ALL_ACCESS = 0xf003f;
+ private static final int KEY_READ = 0x20019;
+ private static Preferences userRoot = Preferences.userRoot();
+ private static Preferences systemRoot = Preferences.systemRoot();
+ private static Class extends Preferences> userClass = userRoot.getClass();
+ private static Method regOpenKey = null;
+ private static Method regCloseKey = null;
+ private static Method regQueryValueEx = null;
+ private static Method regEnumValue = null;
+ private static Method regQueryInfoKey = null;
+ private static Method regEnumKeyEx = null;
+ private static Method regCreateKeyEx = null;
+ private static Method regSetValueEx = null;
+ private static Method regDeleteKey = null;
+ private static Method regDeleteValue = null;
+
+ static {
+ try {
+ regOpenKey = userClass.getDeclaredMethod("WindowsRegOpenKey",
+ new Class[] { int.class, byte[].class, int.class });
+ regOpenKey.setAccessible(true);
+ regCloseKey = userClass.getDeclaredMethod("WindowsRegCloseKey",
+ new Class[] { int.class });
+ regCloseKey.setAccessible(true);
+ regQueryValueEx = userClass.getDeclaredMethod("WindowsRegQueryValueEx",
+ new Class[] { int.class, byte[].class });
+ regQueryValueEx.setAccessible(true);
+ regEnumValue = userClass.getDeclaredMethod("WindowsRegEnumValue",
+ new Class[] { int.class, int.class, int.class });
+ regEnumValue.setAccessible(true);
+ regQueryInfoKey = userClass.getDeclaredMethod("WindowsRegQueryInfoKey1",
+ new Class[] { int.class });
+ regQueryInfoKey.setAccessible(true);
+ regEnumKeyEx = userClass.getDeclaredMethod(
+ "WindowsRegEnumKeyEx", new Class[] { int.class, int.class,
+ int.class });
+ regEnumKeyEx.setAccessible(true);
+ regCreateKeyEx = userClass.getDeclaredMethod(
+ "WindowsRegCreateKeyEx", new Class[] { int.class,
+ byte[].class });
+ regCreateKeyEx.setAccessible(true);
+ regSetValueEx = userClass.getDeclaredMethod(
+ "WindowsRegSetValueEx", new Class[] { int.class,
+ byte[].class, byte[].class });
+ regSetValueEx.setAccessible(true);
+ regDeleteValue = userClass.getDeclaredMethod(
+ "WindowsRegDeleteValue", new Class[] { int.class,
+ byte[].class });
+ regDeleteValue.setAccessible(true);
+ regDeleteKey = userClass.getDeclaredMethod(
+ "WindowsRegDeleteKey", new Class[] { int.class,
+ byte[].class });
+ regDeleteKey.setAccessible(true);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private WinRegistry() { }
+
+ /**
+ * Read a value from key and value name
+ * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @param valueName
+ * @return the value
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static String readString(int hkey, String key, String valueName)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readString(systemRoot, hkey, key, valueName);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ return readString(userRoot, hkey, key, valueName);
+ }
+ else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Read value(s) and value name(s) form given key
+ * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @return the value name(s) plus the value(s)
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static Map readStringValues(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readStringValues(systemRoot, hkey, key);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ return readStringValues(userRoot, hkey, key);
+ }
+ else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Read the value name(s) from a given key
+ * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @return the value name(s)
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static List readStringSubKeys(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readStringSubKeys(systemRoot, hkey, key);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ return readStringSubKeys(userRoot, hkey, key);
+ }
+ else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Create a key
+ * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static void createKey(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int [] ret;
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ ret = createKey(systemRoot, hkey, key);
+ regCloseKey.invoke(systemRoot, new Object[] { new Integer(ret[0]) });
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ ret = createKey(userRoot, hkey, key);
+ regCloseKey.invoke(userRoot, new Object[] { new Integer(ret[0]) });
+ }
+ else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ if (ret[1] != REG_SUCCESS) {
+ throw new IllegalArgumentException("rc=" + ret[1] + " key=" + key);
+ }
+ }
+
+ /**
+ * Write a value in a given key/value name
+ * @param hkey
+ * @param key
+ * @param valueName
+ * @param value
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static void writeStringValue
+ (int hkey, String key, String valueName, String value)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ writeStringValue(systemRoot, hkey, key, valueName, value);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ writeStringValue(userRoot, hkey, key, valueName, value);
+ }
+ else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Delete a given key
+ * @param hkey
+ * @param key
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static void deleteKey(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int rc = -1;
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ rc = deleteKey(systemRoot, hkey, key);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ rc = deleteKey(userRoot, hkey, key);
+ }
+ if (rc != REG_SUCCESS) {
+ throw new IllegalArgumentException("rc=" + rc + " key=" + key);
+ }
+ }
+
+ /**
+ * delete a value from a given key/value name
+ * @param hkey
+ * @param key
+ * @param value
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static void deleteValue(int hkey, String key, String value)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int rc = -1;
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ rc = deleteValue(systemRoot, hkey, key, value);
+ }
+ else if (hkey == HKEY_CURRENT_USER) {
+ rc = deleteValue(userRoot, hkey, key, value);
+ }
+ if (rc != REG_SUCCESS) {
+ throw new IllegalArgumentException("rc=" + rc + " key=" + key + " value=" + value);
+ }
+ }
+
+ // =====================
+
+ private static int deleteValue
+ (Preferences root, int hkey, String key, String value)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) });
+ if (handles[1] != REG_SUCCESS) {
+ return handles[1]; // can be REG_NOTFOUND, REG_ACCESSDENIED
+ }
+ int rc =((Integer) regDeleteValue.invoke(root,
+ new Object[] {
+ new Integer(handles[0]), toCstr(value)
+ })).intValue();
+ regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+ return rc;
+ }
+
+ private static int deleteKey(Preferences root, int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int rc =((Integer) regDeleteKey.invoke(root,
+ new Object[] { new Integer(hkey), toCstr(key) })).intValue();
+ return rc; // can REG_NOTFOUND, REG_ACCESSDENIED, REG_SUCCESS
+ }
+
+ private static String readString(Preferences root, int hkey, String key, String value)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] {
+ new Integer(handles[0]), toCstr(value) });
+ regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+ return (valb != null ? new String(valb).trim() : null);
+ }
+
+ private static Map readStringValues
+ (Preferences root, int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ HashMap results = new HashMap();
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ int[] info = (int[]) regQueryInfoKey.invoke(root,
+ new Object[] { new Integer(handles[0]) });
+
+ // int count = info[2]; // count
+ int count = info[0]; // bug fix 20130112
+ int maxlen = info[3]; // value length max
+ for(int index=0; index readStringSubKeys
+ (Preferences root, int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException
+ {
+ List results = new ArrayList();
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ)
+ });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ int[] info = (int[]) regQueryInfoKey.invoke(root,
+ new Object[] { new Integer(handles[0]) });
+
+ // int count = info[2]; // count
+ int count = info[0]; // bug fix 20130112
+ int maxlen = info[3]; // value length max
+ for(int index=0; index