in src/main/cpp/launcher/windows/src/JavaUtils.c [391:489]
void searchCurrentJavaRegistry(LauncherProperties * props, BOOL access64key) {
DWORD i=0;
WCHAR ** keys = JAVA_REGISTRY_KEYS;
DWORD k=0;
WCHAR * buffer = newpWCHAR(MAX_LEN_VALUE_NAME);
HKEY rootKeys [2] = {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER};
DWORD rootKeysNumber = sizeof(rootKeys)/sizeof(HKEY);
DWORD keysNumber = sizeof(JAVA_REGISTRY_KEYS)/sizeof(WCHAR*);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "Search java in CurrentVersion values...", 1);
for ( k = 0; k < rootKeysNumber; k++) {
for(i=0; i < keysNumber;i++) {
if(isTerminated(props)) {
return;
}
else {
WCHAR * value = getStringValue(rootKeys[k], keys[i], CURRENT_VERSION, access64key);
if(value!=NULL) {
WCHAR *javaHome = getStringValuePC(rootKeys[k], keys[i], value, JAVA_HOME, access64key);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "... ", 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, (rootKeys[k]==HKEY_LOCAL_MACHINE) ? "HKEY_LOCAL_MACHINE" : "HKEY_CURRENT_USER", 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "\\", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, keys[i], 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "\\", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, CURRENT_VERSION, 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "->", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, value, 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "[", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, JAVA_HOME, 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "] = ", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, javaHome, 1);
FREE(value);
trySetCompatibleJava(javaHome, props);
FREE(javaHome);
if(props->java!=NULL) {
FREE(buffer);
return;
}
}
}
}
}
// we found no CurrentVersion java... just search for other possible keys
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "Search java in other values...", 1);
for(k=0;k<rootKeysNumber;k++) {
for(i=0;i<keysNumber;i++) {
HKEY hkey = 0;
DWORD index = 0 ;
if (RegOpenKeyExW(rootKeys[k], keys[i], 0, KEY_READ | ((access64key && IsWow64) ? KEY_WOW64_64KEY : 0), &hkey) == ERROR_SUCCESS) {
DWORD number = 0;
if (RegQueryInfoKeyW(hkey, NULL, NULL, NULL, &number, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
DWORD err = 0;
do {
DWORD size = MAX_LEN_VALUE_NAME;
buffer[0] = 0;
err = RegEnumKeyExW(hkey, index, buffer, &size, NULL, NULL, NULL, NULL);
if (err == ERROR_SUCCESS) {
WCHAR * javaHome = getJavaHomeValue(keys[i], buffer, access64key);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, (rootKeys[k]==HKEY_LOCAL_MACHINE) ? "HKEY_LOCAL_MACHINE" : "HKEY_CURRENT_USER", 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "\\", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, keys[i], 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "\\", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, buffer, 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "[", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, JAVA_HOME, 0);
writeMessageA(props, OUTPUT_LEVEL_NORMAL, 0, "] = ", 0);
writeMessageW(props, OUTPUT_LEVEL_NORMAL, 0, javaHome, 1);
trySetCompatibleJava(javaHome, props);
FREE(javaHome);
if(props->java!=NULL) {
i = keysNumber; // to the end of cycles
k = rootKeysNumber;
break;
}
}
index++;
} while (err == ERROR_SUCCESS);
}
}
if (hkey != 0) {
RegCloseKey(hkey);
}
}
}
FREE(buffer);
return;
}