mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-21 21:52:10 +02:00
Bug 521515 - Access Windows registry using JNA
There is no need to have custom JNI implementation any more in java to be able to access native functions. JNA solves this just fine with the benefit that the code is easier to debug and maintain. Change-Id: Ia9d36981cb10fa7348bf0a5f0549b3e96bd4c982 Signed-off-by: Torbjörn Svensson <azoff@svenskalinuxforeningen.se>
This commit is contained in:
parent
d68e5d5988
commit
c58603dfbe
19 changed files with 255 additions and 531 deletions
|
@ -19,8 +19,10 @@ bin.includes = plugin.properties,\
|
||||||
about.ini,\
|
about.ini,\
|
||||||
about.mappings,\
|
about.mappings,\
|
||||||
cdt_logo_icon32.png,\
|
cdt_logo_icon32.png,\
|
||||||
about.properties
|
about.properties,\
|
||||||
src.includes = about.html
|
plugin.xml
|
||||||
|
src.includes = about.html,\
|
||||||
|
schema/
|
||||||
javadoc.packages = org.eclipse.cdt.utils.*,\
|
javadoc.packages = org.eclipse.cdt.utils.*,\
|
||||||
org.eclipse.cdt.utils.pty.*,\
|
org.eclipse.cdt.utils.pty.*,\
|
||||||
org.eclipse.cdt.utils.spawner.*
|
org.eclipse.cdt.utils.spawner.*
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
pluginName=C/C++ Development Tools Core Native Utilities
|
pluginName=C/C++ Development Tools Core Native Utilities
|
||||||
providerName=Eclipse CDT
|
providerName=Eclipse CDT
|
||||||
|
|
||||||
|
WindowsRegistry.name=Windows Registry
|
||||||
|
|
||||||
fragmentName.linux = C/C++ Development Tools Core Native Utilities for Linux
|
fragmentName.linux = C/C++ Development Tools Core Native Utilities for Linux
|
||||||
fragmentName.linux.ppc64le = C/C++ Development Tools Core Native Utilities for Linux (ppc64le)
|
fragmentName.linux.ppc64le = C/C++ Development Tools Core Native Utilities for Linux (ppc64le)
|
||||||
fragmentName.linux.x86_64 = C/C++ Development Tools Core Native Utilities for Linux (x86_64)
|
fragmentName.linux.x86_64 = C/C++ Development Tools Core Native Utilities for Linux (x86_64)
|
||||||
|
|
5
core/org.eclipse.cdt.core.native/plugin.xml
Normal file
5
core/org.eclipse.cdt.core.native/plugin.xml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.0"?>
|
||||||
|
<plugin>
|
||||||
|
<extension-point id="WindowsRegistry" name="%WindowsRegistry.name" schema="schema/WindowsRegistry.exsd"/>
|
||||||
|
</plugin>
|
66
core/org.eclipse.cdt.core.native/schema/WindowsRegistry.exsd
Normal file
66
core/org.eclipse.cdt.core.native/schema/WindowsRegistry.exsd
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Schema file written by PDE -->
|
||||||
|
<schema targetNamespace="org.eclipse.cdt.core" xmlns="http://www.w3.org/2001/XMLSchema">
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.schema plugin="org.eclipse.cdt.core.native" id="WindowsRegistry" name="Windows Registry Query Exentsion"/>
|
||||||
|
</appInfo>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
<element name="extension">
|
||||||
|
<annotation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.element />
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="windowsRegistry"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="point" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="id" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="name" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
<element name="windowsRegistry">
|
||||||
|
<complexType>
|
||||||
|
<attribute name="class" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appInfo>
|
||||||
|
<meta.attribute kind="java" basedOn="org.eclipse.cdt.utils.WindowsRegistry"/>
|
||||||
|
</appInfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="platform" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
</schema>
|
|
@ -14,7 +14,13 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.natives;
|
package org.eclipse.cdt.internal.core.natives;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.utils.WindowsRegistry;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.IExtension;
|
||||||
|
import org.eclipse.core.runtime.IExtensionPoint;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
|
||||||
|
@ -92,4 +98,35 @@ public class CNativePlugin extends Plugin {
|
||||||
getDefault().getLog().log(status);
|
getDefault().getLog().log(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the WindowsRegistry contributed class for the platform.
|
||||||
|
*/
|
||||||
|
public WindowsRegistry getWindowsRegistry() throws CoreException {
|
||||||
|
IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, "WindowsRegistry"); //$NON-NLS-1$
|
||||||
|
if (extension != null) {
|
||||||
|
IExtension[] extensions = extension.getExtensions();
|
||||||
|
IConfigurationElement defaultContributor = null;
|
||||||
|
for (IExtension extension2 : extensions) {
|
||||||
|
IConfigurationElement[] configElements = extension2.getConfigurationElements();
|
||||||
|
for (IConfigurationElement configElement : configElements) {
|
||||||
|
if (configElement.getName().equals("windowsRegistry")) { //$NON-NLS-1$
|
||||||
|
String platform = configElement.getAttribute("platform"); //$NON-NLS-1$
|
||||||
|
if (platform == null) { // first contributor found with
|
||||||
|
// not platform will be default.
|
||||||
|
if (defaultContributor == null) {
|
||||||
|
defaultContributor = configElement;
|
||||||
|
}
|
||||||
|
} else if (platform.equals(Platform.getOS())) {
|
||||||
|
// found explicit contributor for this platform.
|
||||||
|
return (WindowsRegistry) configElement.createExecutableExtension("class"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (defaultContributor != null) {
|
||||||
|
return (WindowsRegistry) defaultContributor.createExecutableExtension("class"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,38 +11,31 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - initial API and implementation
|
* QNX Software Systems - initial API and implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.eclipse.cdt.utils;
|
package org.eclipse.cdt.utils;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.cdt.internal.core.natives.CNativePlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author DSchaefer
|
* @author DSchaefer
|
||||||
* @noextend This class is not intended to be subclassed by clients.
|
* @noextend This class is not intended to be subclassed by clients.
|
||||||
* @noinstantiate This class is not intended to be instantiated by clients.
|
|
||||||
*/
|
*/
|
||||||
public class WindowsRegistry {
|
public abstract class WindowsRegistry {
|
||||||
|
|
||||||
private static boolean failed = false;
|
|
||||||
private static WindowsRegistry registry;
|
private static WindowsRegistry registry;
|
||||||
|
|
||||||
private WindowsRegistry() {
|
/**
|
||||||
|
* @since 6.0
|
||||||
|
*/
|
||||||
|
protected WindowsRegistry() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static WindowsRegistry getRegistry() {
|
public static WindowsRegistry getRegistry() {
|
||||||
if (registry == null && !failed) {
|
if (registry == null) {
|
||||||
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
try {
|
||||||
try {
|
registry = CNativePlugin.getDefault().getWindowsRegistry();
|
||||||
System.loadLibrary("winreg"); //$NON-NLS-1$
|
} catch (CoreException e) {
|
||||||
registry = new WindowsRegistry();
|
}
|
||||||
} catch (UnsatisfiedLinkError e) {
|
|
||||||
failed = true;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
failed = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return registry;
|
return registry;
|
||||||
|
@ -56,7 +49,7 @@ public class WindowsRegistry {
|
||||||
* @param name name of the registry value
|
* @param name name of the registry value
|
||||||
* @return registry value or null if not found
|
* @return registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getLocalMachineValue(String subkey, String name);
|
public abstract String getLocalMachineValue(String subkey, String name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0)
|
* Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0)
|
||||||
|
@ -68,7 +61,7 @@ public class WindowsRegistry {
|
||||||
* @param index index to the subkey's array of values, starting from 0.
|
* @param index index to the subkey's array of values, starting from 0.
|
||||||
* @return name of registry value or null if not found
|
* @return name of registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getLocalMachineValueName(String subkey, int index);
|
public abstract String getLocalMachineValueName(String subkey, int index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0)
|
* Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0)
|
||||||
|
@ -80,7 +73,7 @@ public class WindowsRegistry {
|
||||||
* @param index index to the subkey's array of values, starting from 0.
|
* @param index index to the subkey's array of values, starting from 0.
|
||||||
* @return name of registry value or null if not found
|
* @return name of registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getLocalMachineKeyName(String subkey, int index);
|
public abstract String getLocalMachineKeyName(String subkey, int index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the registry value for the subkey of HKEY_CURRENT_USER with the
|
* Gets the registry value for the subkey of HKEY_CURRENT_USER with the
|
||||||
|
@ -90,7 +83,7 @@ public class WindowsRegistry {
|
||||||
* @param name name of the registry value
|
* @param name name of the registry value
|
||||||
* @return registry value or null if not found
|
* @return registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getCurrentUserValue(String subkey, String name);
|
public abstract String getCurrentUserValue(String subkey, String name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0)
|
* Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0)
|
||||||
|
@ -102,7 +95,7 @@ public class WindowsRegistry {
|
||||||
* @param index index to the subkey's array of values, starting from 0.
|
* @param index index to the subkey's array of values, starting from 0.
|
||||||
* @return name of registry value or null if not found
|
* @return name of registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getCurrentUserValueName(String subkey, int index);
|
public abstract String getCurrentUserValueName(String subkey, int index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0)
|
* Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0)
|
||||||
|
@ -114,6 +107,5 @@ public class WindowsRegistry {
|
||||||
* @param index index to the subkey's array of values, starting from 0.
|
* @param index index to the subkey's array of values, starting from 0.
|
||||||
* @return name of registry value or null if not found
|
* @return name of registry value or null if not found
|
||||||
*/
|
*/
|
||||||
public native String getCurrentUserKeyName(String subkey, int index);
|
public abstract String getCurrentUserKeyName(String subkey, int index);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
|
@ -9,4 +9,11 @@
|
||||||
class="org.eclipse.cdt.internal.core.win32.ProcessList">
|
class="org.eclipse.cdt.internal.core.win32.ProcessList">
|
||||||
</processList>
|
</processList>
|
||||||
</extension>
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.cdt.core.native.WindowsRegistry">
|
||||||
|
<windowsRegistry
|
||||||
|
class="org.eclipse.cdt.internal.core.win32.WindowsRegistryImpl"
|
||||||
|
platform="win32">
|
||||||
|
</windowsRegistry>
|
||||||
|
</extension>
|
||||||
</fragment>
|
</fragment>
|
||||||
|
|
|
@ -30,9 +30,6 @@ INSTALL_DIR = ..\..\org.eclipse.cdt.core.$(OS).$(ARCH)\os\$(OS)\$(ARCH)
|
||||||
DLL_SPAWNER = spawner.dll
|
DLL_SPAWNER = spawner.dll
|
||||||
OBJS_SPAWNER=StdAfx.obj Win32ProcessEx.obj iostream.obj raise.obj spawner.obj
|
OBJS_SPAWNER=StdAfx.obj Win32ProcessEx.obj iostream.obj raise.obj spawner.obj
|
||||||
|
|
||||||
DLL_WINREG = winreg.dll
|
|
||||||
OBJS_WINREG=winreg/winreg.obj
|
|
||||||
|
|
||||||
EXE_STARTER = starter.exe
|
EXE_STARTER = starter.exe
|
||||||
OBJS_STARTER=starter/starter.obj
|
OBJS_STARTER=starter/starter.obj
|
||||||
|
|
||||||
|
@ -45,22 +42,19 @@ OBJS_STARTER=starter/starter.obj
|
||||||
spawner: $(OBJS_SPAWNER)
|
spawner: $(OBJS_SPAWNER)
|
||||||
link /dll /nologo /out:$(DLL_SPAWNER) $(OBJS_SPAWNER) User32.lib
|
link /dll /nologo /out:$(DLL_SPAWNER) $(OBJS_SPAWNER) User32.lib
|
||||||
|
|
||||||
winreg: $(OBJS_WINREG)
|
|
||||||
link /dll /nologo /out:$(DLL_WINREG) $(OBJS_WINREG) Advapi32.lib
|
|
||||||
|
|
||||||
starter: $(OBJS_STARTER)
|
starter: $(OBJS_STARTER)
|
||||||
link /nologo /out:$(EXE_STARTER) $(OBJS_STARTER) Psapi.Lib Shell32.lib
|
link /nologo /out:$(EXE_STARTER) $(OBJS_STARTER) Psapi.Lib Shell32.lib
|
||||||
|
|
||||||
all: spawner winreg starter
|
all: spawner starter
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
del *.obj *.lib *.exp *.exe *.dll winreg\*.obj starter\*.obj
|
del *.obj *.lib *.exp *.exe *.dll starter\*.obj
|
||||||
|
|
||||||
rebuild: clean all
|
rebuild: clean all
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
copy *.dll $(INSTALL_DIR)
|
copy *.dll $(INSTALL_DIR)
|
||||||
copy *.exe $(INSTALL_DIR)
|
copy *.exe $(INSTALL_DIR)
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
del $(INSTALL_DIR)\*.dll $(INSTALL_DIR)\*.exe
|
del $(INSTALL_DIR)\*.dll $(INSTALL_DIR)\*.exe
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 2013
|
|
||||||
VisualStudioVersion = 12.0.31101.0
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winreg", "winreg\winreg.vcxproj", "{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Mixed Platforms = Debug|Mixed Platforms
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Mixed Platforms = Release|Mixed Platforms
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Mixed Platforms.Build.0 = Debug|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|x64.ActiveCfg = Debug|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Mixed Platforms.Build.0 = Release|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|x64.Build.0 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1 +0,0 @@
|
||||||
/winreg.tlog/
|
|
|
@ -1,31 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2015 QNX Software Systems and others.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License 2.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* https://www.eclipse.org/legal/epl-2.0/
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
BOOL APIENTRY DllMain( HMODULE hModule,
|
|
||||||
DWORD ul_reason_for_call,
|
|
||||||
LPVOID lpReserved
|
|
||||||
)
|
|
||||||
{
|
|
||||||
switch (ul_reason_for_call)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2015 QNX Software Systems and others.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License 2.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* https://www.eclipse.org/legal/epl-2.0/
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
// TODO: reference any additional headers you need in STDAFX.H
|
|
||||||
// and not in this file
|
|
|
@ -1,25 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2015 QNX Software Systems and others.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License 2.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* https://www.eclipse.org/legal/epl-2.0/
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "targetver.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
||||||
// Windows Header Files:
|
|
||||||
#include <windows.h>
|
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: reference additional headers your program requires here
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2015 QNX Software Systems and others.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License 2.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* https://www.eclipse.org/legal/epl-2.0/
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// Including SDKDDKVer.h defines the highest available Windows platform.
|
|
||||||
|
|
||||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
|
||||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
|
||||||
|
|
||||||
#include <SDKDDKVer.h>
|
|
|
@ -1,154 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2015 QNX Software Systems and others.
|
|
||||||
*
|
|
||||||
* This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License 2.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* https://www.eclipse.org/legal/epl-2.0/
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: EPL-2.0
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
static jstring getValue(JNIEnv * env, HKEY key, jstring subkey, jstring name) {
|
|
||||||
const jchar * csubkey = env->GetStringChars(subkey, NULL);
|
|
||||||
const jchar * cname = env->GetStringChars(name, NULL);
|
|
||||||
jstring result = NULL;
|
|
||||||
|
|
||||||
HKEY skey;
|
|
||||||
LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey);
|
|
||||||
if (rc == ERROR_SUCCESS) {
|
|
||||||
DWORD type;
|
|
||||||
wchar_t buffer[256];
|
|
||||||
DWORD len = sizeof(buffer);
|
|
||||||
rc = RegQueryValueEx(skey, (const wchar_t *)cname, NULL, &type, (BYTE *)&buffer, &len);
|
|
||||||
if (rc == ERROR_SUCCESS) {
|
|
||||||
result = env->NewString((jchar *) buffer, (jsize) wcslen(buffer));
|
|
||||||
}
|
|
||||||
RegCloseKey(skey);
|
|
||||||
}
|
|
||||||
|
|
||||||
env->ReleaseStringChars(subkey, csubkey);
|
|
||||||
env->ReleaseStringChars(name, cname);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValue(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jstring name)
|
|
||||||
{
|
|
||||||
return getValue(env, HKEY_LOCAL_MACHINE, subkey, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserValue(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jstring name)
|
|
||||||
{
|
|
||||||
return getValue(env, HKEY_CURRENT_USER, subkey, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static jstring getValueName(JNIEnv * env, HKEY key, jstring subkey, jint index) {
|
|
||||||
const jchar * csubkey = env->GetStringChars(subkey, NULL);
|
|
||||||
jstring result = NULL;
|
|
||||||
|
|
||||||
HKEY skey;
|
|
||||||
LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
wchar_t valueName[256];
|
|
||||||
DWORD nameSize = sizeof(valueName) + 2;
|
|
||||||
|
|
||||||
rc = RegEnumValue(skey, 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(skey);
|
|
||||||
|
|
||||||
env->ReleaseStringChars(subkey, csubkey);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValueName(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jint index)
|
|
||||||
{
|
|
||||||
return getValueName(env, HKEY_LOCAL_MACHINE, subkey, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserValueName(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jint index)
|
|
||||||
{
|
|
||||||
return getValueName(env, HKEY_CURRENT_USER, subkey, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Given a subkey (string) under HKEY_LOCAL_MACHINE, and an index (starting from 0)
|
|
||||||
* to the key's array of keys, return the name of the indexed key.
|
|
||||||
* The return value is null on any error or when the index is invalid.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static jstring getKeyName(JNIEnv * env, HKEY key, jstring subkey, jint index) {
|
|
||||||
const jchar * csubkey = env->GetStringChars(subkey, NULL);
|
|
||||||
jstring result = NULL;
|
|
||||||
|
|
||||||
HKEY skey;
|
|
||||||
LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey);
|
|
||||||
if (rc != ERROR_SUCCESS)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
wchar_t keyName[256];
|
|
||||||
DWORD nameSize = sizeof(keyName) + 2;
|
|
||||||
|
|
||||||
rc = RegEnumKeyEx(skey, index,
|
|
||||||
keyName, // UNICODE string
|
|
||||||
&nameSize,
|
|
||||||
NULL, NULL,
|
|
||||||
NULL,
|
|
||||||
NULL); // size in BYTE of data.
|
|
||||||
|
|
||||||
if (rc == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
result = env->NewString((jchar *)keyName, nameSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
RegCloseKey(skey);
|
|
||||||
|
|
||||||
env->ReleaseStringChars(subkey, csubkey);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineKeyName(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jint index)
|
|
||||||
{
|
|
||||||
return getKeyName(env, HKEY_LOCAL_MACHINE, subkey, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserKeyName(
|
|
||||||
JNIEnv * env, jobject obj, jstring subkey, jint index)
|
|
||||||
{
|
|
||||||
return getKeyName(env, HKEY_CURRENT_USER, subkey, index);
|
|
||||||
}
|
|
|
@ -1,175 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>winreg</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v120</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)..\..\org.eclipse.cdt.core.win32.x86\os\win32\x86\</OutDir>
|
|
||||||
<IntDir />
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)..\..\org.eclipse.cdt.core.win32.x86_64\os\win32\x86_64\</OutDir>
|
|
||||||
<IntDir />
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Java\jdk1.8.0_31\include;C:\Program Files\Java\jdk1.8.0_31\include\win32</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Java\jdk1.8.0_31\include;C:\Program Files\Java\jdk1.8.0_31\include\win32</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="stdafx.h" />
|
|
||||||
<ClInclude Include="targetver.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="dllmain.cpp">
|
|
||||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
|
|
||||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
|
|
||||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
</PrecompiledHeader>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="stdafx.cpp">
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="winreg.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
|
@ -1,36 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="stdafx.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="targetver.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="stdafx.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="winreg.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="dllmain.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2020 Torbjörn Svensson
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License 2.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* https://www.eclipse.org/legal/epl-2.0/
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: EPL-2.0
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Torbjörn Svensson - Initial implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.win32;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.core.natives.CNativePlugin;
|
||||||
|
import org.eclipse.cdt.utils.WindowsRegistry;
|
||||||
|
|
||||||
|
import com.sun.jna.Native;
|
||||||
|
import com.sun.jna.platform.win32.Advapi32;
|
||||||
|
import com.sun.jna.platform.win32.Advapi32Util;
|
||||||
|
import com.sun.jna.platform.win32.Advapi32Util.EnumKey;
|
||||||
|
import com.sun.jna.platform.win32.W32Errors;
|
||||||
|
import com.sun.jna.platform.win32.Win32Exception;
|
||||||
|
import com.sun.jna.platform.win32.WinNT;
|
||||||
|
import com.sun.jna.platform.win32.WinReg;
|
||||||
|
import com.sun.jna.platform.win32.WinReg.HKEY;
|
||||||
|
import com.sun.jna.platform.win32.WinReg.HKEYByReference;
|
||||||
|
import com.sun.jna.ptr.IntByReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Torbjörn Svensson
|
||||||
|
*/
|
||||||
|
public class WindowsRegistryImpl extends WindowsRegistry {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLocalMachineValue(String subkey, String name) {
|
||||||
|
return getValue(WinReg.HKEY_LOCAL_MACHINE, subkey, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLocalMachineValueName(String subkey, int index) {
|
||||||
|
return getValueName(WinReg.HKEY_LOCAL_MACHINE, subkey, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLocalMachineKeyName(String subkey, int index) {
|
||||||
|
return getKeyName(WinReg.HKEY_LOCAL_MACHINE, subkey, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCurrentUserValue(String subkey, String name) {
|
||||||
|
return getValue(WinReg.HKEY_CURRENT_USER, subkey, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCurrentUserValueName(String subkey, int index) {
|
||||||
|
return getValueName(WinReg.HKEY_CURRENT_USER, subkey, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCurrentUserKeyName(String subkey, int index) {
|
||||||
|
return getKeyName(WinReg.HKEY_CURRENT_USER, subkey, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getValue(HKEY key, String subkey, String name) {
|
||||||
|
try {
|
||||||
|
return Advapi32Util.registryGetStringValue(key, subkey, name);
|
||||||
|
} catch (Win32Exception e) {
|
||||||
|
CNativePlugin.log(String.format("Unable to get value for %s in %s", name, subkey), e); //$NON-NLS-1$
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getKeyName(HKEY key, String subkey, int index) {
|
||||||
|
try {
|
||||||
|
HKEYByReference phkKey = Advapi32Util.registryGetKey(key, subkey, WinNT.KEY_READ);
|
||||||
|
try {
|
||||||
|
EnumKey enumKey = Advapi32Util.registryRegEnumKey(phkKey.getValue(), index);
|
||||||
|
return Native.toString(enumKey.lpName);
|
||||||
|
} finally {
|
||||||
|
Advapi32Util.registryCloseKey(phkKey.getValue());
|
||||||
|
}
|
||||||
|
} catch (Win32Exception e) {
|
||||||
|
CNativePlugin.log(String.format("Unable to get keyname for %s at index %d", subkey, index), e); //$NON-NLS-1$
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getValueName(HKEY key, String subkey, int index) {
|
||||||
|
try {
|
||||||
|
HKEYByReference phkKey = Advapi32Util.registryGetKey(key, subkey, WinNT.KEY_READ);
|
||||||
|
try {
|
||||||
|
char[] lpValueName = new char[Advapi32.MAX_KEY_LENGTH];
|
||||||
|
IntByReference lpcchValueName = new IntByReference(Advapi32.MAX_KEY_LENGTH);
|
||||||
|
int rc = Advapi32.INSTANCE.RegEnumValue(phkKey.getValue(), index, lpValueName, lpcchValueName, null,
|
||||||
|
null, null, null);
|
||||||
|
|
||||||
|
if (rc != W32Errors.ERROR_SUCCESS) {
|
||||||
|
throw new Win32Exception(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Native.toString(lpValueName);
|
||||||
|
} finally {
|
||||||
|
Advapi32Util.registryCloseKey(phkKey.getValue());
|
||||||
|
}
|
||||||
|
} catch (Win32Exception e) {
|
||||||
|
CNativePlugin.log(String.format("Unable to get valuename for %s at index %d", subkey, index), e); //$NON-NLS-1$
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue