< prev index next >
src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsRegistry.java
Print this page
@@ -36,115 +36,101 @@
import static jdk.jpackage.internal.IOUtils.exec;
final class WindowsRegistry {
+ // Currently we only support HKEY_LOCAL_MACHINE. Native implementation will
+ // require support for additinal HKEY if needed.
+ private static final int HKEY_LOCAL_MACHINE = 1;
+
+ static {
+ System.loadLibrary("jpackage");
+ }
+
private WindowsRegistry() {}
/**
* Reads the registry value for DisableRealtimeMonitoring.
* @return true if DisableRealtimeMonitoring is set to 0x1,
* false otherwise.
*/
static final boolean readDisableRealtimeMonitoring() {
- boolean result = false;
- final String key = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\"
+ final String subKey = "Software\\Microsoft\\"
+ "Windows Defender\\Real-Time Protection";
- final String subkey = "DisableRealtimeMonitoring";
- String value = readRegistry(key, subkey);
-
- if (!value.isEmpty()) {
- // This code could be written better but this works. It validates
- // that the result of readRegistry returned what we expect and then
- // checks for a 0x0 or 0x1. 0x0 means real time monitoring is
- // on, 0x1 means it is off. So this function returns true if
- // real-time-monitoring is disabled.
- int index = value.indexOf(subkey);
- value = value.substring(index + subkey.length());
- String reg = "REG_DWORD";
- index = value.indexOf(reg);
- value = value.substring(index + reg.length());
- String hex = "0x";
- index = value.indexOf(hex);
- value = value.substring(index + hex.length());
-
- if (value.equals("1")) {
- result = true;
- }
- }
-
- return result;
+ final String value = "DisableRealtimeMonitoring";
+ int result = readDwordValue(HKEY_LOCAL_MACHINE, subKey, value, 0);
+ return (result == 1);
}
static final List<String> readExclusionsPaths() {
- List<String> result = new ArrayList<String>();
- final String key = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\"
+ List<String> result = new ArrayList<>();
+ final String subKey = "Software\\Microsoft\\"
+ "Windows Defender\\Exclusions\\Paths";
- String value = readRegistry(key, "");
-
- if (!value.isEmpty()) {
- final String reg = "REG_DWORD";
- final String hex = "0x0";
-
- int index = value.indexOf(key);
- if (index == 0) {
- value = value.substring(index + key.length());
-
- while (value.length() > 0) {
- index = value.indexOf(reg);
- String name = value.substring(0, index);
- value = value.substring(index + reg.length());
- index = value.indexOf(hex);
- value = value.substring(index + hex.length());
-
- if (index > 0) {
- name = name.trim();
- result.add(name);
- }
- }
+ long lKey = openRegistryKey(HKEY_LOCAL_MACHINE, subKey);
+ if (lKey == 0) {
+ return result;
}
+
+ String valueName;
+ int index = 0;
+ do {
+ valueName = enumRegistryValue(lKey, index);
+ if (valueName != null) {
+ result.add(valueName);
+ index++;
}
+ } while (valueName != null);
+
+ closeRegistryKey(lKey);
return result;
}
/**
- * @param key in the registry
- * @param subkey in the registry key
- * @return registry value or null if not found
- */
- static final String readRegistry(String key, String subkey){
- String result = "";
-
- try {
- List<String> buildOptions = new ArrayList<>();
- buildOptions.add("reg");
- buildOptions.add("query");
- buildOptions.add("\"" + key + "\"");
-
- if (!subkey.isEmpty()) {
- buildOptions.add("/v");
- buildOptions.add(subkey);
- }
+ * Reads DWORD registry value.
+ *
+ * @param key one of HKEY predefine value
+ * @param subKey registry sub key
+ * @param value value to read
+ * @param defaultValue default value in case if subKey or value not found
+ * or any other errors occurred
+ * @return value's data only if it was read successfully, otherwise
+ * defaultValue
+ */
+ private static native int readDwordValue(int key, String subKey,
+ String value, int defaultValue);
- try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
- PrintStream ps = new PrintStream(baos)) {
- ProcessBuilder security = new ProcessBuilder(buildOptions);
- exec(security, false, false, ps);
- BufferedReader bfReader = new BufferedReader(
- new InputStreamReader(
- new ByteArrayInputStream(baos.toByteArray())));
- String line = null;
+ /**
+ * Open registry key.
+ *
+ * @param key one of HKEY predefine value
+ * @param subKey registry sub key
+ * @return native handle to open key
+ */
+ private static native long openRegistryKey(int key, String subKey);
- while((line = bfReader.readLine()) != null){
- result += line;
- }
- }
- catch (IOException e) {
- }
- }
- catch (Exception e) {
- }
+ /**
+ * Enumerates the values for registry key.
+ *
+ * @param lKey native handle to open key returned by openRegistryKey
+ * @param index index of value starting from 0. Increment until this
+ * function returns NULL which means no more values.
+ * @return returns value or NULL if error or no more data
+ */
+ private static native String enumRegistryValue(long lKey, int index);
- return result;
- }
+ /**
+ * Close registry key.
+ *
+ * @param lKey native handle to open key returned by openRegistryKey
+ */
+ private static native void closeRegistryKey(long lKey);
+
+ /**
+ * Compares two Windows paths regardless case and if paths are short or long.
+ *
+ * @param path1 path to compare
+ * @param path2 path to compare
+ * @return true if paths point to same location
+ */
+ public static native boolean comparePaths(String path1, String path2);
}
< prev index next >