src/windows/native/java/lang/ProcessImpl_md.c

Print this page

        

*** 61,110 **** return source; *p = 0; return source; } DWORD selectProcessFlag(JNIEnv *env, jstring cmd0) { - char buf[MAX_PATH]; DWORD newFlag = 0; ! char *exe, *p, *name; ! unsigned char buffer[2]; ! long headerLoc = 0; ! int fd = 0; ! ! exe = (char *)JNU_GetStringPlatformChars(env, cmd0, 0); exe = extractExecutablePath(env, exe); - if (exe != NULL) { ! if ((p = strchr(exe, '\\')) == NULL) { ! SearchPath(NULL, exe, ".exe", MAX_PATH, buf, &name); } else { - p = strrchr(exe, '\\'); *p = 0; ! p++; ! SearchPath(exe, p, ".exe", MAX_PATH, buf, &name); } } ! fd = _open(buf, _O_RDONLY); ! if (fd > 0) { ! _read(fd, buffer, 2); ! if (buffer[0] == 'M' && buffer[1] == 'Z') { ! _lseek(fd, 60L, SEEK_SET); ! _read(fd, buffer, 2); ! headerLoc = (long)buffer[1] << 8 | (long)buffer[0]; ! _lseek(fd, headerLoc, SEEK_SET); ! _read(fd, buffer, 2); ! if (buffer[0] == 'P' && buffer[1] == 'E') { newFlag = DETACHED_PROCESS; } } _close(fd); } JNU_ReleaseStringPlatformChars(env, cmd0, exe); return newFlag; } static void win32Error(JNIEnv *env, const char *functionName) --- 61,116 ---- return source; *p = 0; return source; } + static const char EXE_EXT[] = ".exe"; + DWORD selectProcessFlag(JNIEnv *env, jstring cmd0) { DWORD newFlag = 0; ! char *exe = (char *)JNU_GetStringPlatformChars(env, cmd0, 0); ! if (exe != NULL) { ! char buf[MAX_PATH]; ! char *name; ! DWORD len; exe = extractExecutablePath(env, exe); if (exe != NULL) { ! /*we are here for Win9x/Me, so the [/] is not the path sep*/ ! char *p = strrchr(exe, '\\'); ! if (p == NULL) { ! len = SearchPath(NULL, exe, EXE_EXT, MAX_PATH, buf, &name); } else { *p = 0; ! len = SearchPath(exe, p + 1, EXE_EXT, MAX_PATH, buf, &name); } } ! if (len > 0 && len < MAX_PATH) { ! /*here the [buf] path is null terminated*/ ! int fd = _open(buf, _O_RDONLY); ! if (fd != -1) { ! unsigned char buffer[2]; ! if (_read(fd, buffer, 2) == 2 ! && buffer[0] == 'M' && buffer[1] == 'Z' ! && _lseek(fd, 60L, SEEK_SET) == 60L ! && _read(fd, buffer, 2) == 2) ! { ! long headerLoc = (long)buffer[1] << 8 | (long)buffer[0]; ! if (_lseek(fd, headerLoc, SEEK_SET) == headerLoc ! && _read(fd, buffer, 2) == 2 ! && buffer[0] == 'P' && buffer[1] == 'E') ! { newFlag = DETACHED_PROCESS; } } _close(fd); } + } JNU_ReleaseStringPlatformChars(env, cmd0, exe); + } return newFlag; } static void win32Error(JNIEnv *env, const char *functionName)