BOOL isJrePathOk(const char* path) { if (!*path) { return FALSE; } char javaw[_MAX_PATH]; strcpy(javaw, path); appendJavaw(javaw); return _stat(javaw, &statBuf) == 0; }
BOOL isJrePathOk(const char* path) { char javaw[_MAX_PATH]; BOOL result = FALSE; if (*path) { strcpy(javaw, path); appendJavaw(javaw); result = _stat(javaw, &statBuf) == 0; } debug("Check launcher:\t%s %s\n", javaw, result ? "(OK)" : "(n/a)"); return result; }
BOOL isLauncherPathValid(const char* path) { char javaw[_MAX_PATH] = {0}; BOOL result = FALSE; if (*path) { strcpy(javaw, path); appendJavaw(javaw); result = _stat(javaw, &statBuf) == 0; if (!result) { // Don't display additional info in the error popup. SetLastError(0); } } debug("Check launcher:\t%s %s\n", javaw, result ? "(OK)" : "(not found)"); return result; }
void appendLauncher(const BOOL setProcName, char* exePath, const int pathLen, char* cmd) { if (setProcName) { char tmpspec[_MAX_PATH]; char tmpfile[_MAX_PATH]; strcpy(tmpspec, cmd); strcat(tmpspec, LAUNCH4J_TMP_DIR); tmpspec[strlen(tmpspec) - 1] = 0; if (_stat(tmpspec, &statBuf) == 0) { // Remove temp launchers and manifests struct _finddata_t c_file; long hFile; appendPath(tmpspec, "*.exe"); strcpy(tmpfile, cmd); strcat(tmpfile, LAUNCH4J_TMP_DIR); char* filename = tmpfile + strlen(tmpfile); if ((hFile = _findfirst(tmpspec, &c_file)) != -1L) { do { strcpy(filename, c_file.name); debug("Unlink:\t\t%s\n", tmpfile); _unlink(tmpfile); strcat(tmpfile, MANIFEST); debug("Unlink:\t\t%s\n", tmpfile); _unlink(tmpfile); } while (_findnext(hFile, &c_file) == 0); } _findclose(hFile); } else { if (_mkdir(tmpspec) != 0) { debug("Mkdir failed:\t%s\n", tmpspec); appendJavaw(cmd); return; } } char javaw[_MAX_PATH]; strcpy(javaw, cmd); appendJavaw(javaw); strcpy(tmpfile, cmd); strcat(tmpfile, LAUNCH4J_TMP_DIR); char* tmpfilename = tmpfile + strlen(tmpfile); char* exeFilePart = exePath + pathLen + 1; // Copy manifest char manifest[_MAX_PATH] = {0}; strcpy(manifest, exePath); strcat(manifest, MANIFEST); if (_stat(manifest, &statBuf) == 0) { strcat(tmpfile, exeFilePart); strcat(tmpfile, MANIFEST); debug("Copy:\t\t%s -> %s\n", manifest, tmpfile); CopyFile(manifest, tmpfile, FALSE); } // Copy launcher strcpy(tmpfilename, exeFilePart); debug("Copy:\t\t%s -> %s\n", javaw, tmpfile); if (CopyFile(javaw, tmpfile, FALSE)) { strcpy(cmd, tmpfile); return; } else if (_stat(javaw, &statBuf) == 0) { long fs = statBuf.st_size; if (_stat(tmpfile, &statBuf) == 0 && fs == statBuf.st_size) { debug("Reusing:\t\t%s\n", tmpfile); strcpy(cmd, tmpfile); return; } } } appendJavaw(cmd); }
int prepare(const char *lpCmdLine) { char tmp[MAX_ARGS] = {0}; hModule = GetModuleHandle(NULL); if (hModule == NULL) { return FALSE; } // Get executable path char exePath[_MAX_PATH] = {0}; int pathLen = getExePath(exePath); if (pathLen == -1) { return FALSE; } if (!initializeLogging(lpCmdLine, exePath, pathLen)) { return FALSE; } debug("\n\nVersion:\t%s\n", VERSION); debug("CmdLine:\t%s %s\n", exePath, lpCmdLine); setWow64Flag(); // Set default error message, title and optional support web site url. loadString(SUPPORT_URL, errUrl); loadString(ERR_TITLE, errTitle); if (!loadString(STARTUP_ERR, errMsg)) { debug(ERROR_FORMAT, "Startup error message not defined."); return FALSE; } // Single instance loadString(MUTEX_NAME, mutexName); if (*mutexName) { SECURITY_ATTRIBUTES security; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.bInheritHandle = TRUE; security.lpSecurityDescriptor = NULL; CreateMutexA(&security, FALSE, mutexName); if (GetLastError() == ERROR_ALREADY_EXISTS) { debug(ERROR_FORMAT, "Instance already exists."); return ERROR_ALREADY_EXISTS; } } // Working dir char tmp_path[_MAX_PATH] = {0}; GetCurrentDirectory(_MAX_PATH, oldPwd); if (loadString(CHDIR, tmp_path)) { strncpy(workingDir, exePath, pathLen); appendPath(workingDir, tmp_path); _chdir(workingDir); debug("Working dir:\t%s\n", workingDir); } // Use bundled jre or find java if (loadString(JRE_PATH, tmp_path)) { char jrePath[MAX_ARGS] = {0}; expandVars(jrePath, tmp_path, exePath, pathLen); debug("Bundled JRE:\t%s\n", jrePath); if (jrePath[0] == '\\' || jrePath[1] == ':') { // Absolute strcpy(cmd, jrePath); } else { // Relative strncpy(cmd, exePath, pathLen); appendPath(cmd, jrePath); } if (isLauncherPathValid(cmd)) { foundJava = (wow64 && loadBool(BUNDLED_JRE_64_BIT)) ? FOUND_BUNDLED | KEY_WOW64_64KEY : FOUND_BUNDLED; } } if (foundJava == NO_JAVA_FOUND) { if (!loadString(JAVA_MIN_VER, javaMinVer)) { loadString(BUNDLED_JRE_ERR, errMsg); return FALSE; } loadString(JAVA_MAX_VER, javaMaxVer); if (!findJavaHome(cmd, loadInt(JDK_PREFERENCE))) { loadString(JRE_VERSION_ERR, errMsg); strcat(errMsg, " "); strcat(errMsg, javaMinVer); if (*javaMaxVer) { strcat(errMsg, " - "); strcat(errMsg, javaMaxVer); } if (runtimeBits == USE_64_BIT_RUNTIME || runtimeBits == USE_32_BIT_RUNTIME) { strcat(errMsg, " ("); strcat(errMsg, runtimeBits == USE_64_BIT_RUNTIME ? "64" : "32"); strcat(errMsg, "-bit)"); } if (corruptedJreFound) { char launcherErrMsg[BIG_STR] = {0}; if (loadString(LAUNCHER_ERR, launcherErrMsg)) { strcat(errMsg, "\n"); strcat(errMsg, launcherErrMsg); } } loadString(DOWNLOAD_URL, errUrl); return FALSE; } } // Store the JRE Home Dir strcpy(jreHomeDir, cmd); // Append a path to the Path environment variable char jreBinPath[_MAX_PATH] = {0}; strcpy(jreBinPath, cmd); strcat(jreBinPath, "\\bin"); if (!appendToPathVar(jreBinPath)) { debug(ERROR_FORMAT, "appendToPathVar failed."); return FALSE; } // Set environment variables char envVars[MAX_VAR_SIZE] = {0}; loadString(ENV_VARIABLES, envVars); char *var = strtok(envVars, "\t"); while (var != NULL) { char *varValue = strchr(var, '='); *varValue++ = 0; *tmp = 0; expandVars(tmp, varValue, exePath, pathLen); debug("Set var:\t%s = %s\n", var, tmp); SetEnvironmentVariable(var, tmp); var = strtok(NULL, "\t"); } *tmp = 0; // Process priority priority = loadInt(PRIORITY_CLASS); // Launcher appendJavaw(cmd); // Heap sizes appendHeapSizes(args); // JVM options char jvmOptions[MAX_ARGS] = {0}; setJvmOptions(jvmOptions, exePath); // Expand environment %variables% expandVars(args, jvmOptions, exePath, pathLen); // MainClass + Classpath or Jar char mainClass[STR] = {0}; char jar[_MAX_PATH] = {0}; const BOOL wrapper = loadBool(WRAPPER); loadString(JAR, jar); if (loadString(MAIN_CLASS, mainClass)) { if (!loadString(CLASSPATH, tmp)) { debug("Info:\t\tClasspath not defined.\n"); } char exp[MAX_ARGS] = {0}; expandVars(exp, tmp, exePath, pathLen); strcat(args, "-classpath \""); if (wrapper) { appendAppClasspath(args, exePath); } else if (*jar) { appendAppClasspath(args, jar); } // Deal with wildcards or >> strcat(args, exp); << char* cp = strtok(exp, ";"); while(cp != NULL) { debug("Add classpath:\t%s\n", cp); if (strpbrk(cp, "*?") != NULL) { int len = strrchr(cp, '\\') - cp + 1; strncpy(tmp_path, cp, len); char* filename = tmp_path + len; *filename = 0; struct _finddata_t c_file; long hFile; if ((hFile = _findfirst(cp, &c_file)) != -1L) { do { strcpy(filename, c_file.name); appendAppClasspath(args, tmp_path); debug(" \" :\t%s\n", tmp_path); } while (_findnext(hFile, &c_file) == 0); } _findclose(hFile); } else { appendAppClasspath(args, cp); } cp = strtok(NULL, ";"); } *(args + strlen(args) - 1) = 0; strcat(args, "\" "); strcat(args, mainClass); } else if (wrapper) { strcat(args, "-jar \""); strcat(args, exePath); strcat(args, "\""); } else { strcat(args, "-jar \""); strncat(args, exePath, pathLen); appendPath(args, jar); strcat(args, "\""); } // Constant command line args if (loadString(CMD_LINE, tmp)) { strcat(args, " "); strcat(args, tmp); } // Command line args if (*lpCmdLine) { strcpy(tmp, lpCmdLine); char* dst; while ((dst = strstr(tmp, "--l4j-")) != NULL) { char* src = strchr(dst, ' '); if (src == NULL || *(src + 1) == 0) { *dst = 0; } else { strcpy(dst, src + 1); } } if (*tmp) { strcat(args, " "); strcat(args, tmp); } } debug("Launcher:\t%s\n", cmd); debug("Launcher args:\t%s\n", args); debug("Args length:\t%d/32768 chars\n", strlen(args)); return TRUE; }