diff --git a/src/modules/Java/Makefile.in b/src/modules/Java/Makefile.in index dcf7a6d5716a1daca396ad8e85c2ae2203c74d4c..9bfb8fc064c62da562de148200a0015e558c0c96 100644 --- a/src/modules/Java/Makefile.in +++ b/src/modules/Java/Makefile.in @@ -9,3 +9,5 @@ CONFIG_HEADERS=@CONFIG_HEADERS@ @dynamic_module_makefile@ @dependencies@ + +jvm.o: ntdl.c diff --git a/src/modules/Java/configure.in b/src/modules/Java/configure.in index 4f2c14c29d83a36752a7b10d62650e2cc8600b99..679ae1f5027299ba69c76649c4aeaf7bea4a6bd7 100644 --- a/src/modules/Java/configure.in +++ b/src/modules/Java/configure.in @@ -464,7 +464,6 @@ if test "x$with_java" = xyes; then #include <setjmp.h> #endif #include <stdio.h> -#define CONFIGURE #ifdef __NT__ #include <windows.h> #include "ntdl.c" diff --git a/src/modules/Java/jvm.c b/src/modules/Java/jvm.c index 32fea522bbe160440fc6133405a995974edcadd1..8c7e1d9f4672493f66ae0624c9d889723517590b 100644 --- a/src/modules/Java/jvm.c +++ b/src/modules/Java/jvm.c @@ -3854,14 +3854,25 @@ PIKE_MODULE_INIT { #ifdef HAVE_JAVA struct svalue prog; - SET_SVAL_TYPE(prog, PIKE_T_PROGRAM); - SET_SVAL_SUBTYPE(prog, 0); #ifdef __NT__ - if (open_nt_dll()<0) + switch(open_nt_dll()) { + case 0: break; + case -1: + yywarning("Failed to load JVM.\n"); + return; + case -2: + yywarning("Failed to create JVM.\n"); + return; + default: + yywarning("Failed to initialize the JVM library.\n"); return; + } #endif /* __NT__ */ + SET_SVAL_TYPE(prog, PIKE_T_PROGRAM); + SET_SVAL_SUBTYPE(prog, 0); + #ifdef HAVE_IBMFINDDLL { /* Debug... */ diff --git a/src/modules/Java/ntdl.c b/src/modules/Java/ntdl.c index b1b7931ca744f7a896ea47b71209c0f3f35472b3..ed8fe6f1c1a0e8b53355a747da6f84b8b07c947e 100644 --- a/src/modules/Java/ntdl.c +++ b/src/modules/Java/ntdl.c @@ -12,9 +12,6 @@ */ #include <tchar.h> -#ifndef CONFIGURE -#include "program.h" -#endif #define JNI_CreateJavaVM createjavavm typedef jint (JNICALL *createjavavmtype)(JavaVM **, void **, void *); @@ -23,50 +20,49 @@ static HINSTANCE jvmdll = NULL; static int open_nt_dll(void) { - LPTSTR libname=_T("jvm"); - LPCTSTR keyname=_T("SOFTWARE\\JavaSoft\\Java Runtime Environment"); + WCHAR buffer[2*MAX_PATH+32] = L"jvm"; + WCHAR keyname[] = L"SOFTWARE\\JavaSoft\\Java Runtime Environment"; HKEY key; - TCHAR buffer[2*MAX_PATH+32]; - DWORD type, len = sizeof(buffer)-16; + WCHAR *libname = buffer; + DWORD type, len = sizeof(buffer)/2; DWORD l; HINSTANCE kernel; - DWORD (*getdlldir)(DWORD nBufferLength, LPTSTR lpBuffer); - BOOL (*setdlldir)(LPCTSTR lpPathname); + DWORD (WINAPI *getdlldir)(DWORD nBufferLength, WCHAR *lpBuffer) = NULL; + BOOL (WINAPI *setdlldir)(WCHAR *lpPathname) = NULL; - l = GetEnvironmentVariable("PIKE_JRE_JVMDLL", buffer, len); + l = GetEnvironmentVariableW(L"PIKE_JRE_JVMDLL", buffer, len); if (l > 0) { - libname = buffer; len = l; } - else if(RegOpenKeyEx(HKEY_CURRENT_USER, keyname, 0, - KEY_READ, &key) == ERROR_SUCCESS || - RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, - KEY_READ, &key) == ERROR_SUCCESS) { - LPCTSTR subkeyname=_T("1.2"); + else if(RegOpenKeyExW(HKEY_CURRENT_USER, keyname, 0, + KEY_READ, &key) == ERROR_SUCCESS || + RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyname, 0, + KEY_READ, &key) == ERROR_SUCCESS) { + WCHAR *subkeyname = L"1.2"; HKEY subkey; - if(ERROR_SUCCESS == RegQueryValueEx(key, _T("CurrentVersion"), 0, - &type, buffer, &len) && - type == REG_SZ) + if(ERROR_SUCCESS == RegQueryValueExW(key, L"CurrentVersion", 0, + &type, buffer, &len) && + type == REG_SZ) { subkeyname = buffer; - - if(RegOpenKeyEx(key, subkeyname, 0, KEY_READ, &subkey) == + } + + if(RegOpenKeyExW(key, subkeyname, 0, KEY_READ, &subkey) == ERROR_SUCCESS) { - + len = sizeof(buffer)-16; - if(ERROR_SUCCESS == RegQueryValueEx(subkey, _T("RuntimeLib"), 0, - &type, buffer, &len)) + if(ERROR_SUCCESS == RegQueryValueExW(subkey, L"RuntimeLib", 0, + &type, buffer, &len)) switch(type) { case REG_SZ: - libname = buffer; + len /= sizeof(*buffer); break; case REG_EXPAND_SZ: { - LPTSTR subbuffer = buffer+((len+1)/sizeof(TCHAR)); - l = ExpandEnvironmentStrings(buffer, subbuffer, - sizeof(buffer)-len-2); - if(l && l <= sizeof(buffer)-len-2) { + WCHAR *subbuffer = buffer + MAX_PATH + 16; + l = ExpandEnvironmentStringsW(buffer, subbuffer, MAX_PATH + 16); + if(l && l <= MAX_PATH + 16) { libname = subbuffer; len = l; } @@ -76,6 +72,8 @@ static int open_nt_dll(void) RegCloseKey(subkey); } RegCloseKey(key); + } else { + len = wcslen(buffer); } /* Java 6 and 7 jvm.dll have dependencies on msvcr71.dll and msvcr100.dll @@ -87,9 +85,15 @@ static int open_nt_dll(void) * from the registry to "C:\Program Files\Java\jre\bin", and call * SetDllDirectory() with it. */ - kernel = GetModuleHandle("kernel32"); - getdlldir = (void *)GetProcAddress(kernel, "GetDllDirectoryA"); - setdlldir = (void *)GetProcAddress(kernel, "SetDllDirectoryA"); + kernel = GetModuleHandle(_T("kernel32")); + getdlldir = (void *)GetProcAddress(kernel, "GetDllDirectoryW"); + setdlldir = (void *)GetProcAddress(kernel, "SetDllDirectoryW"); + + if (!setdlldir) { + /* Fallback to {Get,Set}CurrentDirectoryW(). */ + getdlldir = GetCurrentDirectoryW; + setdlldir = SetCurrentDirectoryW; + } if (setdlldir) { int cnt = 0; @@ -101,8 +105,8 @@ static int open_nt_dll(void) } } if (cnt == 2) { - TCHAR dlldirbuffer[2*MAX_PATH]; - LPTSTR origdlldir = NULL; + WCHAR dlldirbuffer[MAX_PATH + 16]; + WCHAR *origdlldir = NULL; libname[l] = 0; @@ -114,7 +118,7 @@ static int open_nt_dll(void) * directories from the dlldir load path if * it has been used. */ - if ((len = getdlldir(2*MAX_PATH, dlldirbuffer))) { + if ((len = getdlldir(MAX_PATH + 16, dlldirbuffer))) { dlldirbuffer[len] = 0; origdlldir = dlldirbuffer; } @@ -125,23 +129,20 @@ static int open_nt_dll(void) /* Restore the zapped diretory separator. */ libname[l] = '\\'; - jvmdll = LoadLibrary(libname); + jvmdll = LoadLibraryW(libname); /* Restore the original dlldir load path. */ setdlldir(origdlldir); } else { /* Not enough directory levels. */ - jvmdll = LoadLibrary(libname); + jvmdll = LoadLibraryW(libname); } } else { /* No SetDllDirectory(). */ - jvmdll = LoadLibrary(libname); + jvmdll = LoadLibraryW(libname); } if (!jvmdll) { -#ifndef CONFIGURE - yywarning("Failed to load JVM: '%s'\n", libname); -#endif return -1; } else { @@ -151,9 +152,6 @@ static int open_nt_dll(void) else { if(FreeLibrary(jvmdll)) jvmdll = NULL; -#ifndef CONFIGURE - yywarning("Failed to create JVM.\n"); -#endif return -2; } }