From 754341de6ab623e02e9f265fe851d11db52c3e14 Mon Sep 17 00:00:00 2001 From: jihye kim Date: Wed, 8 Aug 2012 16:15:34 +0900 Subject: [PATCH] [Title] add getting java path routine (for 64bit windows) [Type] work [Module] emulator manager [Priority] major [Jira#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] --- oslib-win32.c | 81 +++++++++++++++++++++++++++++ package/pkginfo.manifest | 2 +- tizen/src/skin/maruskin_client.c | 87 ++++++++++++++++++++++++++++++-- tizen/src/skin/maruskin_client.h | 9 +++- 4 files changed, 174 insertions(+), 5 deletions(-) diff --git a/oslib-win32.c b/oslib-win32.c index 30ce4c9395..9a0f099f84 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -33,7 +33,72 @@ #ifdef CONFIG_MARU #include "../tizen/src/skin/maruskin_client.h" + +#ifdef CONFIG_WIN32 +typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); +LPFN_ISWOW64PROCESS fnIsWow64Process; + +int is_wow64_temp(void) +{ + int result = 0; + + //IsWow64Process is not available on all supported versions of Windows. + //Use GetModuleHandle to get a handle to the DLL that contains the function + //and GetProcAddress to get a pointer to the function if available. + + fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( + GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); + + if(NULL != fnIsWow64Process) + { + if (!fnIsWow64Process(GetCurrentProcess(),&result)) + { + //handle error + //INFO("Can not find 'IsWow64Process'\n"); + } + } + return result; +} + +int get_java_path_temp(char** java_path) +{ + HKEY hKeyNew; + HKEY hKey; + //char strJavaRuntimePath[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strChoosenName[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strSubKeyName[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strJavaHome[JAVA_MAX_COMMAND_LENGTH] = {0}; + int index; + DWORD dwSubKeyNameMax = JAVA_MAX_COMMAND_LENGTH; + DWORD dwBufLen = JAVA_MAX_COMMAND_LENGTH; + + RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java Runtime Environment", 0, + KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | MY_KEY_WOW64_64KEY, &hKey); + RegEnumKeyEx(hKey, 0, (LPSTR)strSubKeyName, &dwSubKeyNameMax, NULL, NULL, NULL, NULL); + strcpy(strChoosenName, strSubKeyName); + + index = 1; + while (ERROR_SUCCESS == RegEnumKeyEx(hKey, index, (LPSTR)strSubKeyName, &dwSubKeyNameMax, + NULL, NULL, NULL, NULL)) { + if (strcmp(strChoosenName, strSubKeyName) < 0) { + strcpy(strChoosenName, strSubKeyName); + } + index++; + } + + RegOpenKeyEx(hKey, strChoosenName, 0, KEY_QUERY_VALUE | MY_KEY_WOW64_64KEY, &hKeyNew); + RegQueryValueEx(hKeyNew, "JavaHome", NULL, NULL, (LPBYTE)strJavaHome, &dwBufLen); + RegCloseKey(hKey); + if (strJavaHome[0] != '\0') { + strcpy(*java_path, strJavaHome); + strcat(*java_path, "\\bin\\java"); + } else { + return 0; + } + return 1; +} #endif +#endif // CONFIG_MARU void *qemu_oom_check(void *ptr) { @@ -44,6 +109,17 @@ void *qemu_oom_check(void *ptr) char _msg[] = "Failed to allocate memory in qemu."; char cmd[JAVA_MAX_COMMAND_LENGTH] = { 0, }; +#ifdef CONFIG_WIN32 + char* JAVA_EXEFILE_PATH = malloc(JAVA_MAX_COMMAND_LENGTH); + memset(JAVA_EXEFILE_PATH, 0, JAVA_MAX_COMMAND_LENGTH); + if (is_wow64_temp()) { + if (!get_java_path_temp(&JAVA_EXEFILE_PATH)) { + strcpy(JAVA_EXEFILE_PATH, "java"); + } + } else { + strcpy(JAVA_EXEFILE_PATH, "java"); + } +#endif int len = strlen(JAVA_EXEFILE_PATH) + strlen(JAVA_EXEOPTION) + strlen(JAR_SKINFILE_PATH) + strlen(JAVA_SIMPLEMODE_OPTION) + strlen(_msg) + 7; if (len > JAVA_MAX_COMMAND_LENGTH) { @@ -53,6 +129,11 @@ void *qemu_oom_check(void *ptr) snprintf(cmd, len, "%s %s %s %s=\"%s\"", JAVA_EXEFILE_PATH, JAVA_EXEOPTION, JAR_SKINFILE_PATH, JAVA_SIMPLEMODE_OPTION, _msg); int ret = WinExec(cmd, SW_SHOW); +#ifdef CONFIG_WIN32 + // for 64bit windows + free(JAVA_EXEFILE_PATH); + JAVA_EXEFILE_PATH=0; +#endif #endif abort(); diff --git a/package/pkginfo.manifest b/package/pkginfo.manifest index e17c139280..f89642b4c4 100644 --- a/package/pkginfo.manifest +++ b/package/pkginfo.manifest @@ -1,4 +1,4 @@ -Version: 1.3.14 +Version: 1.3.15 Maintainer: Yeong-Kyoon Lee Source: emulator diff --git a/tizen/src/skin/maruskin_client.c b/tizen/src/skin/maruskin_client.c index af62a671b9..fd8deb8f05 100644 --- a/tizen/src/skin/maruskin_client.c +++ b/tizen/src/skin/maruskin_client.c @@ -56,7 +56,6 @@ MULTI_DEBUG_CHANNEL(qemu, skin_client); #define OPT_VM_PATH "vm.path" #define OPT_NET_BASE_PORT "net.baseport" - static int skin_argc; static char** skin_argv; @@ -65,7 +64,7 @@ static void* run_skin_client(void* arg) char cmd[JAVA_MAX_COMMAND_LENGTH] = { 0, }; char argv[JAVA_MAX_COMMAND_LENGTH] = { 0, }; - INFO("run skin client\n"); + INFO("run skin client\n"); int i; for (i = 0; i < skin_argc; ++i) { strncat(argv, skin_argv[i], strlen(skin_argv[i])); @@ -81,7 +80,6 @@ static void* run_skin_client(void* arg) char* vm_path = tizen_target_path; //INFO( "vm_path:%s\n", vm_path ); - char buf_skin_server_port[16]; char buf_uid[16]; char buf_tizen_base_port[16]; @@ -89,6 +87,20 @@ static void* run_skin_client(void* arg) sprintf(buf_uid, "%d", uid); sprintf(buf_tizen_base_port, "%d", tizen_base_port); +#ifdef CONFIG_WIN32 + // find java path in 64bit windows + JAVA_EXEFILE_PATH = malloc(JAVA_MAX_COMMAND_LENGTH); + memset(JAVA_EXEFILE_PATH, 0, JAVA_MAX_COMMAND_LENGTH); + if (is_wow64()) { + INFO("This process is running under WOW64.\n"); + if (!get_java_path(&JAVA_EXEFILE_PATH)) { + strcpy(JAVA_EXEFILE_PATH, "java"); + } + } else { + strcpy(JAVA_EXEFILE_PATH, "java"); + } +#endif + int len = strlen(JAVA_EXEFILE_PATH) + strlen(JAVA_EXEOPTION) + strlen(JAR_SKINFILE_PATH) + strlen(OPT_SVR_PORT) + strlen(buf_skin_server_port) + strlen(OPT_UID) + strlen(buf_uid) + strlen(OPT_VM_PATH) + strlen(vm_path) + strlen(OPT_NET_BASE_PORT) + strlen(buf_tizen_base_port) + @@ -105,9 +117,14 @@ static void* run_skin_client(void* arg) OPT_VM_PATH, vm_path, OPT_NET_BASE_PORT, tizen_base_port, argv ); + INFO( "command for swt : %s\n", cmd ); #ifdef CONFIG_WIN32 + // for 64bit windows + free(JAVA_EXEFILE_PATH); + JAVA_EXEFILE_PATH=0; + //WinExec( cmd, SW_SHOW ); { STARTUPINFO sti = { 0 }; @@ -261,3 +278,67 @@ int start_simple_client(char* msg) { return 1; } +#ifdef CONFIG_WIN32 +typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); +LPFN_ISWOW64PROCESS fnIsWow64Process; + +int is_wow64(void) +{ + int result = 0; + + //IsWow64Process is not available on all supported versions of Windows. + //Use GetModuleHandle to get a handle to the DLL that contains the function + //and GetProcAddress to get a pointer to the function if available. + + fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( + GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); + + if(NULL != fnIsWow64Process) + { + if (!fnIsWow64Process(GetCurrentProcess(),&result)) + { + //handle error + INFO("Can not find 'IsWow64Process'\n"); + } + } + return result; +} + +int get_java_path(char** java_path) +{ + HKEY hKeyNew; + HKEY hKey; + //char strJavaRuntimePath[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strChoosenName[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strSubKeyName[JAVA_MAX_COMMAND_LENGTH] = {0}; + char strJavaHome[JAVA_MAX_COMMAND_LENGTH] = {0}; + int index; + DWORD dwSubKeyNameMax = JAVA_MAX_COMMAND_LENGTH; + DWORD dwBufLen = JAVA_MAX_COMMAND_LENGTH; + + RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java Runtime Environment", 0, + KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | MY_KEY_WOW64_64KEY, &hKey); + RegEnumKeyEx(hKey, 0, (LPSTR)strSubKeyName, &dwSubKeyNameMax, NULL, NULL, NULL, NULL); + strcpy(strChoosenName, strSubKeyName); + + index = 1; + while (ERROR_SUCCESS == RegEnumKeyEx(hKey, index, (LPSTR)strSubKeyName, &dwSubKeyNameMax, + NULL, NULL, NULL, NULL)) { + if (strcmp(strChoosenName, strSubKeyName) < 0) { + strcpy(strChoosenName, strSubKeyName); + } + index++; + } + + RegOpenKeyEx(hKey, strChoosenName, 0, KEY_QUERY_VALUE | MY_KEY_WOW64_64KEY, &hKeyNew); + RegQueryValueEx(hKeyNew, "JavaHome", NULL, NULL, (LPBYTE)strJavaHome, &dwBufLen); + RegCloseKey(hKey); + if (strJavaHome[0] != '\0') { + strcpy(*java_path, strJavaHome); + strcat(*java_path, "\\bin\\java"); + } else { + return 0; + } + return 1; +} +#endif diff --git a/tizen/src/skin/maruskin_client.h b/tizen/src/skin/maruskin_client.h index fe70768e0c..4ef18553b5 100644 --- a/tizen/src/skin/maruskin_client.h +++ b/tizen/src/skin/maruskin_client.h @@ -36,7 +36,6 @@ #define JAVA_MAX_COMMAND_LENGTH 1024 #define JAR_SKINFILE_PATH "emulator-skin.jar" -#define JAVA_EXEFILE_PATH "java" #define JAVA_LIBRARY_PATH "-Djava.library.path" #ifndef CONFIG_DARWIN @@ -46,6 +45,14 @@ #endif #define JAVA_SIMPLEMODE_OPTION "simple.msg" +#ifdef CONFIG_WIN32 +#define MY_KEY_WOW64_64KEY 0x0100 +int is_wow64(void); +int get_java_path(char**); +static char* JAVA_EXEFILE_PATH = 0; +#else +#define JAVA_EXEFILE_PATH "java" +#endif int start_skin_client(int argc, char* argv[]); int start_simple_client(char* msg); -- 2.34.1