Some code simplifications.

This commit is contained in:
LoRd_MuldeR 2020-10-01 01:45:04 +02:00
parent bc39e3f93a
commit b611703205

View File

@ -591,7 +591,7 @@ typedef struct
} }
java_home_t; java_home_t;
static BOOL is_old_format(const wchar_t *const version_str) static BOOL detect_update_format(const wchar_t *const version_str)
{ {
BOOL digit_flag = FALSE; BOOL digit_flag = FALSE;
size_t pos = 0U; size_t pos = 0U;
@ -608,7 +608,7 @@ static BOOL is_old_format(const wchar_t *const version_str)
{ {
++pos; ++pos;
} }
if (digit_flag) if (digit_flag && version_str[pos])
{ {
return (version_str[pos] == L'u') || (version_str[pos] == L'U'); return (version_str[pos] == L'u') || (version_str[pos] == L'U');
} }
@ -619,15 +619,16 @@ static ULONGLONG parse_java_version(const wchar_t *const version_str)
{ {
ULONGLONG version = 0ULL; ULONGLONG version = 0ULL;
UINT level = 0U; UINT level = 0U;
static const wchar_t *const delimiters = L".,_+-uUbB";
if (NOT_EMPTY(version_str)) if (NOT_EMPTY(version_str))
{ {
wchar_t *const temp = wcsdup(version_str); wchar_t *const temp = wcsdup(version_str);
if (temp) if (temp)
{ {
const BOOL old_format = is_old_format(temp); const BOOL is_update_forma = detect_update_format(temp);
BOOL first_token = TRUE; BOOL first_token = TRUE;
const wchar_t *token = wcstok(temp, L".uU"); const wchar_t *token = wcstok(temp, delimiters);
while (token) while (token)
{ {
const DWORD component = wcstoul(token, NULL, 10); const DWORD component = wcstoul(token, NULL, 10);
@ -635,7 +636,7 @@ static ULONGLONG parse_java_version(const wchar_t *const version_str)
{ {
version = (version << 16) | (component & 0xFFFF); version = (version << 16) | (component & 0xFFFF);
++level; ++level;
if(old_format && (level == 1U)) if(is_update_forma && (level == 1U))
{ {
version <<= 16; version <<= 16;
++level; ++level;
@ -645,7 +646,7 @@ static ULONGLONG parse_java_version(const wchar_t *const version_str)
{ {
break; break;
} }
token = wcstok(NULL, L"._+-b"); token = wcstok(NULL, delimiters);
first_token = FALSE; first_token = FALSE;
} }
} }
@ -678,10 +679,10 @@ static DWORD detect_java_runtime_verify(const wchar_t **const executable_path_ou
{ {
for (size_t i = 0U; REL_PATHS[i]; ++i) for (size_t i = 0U; REL_PATHS[i]; ++i)
{ {
const wchar_t *const java_executable_path = awprintf(REL_PATHS[i], java_home_path); const wchar_t *const javaw_executable_path = awprintf(REL_PATHS[i], java_home_path);
if (java_executable_path) if (javaw_executable_path)
{ {
const wchar_t *const absolute_executable_path = get_absolute_path(java_executable_path); const wchar_t *const absolute_executable_path = get_absolute_path(javaw_executable_path);
if (absolute_executable_path) if (absolute_executable_path)
{ {
const DWORD bitness = file_is_executable(absolute_executable_path); const DWORD bitness = file_is_executable(absolute_executable_path);
@ -695,7 +696,7 @@ static DWORD detect_java_runtime_verify(const wchar_t **const executable_path_ou
free((void*)absolute_executable_path); free((void*)absolute_executable_path);
} }
} }
free((void*)java_executable_path); free((void*)javaw_executable_path);
} }
if(result > 0U) if(result > 0U)
{ {
@ -708,32 +709,15 @@ static DWORD detect_java_runtime_verify(const wchar_t **const executable_path_ou
return result; return result;
} }
static void patch_java_version(ULONGLONG *const version, const DWORD component_version, const UINT shift)
{
if(component_version > 0U)
{
*version &= (~(((ULONGLONG)0xFFFF) << shift));
*version |= (((ULONGLONG)(component_version & 0xFFFF)) << shift);
}
}
static BOOL detect_java_runtime_callback(const wchar_t *const key_name, const ULONG_PTR user_data) static BOOL detect_java_runtime_callback(const wchar_t *const key_name, const ULONG_PTR user_data)
{ {
java_home_t *const context_ptr = (java_home_t*) user_data; java_home_t *const context_ptr = (java_home_t*) user_data;
wchar_t *const full_reg_path = awprintf(L"%ls\\%ls", context_ptr->registry.base_path, key_name);
if (!full_reg_path)
{
return FALSE; /*failure*/
}
ULONGLONG version = parse_java_version(key_name); ULONGLONG version = parse_java_version(key_name);
patch_java_version(&version, reg_read_string_uint32(context_ptr->registry.root_key, full_reg_path, L"MicroVersion", context_ptr->registry.view_64bit), 32U);
patch_java_version(&version, reg_read_string_uint32(context_ptr->registry.root_key, full_reg_path, L"UpdateVersion", context_ptr->registry.view_64bit), 16U);
patch_java_version(&version, reg_read_string_uint32(context_ptr->registry.root_key, full_reg_path, L"BuildNumber", context_ptr->registry.view_64bit), 0U);
if ((version >= context_ptr->required.ver_min) && (version < context_ptr->required.ver_max)) if ((version >= context_ptr->required.ver_min) && (version < context_ptr->required.ver_max) && (version > context_ptr->result.version))
{ {
if (version > context_ptr->result.version) const wchar_t *const full_reg_path = awprintf(L"%ls\\%ls", context_ptr->registry.base_path, key_name);
if (full_reg_path)
{ {
const wchar_t *java_runtime_path; const wchar_t *java_runtime_path;
const DWORD bitness = detect_java_runtime_verify(&java_runtime_path, context_ptr->registry.root_key, full_reg_path, context_ptr->registry.view_64bit); const DWORD bitness = detect_java_runtime_verify(&java_runtime_path, context_ptr->registry.root_key, full_reg_path, context_ptr->registry.view_64bit);
@ -750,10 +734,10 @@ static BOOL detect_java_runtime_callback(const wchar_t *const key_name, const UL
free((void*)java_runtime_path); free((void*)java_runtime_path);
} }
} }
free((void*)full_reg_path);
} }
} }
free(full_reg_path);
return TRUE; return TRUE;
} }