[Title] add getting java path routine (for 64bit windows)
authorjihye kim <jihye1128.kim@samsung.com>
Wed, 8 Aug 2012 07:15:34 +0000 (16:15 +0900)
committerjihye kim <jihye1128.kim@samsung.com>
Wed, 8 Aug 2012 07:15:34 +0000 (16:15 +0900)
[Type] work
[Module] emulator manager
[Priority] major
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

oslib-win32.c
package/pkginfo.manifest
tizen/src/skin/maruskin_client.c
tizen/src/skin/maruskin_client.h

index 30ce4c93958cf993f979ad65ce813e2bd5587b22..9a0f099f8423016cdd3fd19048c315505e961a2c 100644 (file)
 
 #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();
index e17c1392807fa3f4adb330c7f45508cf4680f093..f89642b4c4a09fba7759f2c269e88f324cf6796a 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.3.14
+Version: 1.3.15
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index af62a671b9841709bcea054b071c456c0d15a6fd..fd8deb8f0531d5c023c5a1733faf0b4ffbe72f78 100644 (file)
@@ -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
index fe70768e0c92238bac58e30a85bf3aa7ec35a174..4ef18553b557e89ebeff003ff308c6ea2ea71beb 100644 (file)
@@ -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
 #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);