mirror of https://github.com/rusefi/RomRaider.git
Created a new J2534DllLocator class based on JNA and removed third-party
registry Jar
This commit is contained in:
parent
c44fd356a8
commit
6fe30d2c22
|
@ -2,7 +2,6 @@
|
|||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="lib" path="lib/common/registry.jar"/>
|
||||
<classpathentry kind="lib" path="lib/common/com4j.jar"/>
|
||||
<classpathentry kind="lib" path="lib/windows/j3dcore.jar"/>
|
||||
<classpathentry kind="lib" path="lib/windows/j3dutils.jar"/>
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||
* Copyright (C) 2006-2012 RomRaider.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package com.romraider.io.j2534.api;
|
||||
|
||||
import static com.sun.jna.platform.win32.WinError.ERROR_SUCCESS;
|
||||
import static com.sun.jna.platform.win32.WinReg.HKEY_LOCAL_MACHINE;
|
||||
import static org.apache.log4j.Logger.getLogger;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.platform.win32.Advapi32;
|
||||
import com.sun.jna.platform.win32.WinBase.FILETIME;
|
||||
import com.sun.jna.platform.win32.WinReg.HKEY;
|
||||
import com.sun.jna.platform.win32.WinReg.HKEYByReference;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
|
||||
/**
|
||||
* Discover all the J2534 device installations on the local computer from
|
||||
* keys and value settings in the Windows registry. Return a List of
|
||||
* J2534Library instances.
|
||||
* @see J2534Library
|
||||
*/
|
||||
public class J2534DllLocator {
|
||||
private static final Logger LOGGER = getLogger(J2534DllLocator.class);
|
||||
private static final String ISO9141 = "ISO9141";
|
||||
private static final String FUNCTIONLIBRARY = "FunctionLibrary";
|
||||
private static final int KEY_READ = 0x20019;
|
||||
private static final int ERROR_NO_MORE_ITEMS = 0x103;
|
||||
private static Advapi32 advapi32 = Advapi32.INSTANCE;
|
||||
|
||||
public static Set<J2534Library> ListLibraries() throws Exception {
|
||||
Set<J2534Library> libraries = new HashSet<J2534Library>();
|
||||
HKEY hklm = HKEY_LOCAL_MACHINE;
|
||||
String passThru = "SOFTWARE\\PassThruSupport.04.04";
|
||||
HKEYByReference passThruHandle = getHandle(hklm, passThru);
|
||||
|
||||
List<String> vendors = getKeys(passThruHandle.getValue());
|
||||
for (String vendor : vendors) {
|
||||
HKEYByReference vendorKey =
|
||||
getHandle(passThruHandle.getValue(), vendor);
|
||||
int supported = getDWord(vendorKey.getValue(), ISO9141);
|
||||
if (supported == 0 ) continue;
|
||||
String library = getSZ(vendorKey.getValue(), FUNCTIONLIBRARY);
|
||||
LOGGER.debug(String.format("Vendor:%s | Library:%s",
|
||||
vendor, library));
|
||||
libraries.add(new J2534Library(vendor, library));
|
||||
advapi32.RegCloseKey(vendorKey.getValue());
|
||||
}
|
||||
advapi32.RegCloseKey(passThruHandle.getValue());
|
||||
return libraries;
|
||||
}
|
||||
|
||||
private static HKEYByReference getHandle(HKEY hKey, String lpSubKey)
|
||||
throws Exception {
|
||||
|
||||
HKEYByReference phkResult = new HKEYByReference();
|
||||
int ret = advapi32.RegOpenKeyEx(
|
||||
hKey,
|
||||
lpSubKey,
|
||||
0,
|
||||
KEY_READ,
|
||||
phkResult);
|
||||
|
||||
if(ret != ERROR_SUCCESS) {
|
||||
handleError("RegOpenKeyEx", ret);
|
||||
}
|
||||
return phkResult;
|
||||
}
|
||||
|
||||
private static int reverse(byte[] bytes, int size) {
|
||||
ByteBuffer b = ByteBuffer.wrap(bytes, 0, size);
|
||||
return b.order(ByteOrder.LITTLE_ENDIAN).getInt();
|
||||
}
|
||||
|
||||
private static void handleError(String operation, int status)
|
||||
throws Exception {
|
||||
|
||||
String errString = String.format("%s error [%d]%n",
|
||||
operation, status);
|
||||
throw new Exception(errString);
|
||||
}
|
||||
|
||||
private static List<String> getKeys(HKEY hkey)
|
||||
throws Exception {
|
||||
|
||||
int dwIndex = 0;
|
||||
List<String> vendors = new ArrayList<String>();
|
||||
int ret = 0;
|
||||
do {
|
||||
char[] lpName = new char[255];
|
||||
IntByReference lpcName = new IntByReference(-1);
|
||||
IntByReference lpReserved = null;
|
||||
char[] lpClass = new char[255];
|
||||
IntByReference lpcClass = new IntByReference(-1);
|
||||
FILETIME lpftLastWriteTime = new FILETIME();
|
||||
ret = advapi32.RegEnumKeyEx(
|
||||
hkey,
|
||||
dwIndex,
|
||||
lpName,
|
||||
lpcName,
|
||||
lpReserved,
|
||||
lpClass,
|
||||
lpcClass,
|
||||
lpftLastWriteTime);
|
||||
|
||||
switch (ret) {
|
||||
case ERROR_SUCCESS:
|
||||
dwIndex++;
|
||||
vendors.add(Native.toString(lpName));
|
||||
break;
|
||||
case ERROR_NO_MORE_ITEMS:
|
||||
break;
|
||||
default:
|
||||
handleError("RegEnumKeyEx", ret);
|
||||
}
|
||||
} while(ret == ERROR_SUCCESS);
|
||||
return vendors;
|
||||
}
|
||||
|
||||
private static int getDWord(HKEY hkey, String valueName)
|
||||
throws Exception {
|
||||
|
||||
IntByReference lpType = new IntByReference(-1);
|
||||
byte[] lpData = new byte[16];
|
||||
IntByReference lpcbData = new IntByReference(-1);
|
||||
int ret = advapi32.RegQueryValueEx(
|
||||
hkey,
|
||||
valueName,
|
||||
0,
|
||||
lpType,
|
||||
lpData,
|
||||
lpcbData);
|
||||
if(ret != ERROR_SUCCESS) {
|
||||
String errString = String.format("DWORD_RegQueryValueEx(%s)",
|
||||
valueName);
|
||||
handleError(errString, ret);
|
||||
}
|
||||
int dword = reverse(lpData, lpcbData.getValue());
|
||||
return dword;
|
||||
}
|
||||
|
||||
private static String getSZ(HKEY hkey, String valueName)
|
||||
throws Exception {
|
||||
|
||||
IntByReference lpType = new IntByReference(-1);
|
||||
char[] lpData = new char[1024];
|
||||
IntByReference lpcbData = new IntByReference(-1);
|
||||
int ret = advapi32.RegQueryValueEx(
|
||||
hkey,
|
||||
valueName,
|
||||
0,
|
||||
lpType,
|
||||
lpData,
|
||||
lpcbData);
|
||||
if(ret != ERROR_SUCCESS) {
|
||||
String errString = String.format("SZ_RegQueryValueEx(%s)",
|
||||
valueName);
|
||||
handleError(errString, ret);
|
||||
}
|
||||
return Native.toString(lpData);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* RomRaider Open-Source Tuning, Logging and Reflashing
|
||||
* Copyright (C) 2006-2012 RomRaider.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
package com.romraider.io.j2534.api;
|
||||
|
||||
/**
|
||||
* Each class instance holds the Vendor and Library details for a J2534
|
||||
* installed device. These are discovered on the local computer from
|
||||
* keys and value settings in the Windows registry.
|
||||
* @see J2534DllLocator
|
||||
*/
|
||||
public class J2534Library {
|
||||
private String vendor;
|
||||
private String library;
|
||||
|
||||
/**
|
||||
* Create a new instance of a J2534 library detail.
|
||||
* @param vendor - J2534 vendor string
|
||||
* @param library - J2534 library path
|
||||
*/
|
||||
public J2534Library(String vendor, String library) {
|
||||
this.vendor = vendor;
|
||||
this.library = library;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the vendor of this library detail instance.
|
||||
* @return the vendor
|
||||
*/
|
||||
public String getVendor() {
|
||||
return vendor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the fully qualified library path of this library detail instance.
|
||||
* @return the library
|
||||
*/
|
||||
public String getLibrary() {
|
||||
return library;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue