Added RMS and clipping alert in tree view

This commit is contained in:
2020-05-23 20:18:49 +01:00
parent 1005619211
commit 19bf57143c
94 changed files with 3437 additions and 204 deletions

View File

@@ -55,6 +55,8 @@ struct
int foundJava;
BOOL bundledJreAsFallback;
BOOL corruptedJreFound;
char originalJavaMinVer[STR];
char originalJavaMaxVer[STR];
char javaMinVer[STR];
char javaMaxVer[STR];
char foundJavaVer[STR];
@@ -64,6 +66,7 @@ struct
struct
{
char mainClass[_MAX_PATH];
char cmd[_MAX_PATH];
char args[MAX_ARGS];
} launcher;
@@ -150,7 +153,14 @@ void msgBox(const char* text)
{
if (console)
{
printf("%s: %s\n", error.title, text);
if (*error.title)
{
printf("%s: %s\n", error.title, text);
}
else
{
printf("%s\n", text);
}
}
else
{
@@ -197,6 +207,7 @@ BOOL loadString(const int resID, char* buffer)
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;
debugAll("Resource %d:\t", resID);
hResource = FindResourceEx(hModule, RT_RCDATA, MAKEINTRESOURCE(resID),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));
@@ -214,10 +225,7 @@ BOOL loadString(const int resID, char* buffer)
buffer[x] = (char) lpBuffer[x];
} while (buffer[x++] != 0);
if (debugAll)
{
debug("Resource %d:\t%s\n", resID, buffer);
}
debugAll("%s\n", buffer);
return TRUE;
}
}
@@ -227,6 +235,8 @@ BOOL loadString(const int resID, char* buffer)
SetLastError(0);
buffer[0] = 0;
}
debugAll("<NULL>\n");
return FALSE;
}
@@ -302,6 +312,120 @@ BOOL regQueryValue(const char* regPath, unsigned char* buffer,
return result;
}
int findNextVersionPart(const char* startAt)
{
if (startAt == NULL || strlen(startAt) == 0)
{
return 0;
}
char* firstSeparatorA = strchr(startAt, '.');
char* firstSeparatorB = strchr(startAt, '_');
char* firstSeparator;
if (firstSeparatorA == NULL)
{
firstSeparator = firstSeparatorB;
}
else if (firstSeparatorB == NULL)
{
firstSeparator = firstSeparatorA;
}
else
{
firstSeparator = min(firstSeparatorA, firstSeparatorB);
}
if (firstSeparator == NULL)
{
return strlen(startAt);
}
return firstSeparator - startAt;
}
/**
* This method will take java version from `originalVersion` string and convert/format it
* into `version` string that can be used for string comparison with other versions.
*
* Due to different version schemas <=8 vs. >=9 it will "normalize" versions to 1 format
* so we can directly compare old and new versions.
*/
void formatJavaVersion(char* version, const char* originalVersion)
{
strcpy(version, "");
if (originalVersion == NULL || strlen(originalVersion) == 0)
{
return;
}
int partsAdded = 0;
int i;
char* pos = (char*) originalVersion;
int curPartLen;
while ((curPartLen = findNextVersionPart(pos)) > 0)
{
char number[curPartLen + 1];
memset(number, 0, curPartLen + 1);
strncpy(number, pos, curPartLen);
if (partsAdded == 0 && (curPartLen != 1 || number[0] != '1'))
{
// NOTE: When it's java 9+ we'll add "1" as the first part of the version
strcpy(version, "1");
partsAdded++;
}
if (partsAdded < 3)
{
if (partsAdded > 0)
{
strcat(version, ".");
}
for (i = 0;
(partsAdded > 0)
&& (i < JRE_VER_MAX_DIGITS_PER_PART - strlen(number));
i++)
{
strcat(version, "0");
}
strcat(version, number);
}
else if (partsAdded == 3)
{
// add as an update
strcat(version, "_");
for (i = 0; i < JRE_VER_MAX_DIGITS_PER_PART - strlen(number); i++)
{
strcat(version, "0");
}
strcat(version, number);
}
else if (partsAdded >= 4)
{
debug("Warning:\tformatJavaVersion() too many parts added.\n");
break;
}
partsAdded++;
pos += curPartLen + 1;
if (pos >= originalVersion + strlen(originalVersion))
{
break;
}
}
for (i = partsAdded; i < 3; i++)
{
strcat(version, ".");
int j;
for (j = 0; j < JRE_VER_MAX_DIGITS_PER_PART; j++)
{
strcat(version, "0");
}
}
}
void regSearch(const char* keyName, const int searchType)
{
HKEY hKey;
@@ -322,12 +446,13 @@ void regSearch(const char* keyName, const int searchType)
unsigned long versionSize = _MAX_PATH;
FILETIME time;
char fullKeyName[_MAX_PATH] = {0};
char originalVersion[_MAX_PATH] = {0};
char version[_MAX_PATH] = {0};
while (RegEnumKeyEx(
hKey, // handle to key to enumerate
x++, // index of subkey to enumerate
version, // address of buffer for subkey name
originalVersion,// address of buffer for subkey name
&versionSize, // address for size of subkey buffer
NULL, // reserved
NULL, // address of buffer for class string
@@ -335,8 +460,9 @@ void regSearch(const char* keyName, const int searchType)
&time) == ERROR_SUCCESS)
{
strcpy(fullKeyName, keyName);
appendPath(fullKeyName, version);
appendPath(fullKeyName, originalVersion);
debug("Check:\t\t%s\n", fullKeyName);
formatJavaVersion(version, originalVersion);
if (strcmp(version, search.javaMinVer) >= 0
&& (!*search.javaMaxVer || strcmp(version, search.javaMaxVer) <= 0)
@@ -384,10 +510,6 @@ BOOL isJavaHomeValid(const char* keyName, const int searchType)
path[i] = buffer[i];
} while (path[i++] != 0);
if (searchType & FOUND_SDK)
{
appendPath(path, "jre");
}
valid = isLauncherPathValid(path);
}
RegCloseKey(hKey);
@@ -476,6 +598,10 @@ void regSearchWow(const char* keyName, const int searchType)
case USE_32_BIT_RUNTIME:
regSearch(keyName, searchType);
break;
default:
debug("Runtime bits:\tFailed to load.\n");
break;
}
}
@@ -503,10 +629,25 @@ void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName,
BOOL findJavaHome(char* path, const int jdkPreference)
{
debugAll("findJavaHome()\n");
regSearchJreSdk("SOFTWARE\\JavaSoft\\Java Runtime Environment",
"SOFTWARE\\JavaSoft\\Java Development Kit",
jdkPreference);
// Java 9 support
regSearchJreSdk("SOFTWARE\\JavaSoft\\JRE",
"SOFTWARE\\JavaSoft\\JDK",
jdkPreference);
// IBM Java 1.8
if (search.foundJava == NO_JAVA_FOUND)
{
regSearchJreSdk("SOFTWARE\\IBM\\Java Runtime Environment",
"SOFTWARE\\IBM\\Java Development Kit",
jdkPreference);
}
// IBM Java 1.7 and earlier
if (search.foundJava == NO_JAVA_FOUND)
{
regSearchJreSdk("SOFTWARE\\IBM\\Java2 Runtime Environment",
@@ -613,6 +754,10 @@ BOOL expandVars(char *dst, const char *src, const char *exePath, const int pathL
else if (strstr(varName, HKEY_STR) == varName)
{
regQueryValue(varName, dst + strlen(dst), BIG_STR);
}
else if (strcmp(varName, "") == 0)
{
strcat(dst, "%");
}
else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0)
{
@@ -733,6 +878,7 @@ BOOL createMutex()
if (*mutexName)
{
debug("Create mutex:\t%s\n", mutexName);
SECURITY_ATTRIBUTES security;
security.nLength = sizeof(SECURITY_ATTRIBUTES);
security.bInheritHandle = TRUE;
@@ -767,8 +913,16 @@ void setWorkingDirectory(const char *exePath, const int pathLen)
BOOL bundledJreSearch(const char *exePath, const int pathLen)
{
debugAll("bundledJreSearch()\n");
char tmpPath[_MAX_PATH] = {0};
BOOL is64BitJre = loadBool(BUNDLED_JRE_64_BIT);
if (!wow64 && is64BitJre)
{
debug("Bundled JRE:\tCannot use 64-bit runtime on 32-bit OS.\n");
return FALSE;
}
if (loadString(JRE_PATH, tmpPath))
{
char jrePath[MAX_ARGS] = {0};
@@ -789,9 +943,7 @@ BOOL bundledJreSearch(const char *exePath, const int pathLen)
if (isLauncherPathValid(launcher.cmd))
{
search.foundJava = (wow64 && loadBool(BUNDLED_JRE_64_BIT))
? FOUND_BUNDLED | KEY_WOW64_64KEY
: FOUND_BUNDLED;
search.foundJava = is64BitJre ? FOUND_BUNDLED | KEY_WOW64_64KEY : FOUND_BUNDLED;
strcpy(search.foundJavaHome, launcher.cmd);
return TRUE;
}
@@ -802,6 +954,7 @@ BOOL bundledJreSearch(const char *exePath, const int pathLen)
BOOL installedJreSearch()
{
debugAll("installedJreSearch()\n");
return *search.javaMinVer && findJavaHome(launcher.cmd, loadInt(JDK_PREFERENCE));
}
@@ -811,12 +964,12 @@ void createJreSearchError()
{
loadString(JRE_VERSION_ERR, error.msg);
strcat(error.msg, " ");
strcat(error.msg, search.javaMinVer);
strcat(error.msg, search.originalJavaMinVer);
if (*search.javaMaxVer)
{
strcat(error.msg, " - ");
strcat(error.msg, search.javaMaxVer);
strcat(error.msg, search.originalJavaMaxVer);
}
if (search.runtimeBits == USE_64_BIT_RUNTIME
@@ -848,11 +1001,16 @@ void createJreSearchError()
BOOL jreSearch(const char *exePath, const int pathLen)
{
debugAll("jreSearch()\n");
BOOL result = TRUE;
search.bundledJreAsFallback = loadBool(BUNDLED_JRE_AS_FALLBACK);
loadString(JAVA_MIN_VER, search.javaMinVer);
loadString(JAVA_MAX_VER, search.javaMaxVer);
loadString(JAVA_MIN_VER, search.originalJavaMinVer);
formatJavaVersion(search.javaMinVer, search.originalJavaMinVer);
debug("Java min ver:\t%s\n", search.javaMinVer);
loadString(JAVA_MAX_VER, search.originalJavaMaxVer);
formatJavaVersion(search.javaMaxVer, search.originalJavaMaxVer);
debug("Java max ver:\t%s\n", search.javaMaxVer);
if (search.bundledJreAsFallback)
{
@@ -934,14 +1092,15 @@ void setMainClassAndClassPath(const char *exePath, const int pathLen)
{
char classPath[MAX_ARGS] = {0};
char expandedClassPath[MAX_ARGS] = {0};
char mainClass[STR] = {0};
char jar[_MAX_PATH] = {0};
char fullFileName[_MAX_PATH] = {0};
const BOOL wrapper = loadBool(WRAPPER);
loadString(JAR, jar);
if (loadString(MAIN_CLASS, mainClass))
if (loadString(MAIN_CLASS, launcher.mainClass))
{
debug("Main class:\t%s\n", launcher.mainClass);
if (!loadString(CLASSPATH, classPath))
{
debug("Info:\t\tClasspath not defined.\n");
@@ -997,7 +1156,7 @@ void setMainClassAndClassPath(const char *exePath, const int pathLen)
*(launcher.args + strlen(launcher.args) - 1) = 0;
strcat(launcher.args, "\" ");
strcat(launcher.args, mainClass);
strcat(launcher.args, launcher.mainClass);
}
else if (wrapper)
{
@@ -1158,3 +1317,19 @@ BOOL execute(const BOOL wait, DWORD *dwExitCode)
*dwExitCode = -1;
return FALSE;
}
const char* getJavaHome()
{
return search.foundJavaHome;
}
const char* getMainClass()
{
return launcher.mainClass;
}
const char* getLauncherArgs()
{
return launcher.args;
}