X-Git-Url: http://review.tizen.org/git/?p=sdk%2Femulator%2Fqemu.git;a=blobdiff_plain;f=oslib-win32.c;h=dc7adba22adf636141d5681b2654874733b51d4e;hp=ab29eae45ce3f58da3fe25c5bb3c31b37b4ebeab;hb=5b17056e3d5c144103dd2c3d71466482093bfa8c;hpb=df8b863e2f7219eb3356ecc12635811241e38aad diff --git a/oslib-win32.c b/oslib-win32.c index ab29eae..dc7adba 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -28,13 +28,116 @@ #include #include "config-host.h" #include "sysemu.h" +#include "main-loop.h" #include "trace.h" #include "qemu_socket.h" +#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') { + sprintf(*java_path, "\"%s\\bin\\java\"", strJavaHome); + //strcpy(*java_path, strJavaHome); + //strcat(*java_path, "\\bin\\java"); + } else { + return 0; + } + return 1; +} +#endif +#endif // CONFIG_MARU + void *qemu_oom_check(void *ptr) { if (ptr == NULL) { fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError()); + +#ifdef CONFIG_MARU + 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) + + strlen(JAVA_SIMPLEMODE_OPTION) + strlen(_msg) + 7; + if (len > JAVA_MAX_COMMAND_LENGTH) { + len = JAVA_MAX_COMMAND_LENGTH; + } + + snprintf(cmd, len, "%s %s %s %s=\"%s\"", + JAVA_EXEFILE_PATH, JAVA_EXEOPTION, JAR_SKINFILE, 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(); } return ptr; @@ -73,10 +176,18 @@ void qemu_vfree(void *ptr) VirtualFree(ptr, 0, MEM_RELEASE); } +void socket_set_block(int fd) +{ + unsigned long opt = 0; + WSAEventSelect(fd, NULL, 0); + ioctlsocket(fd, FIONBIO, &opt); +} + void socket_set_nonblock(int fd) { unsigned long opt = 1; ioctlsocket(fd, FIONBIO, &opt); + qemu_fd_register(fd); } int inet_aton(const char *cp, struct in_addr *ia) @@ -93,13 +204,6 @@ void qemu_set_cloexec(int fd) { } -/* mingw32 needs ffs for compilations without optimization. */ -int ffs(int i) -{ - /* Use gcc's builtin ffs. */ - return __builtin_ffs(i); -} - /* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */ #define _W32_FT_OFFSET (116444736000000000ULL) @@ -119,3 +223,8 @@ int qemu_gettimeofday(qemu_timeval *tp) Do not set errno on error. */ return 0; } + +int qemu_get_thread_id(void) +{ + return GetCurrentThreadId(); +}