src/jdk.jpackage/windows/native/libjpackage/WindowsRegistry.cpp
author herrick
Wed, 06 Feb 2019 09:10:12 -0500
branchJDK-8200758-branch
changeset 57151 38d0b67617e3
child 57909 c7de06ed4b54
permissions -rw-r--r--
8217317: Create jpackage native library for windows Submitten-by: almatvee Reviewed-by: herrick, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57151
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     1
/*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     4
 *
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    10
 *
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    15
 * accompanied this code).
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    16
 *
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    20
 *
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    23
 * questions.
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    24
 */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    25
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    26
#include <Windows.h>
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    27
#include <strsafe.h>
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    28
#include <tchar.h>
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    29
#include <jni.h>
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    30
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    31
#include "Utils.h"
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    32
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    33
// Max value name size per MSDN plus NULL
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    34
#define VALUE_NAME_SIZE 16384
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    35
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    36
#ifdef __cplusplus
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    37
extern "C" {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    38
#endif
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    39
#undef jdk_jpackage_internal_WindowsRegistry_HKEY_LOCAL_MACHINE
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    40
#define jdk_jpackage_internal_WindowsRegistry_HKEY_LOCAL_MACHINE 1L
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    41
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    42
    /*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    43
     * Class:     jdk_jpackage_internal_WindowsRegistry
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    44
     * Method:    readDwordValue
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    45
     * Signature: (ILjava/lang/String;Ljava/lang/String;I)I
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    46
     */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    47
    JNIEXPORT jint JNICALL Java_jdk_jpackage_internal_WindowsRegistry_readDwordValue(
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    48
            JNIEnv *pEnv, jclass c, jint key, jstring jSubKey, jstring jValue, jint defaultValue) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    49
        jint jResult = defaultValue;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    50
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    51
        if (key != jdk_jpackage_internal_WindowsRegistry_HKEY_LOCAL_MACHINE) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    52
            return jResult;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    53
        }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    54
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    55
        wstring subKey = GetStringFromJString(pEnv, jSubKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    56
        wstring value = GetStringFromJString(pEnv, jValue);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    57
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    58
        HKEY hSubKey = NULL;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    59
        LSTATUS status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey.c_str(), 0,
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    60
                KEY_QUERY_VALUE, &hSubKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    61
        if (status == ERROR_SUCCESS) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    62
            DWORD dwValue = 0;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    63
            DWORD cbData = sizeof (DWORD);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    64
            status = RegQueryValueEx(hSubKey, value.c_str(), NULL, NULL,
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    65
                    (LPBYTE) & dwValue, &cbData);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    66
            if (status == ERROR_SUCCESS) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    67
                jResult = (jint) dwValue;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    68
            }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    69
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    70
            RegCloseKey(hSubKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    71
        }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    72
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    73
        return jResult;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    74
    }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    75
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    76
    /*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    77
     * Class:     jdk_jpackage_internal_WindowsRegistry
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    78
     * Method:    openRegistryKey
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    79
     * Signature: (ILjava/lang/String;)J
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    80
     */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    81
    JNIEXPORT jlong JNICALL Java_jdk_jpackage_internal_WindowsRegistry_openRegistryKey(
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    82
            JNIEnv *pEnv, jclass c, jint key, jstring jSubKey) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    83
        if (key != jdk_jpackage_internal_WindowsRegistry_HKEY_LOCAL_MACHINE) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    84
            return 0;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    85
        }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    86
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    87
        wstring subKey = GetStringFromJString(pEnv, jSubKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    88
        HKEY hSubKey = NULL;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    89
        LSTATUS status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey.c_str(), 0,
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    90
                KEY_QUERY_VALUE, &hSubKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    91
        if (status == ERROR_SUCCESS) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    92
            return (jlong)hSubKey;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    93
        }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    94
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    95
        return 0;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    96
    }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    97
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    98
    /*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
    99
     * Class:     jdk_jpackage_internal_WindowsRegistry
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   100
     * Method:    enumRegistryValue
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   101
     * Signature: (JI)Ljava/lang/String;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   102
     */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   103
    JNIEXPORT jstring JNICALL Java_jdk_jpackage_internal_WindowsRegistry_enumRegistryValue(
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   104
            JNIEnv *pEnv, jclass c, jlong lKey, jint jIndex) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   105
        HKEY hKey = (HKEY)lKey;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   106
        TCHAR valueName[VALUE_NAME_SIZE] = {0}; // Max value name size per MSDN plus NULL
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   107
        DWORD cchValueName = VALUE_NAME_SIZE;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   108
        LSTATUS status = RegEnumValue(hKey, (DWORD)jIndex, valueName, &cchValueName,
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   109
                                      NULL, NULL, NULL, NULL);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   110
        if (status == ERROR_SUCCESS) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   111
            size_t chLength = 0;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   112
            if (StringCchLength(valueName, VALUE_NAME_SIZE, &chLength) == S_OK) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   113
                return GetJStringFromString(pEnv, valueName, (jsize)chLength);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   114
            }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   115
        }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   116
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   117
        return NULL;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   118
    }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   119
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   120
    /*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   121
     * Class:     jdk_jpackage_internal_WindowsRegistry
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   122
     * Method:    closeRegistryKey
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   123
     * Signature: (J)V
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   124
     */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   125
    JNIEXPORT void JNICALL Java_jdk_jpackage_internal_WindowsRegistry_closeRegistryKey(
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   126
            JNIEnv *pEnc, jclass c, jlong lKey) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   127
        HKEY hKey = (HKEY)lKey;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   128
        RegCloseKey(hKey);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   129
    }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   130
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   131
    /*
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   132
     * Class:     jdk_jpackage_internal_WindowsRegistry
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   133
     * Method:    comparePaths
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   134
     * Signature: (Ljava/lang/String;Ljava/lang/String;)Z
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   135
     */
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   136
     JNIEXPORT jboolean JNICALL Java_jdk_jpackage_internal_WindowsRegistry_comparePaths(
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   137
             JNIEnv *pEnv, jclass c, jstring jPath1, jstring jPath2) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   138
         wstring path1 = GetStringFromJString(pEnv, jPath1);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   139
         wstring path2 = GetStringFromJString(pEnv, jPath2);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   140
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   141
         path1 = GetLongPath(path1);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   142
         path2 = GetLongPath(path2);
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   143
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   144
         if (path1.length() == 0 || path2.length() == 0) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   145
             return JNI_FALSE;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   146
         }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   147
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   148
         if (path1.length() != path2.length()) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   149
             return JNI_FALSE;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   150
         }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   151
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   152
         if (_tcsnicmp(path1.c_str(), path2.c_str(), path1.length()) == 0) {
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   153
             return JNI_TRUE;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   154
         }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   155
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   156
         return JNI_FALSE;
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   157
     }
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   158
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   159
#ifdef __cplusplus
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   160
}
38d0b67617e3 8217317: Create jpackage native library for windows
herrick
parents:
diff changeset
   161
#endif