diff --git a/core/org.eclipse.cdt.core.win32/library/winreg.cpp b/core/org.eclipse.cdt.core.win32/library/winreg.cpp index 8b0562ae7f1..2feeeb9ad48 100644 --- a/core/org.eclipse.cdt.core.win32/library/winreg.cpp +++ b/core/org.eclipse.cdt.core.win32/library/winreg.cpp @@ -28,3 +28,43 @@ JNIEXPORT jstring Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValu return result; } + +/* + * Given a subkey (string) under HKEY_LOCAL_MACHINE, and an index (starting from 0) + * to the key's array of values, return the name of the indexed value. + * The return value is null on any error or when the index is invalid. + */ + +extern "C" +JNIEXPORT jstring Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValueName( + JNIEnv * env, jobject obj, jstring subkey, jint index) +{ + const jchar * csubkey = env->GetStringChars(subkey, NULL); + jstring result = NULL; + + HKEY key; + LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (const wchar_t *)csubkey, 0, KEY_READ, &key); + if (rc != ERROR_SUCCESS) + return NULL; + + wchar_t valueName[256]; + DWORD nameSize = sizeof(valueName) + 2; + + rc = RegEnumValue(key, index, + valueName, // UNICODE string + &nameSize, + NULL, NULL, + NULL, // data string + NULL); // size in BYTE of data. + + if (rc == ERROR_SUCCESS) + { + result = env->NewString((jchar *)valueName, nameSize); + } + + RegCloseKey(key); + + env->ReleaseStringChars(subkey, csubkey); + + return result; +} diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll b/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll index 5290964e77d..d0d0636d9fe 100644 Binary files a/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll and b/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll differ diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java index b73e67dda89..c96fcbdbd48 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java @@ -43,5 +43,17 @@ public class WindowsRegistry { * @return registry value or null if not found */ public native String getLocalMachineValue(String subkey, String name); - + + /** + * Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0) + * to the key's array of values, return the name of the indexed value. + * The return value is null on any error or when the index is invalid. + * The value name can be used in the above getLocalMachineValue() to retrieve + * the value data. + * @param subkey subkey of HKEY_LOCAL_MACHINE + * @param index index to the subkey's array of values, starting from 0. + * @return name of registry value or null if not found + */ + public native String getLocalMachineValueName(String subkey, int index); + }