--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackager/windows/classes/jdk/jpackager/internal/WindowsRegistry.java Wed Nov 21 17:50:46 2018 -0500
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jpackager.internal;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import static jdk.jpackager.internal.IOUtils.exec;
+
+public final class WindowsRegistry {
+
+ private WindowsRegistry() {}
+
+ /**
+ * Reads the registry value for DisableRealtimeMonitoring.
+ * @return true if DisableRealtimeMonitoring is set to 0x1,
+ * false otherwise.
+ */
+ public 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;
+ }
+
+ public 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
+ */
+ public 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;
+ }
+}