in src/main/cpp/jnilib/windows/src/jni_WindowsRegistry.c [146:191]
JNIEXPORT jobjectArray JNICALL Java_org_netbeans_installer_utils_system_windows_WindowsRegistry_getSubkeyNames0(JNIEnv *jEnv, jobject jObject, jint jMode, jint jSection, jstring jKey) {
HKEY hkey = 0;
unsigned short* key = getWideChars(jEnv, jKey);
DWORD number = 0;
int err = 0;
int index = 0 ;
unsigned short* buffer = (unsigned short*) MALLOC(sizeof(char) * MAX_LEN_VALUE_NAME);
jobjectArray result = NULL;
if (RegOpenKeyExW(getHKEY(jSection), key, 0, KEY_READ | getMode(jMode), &hkey) == ERROR_SUCCESS) {
if (RegQueryInfoKeyW(hkey, NULL, NULL, NULL, &number, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
jclass stringClazz = (*jEnv)->FindClass(jEnv, "java/lang/String");
result = (*jEnv)->NewObjectArray(jEnv, number, stringClazz, NULL);
do {
DWORD size = MAX_LEN_VALUE_NAME;
buffer[0] = 0;
err = RegEnumKeyExW(hkey, index, buffer, &size, NULL, NULL, NULL, NULL);
if (err == ERROR_SUCCESS) {
(*jEnv)->SetObjectArrayElement(jEnv, result, index, getStringW(jEnv, buffer));
} else {
if (err != ERROR_NO_MORE_ITEMS) {
throwException(jEnv, "Cannot get key names");
}
}
index++;
} while (err == ERROR_SUCCESS);
} else {
throwException(jEnv, "Cannot read key data");
}
} else {
throwException(jEnv, "Cannot open key");
}
if (hkey != 0) {
RegCloseKey(hkey);
}
FREE(key);
FREE(buffer);
return result;
}