int queryValue()

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;
}