< prev index next >
src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsRegistry.java
Print this page
*** 36,150 ****
import static jdk.jpackage.internal.IOUtils.exec;
final class WindowsRegistry {
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\\"
+ "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;
}
static final List<String> readExclusionsPaths() {
! List<String> result = new ArrayList<String>();
! final String key = "HKEY_LOCAL_MACHINE\\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);
! }
! }
}
}
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);
! }
! 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;
! while((line = bfReader.readLine()) != null){
! result += line;
! }
! }
! catch (IOException e) {
! }
! }
! catch (Exception e) {
! }
! return result;
! }
}
--- 36,136 ----
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() {
! final String subKey = "Software\\Microsoft\\"
+ "Windows Defender\\Real-Time Protection";
! 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<>();
! final String subKey = "Software\\Microsoft\\"
+ "Windows Defender\\Exclusions\\Paths";
! 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;
}
/**
! * 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);
! /**
! * 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);
! /**
! * 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);
! /**
! * 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 >