in src/main/cpp/jnilib/windows/src/WindowsUtils.c [68:126]
int queryValue(int mode, HKEY section, const unsigned short* key, const unsigned short* name, DWORD* type, DWORD* size, byte** value, int expand) {
int result = 1;
HKEY hkey = 0;
int tempType = 0;
int tempSize = 0;
byte* tempValue = NULL;
if (RegOpenKeyExW(section, key, 0, KEY_QUERY_VALUE | mode, &hkey) == ERROR_SUCCESS) {
if (RegQueryValueExW(hkey, name, NULL, (LPDWORD) &tempType, NULL, (LPDWORD) &tempSize) == ERROR_SUCCESS) {
tempValue = (byte*) MALLOC(tempSize + 8);
if (tempValue != NULL) {
ZERO(tempValue, tempSize + 8);
if (RegQueryValueExW(hkey, name, NULL, (LPDWORD) &tempType, tempValue, (LPDWORD) &tempSize) == ERROR_SUCCESS) {
if (expand && (tempType == REG_EXPAND_SZ)) {
int expandedSize = (int) WCSLEN((unsigned short*) tempValue) + 2;
byte* expandedValue = (byte*) MALLOC(expandedSize * sizeof(wchar_t));
int expandedCharsNumber = 0;
ZERO(expandedValue, expandedSize);
expandedCharsNumber = ExpandEnvironmentStringsW((unsigned short*) tempValue, (unsigned short*) expandedValue, tempSize);
if (expandedCharsNumber > tempSize) {
FREE(expandedValue);
expandedValue = (byte*) MALLOC(expandedCharsNumber * sizeof(wchar_t));
expandedCharsNumber = ExpandEnvironmentStringsW((unsigned short*) tempValue, (unsigned short*) expandedValue, expandedCharsNumber);
}
FREE(tempValue);
tempValue = expandedValue;
}
} else {
FREE(tempValue);
result = 0;
}
}
} else {
result = 0;
}
} else {
result = 0;
}
if (hkey != 0) {
RegCloseKey(hkey);
}
if (type != NULL) {
*type = tempType;
}
if (size != NULL) {
*size = tempSize;
}
if ((value != NULL) && (tempValue != NULL)) {
*value = tempValue;
}
return result;
}